From 59e9030f4981d28414e2090bf92cafd0528d8b3b Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 00:30:11 +0000 Subject: [PATCH] [automated] update groups.io wiki --- ...tion-0fdc8fb7b212ef119ea05f76b6c42703.css} | 3206 +++++++++++++---- groups.io/g/MTFHRT/wiki/29602.html | 889 +++-- .../wiki/{30843/171363 => 29602/165198} | 0 groups.io/g/MTFHRT/wiki/29602/165198.html | 1163 ------ .../wiki/{30843/171364 => 29602/165219} | 0 groups.io/g/MTFHRT/wiki/29602/165219.html | 1163 ------ .../wiki/{30843/171365 => 29602/165250} | 0 groups.io/g/MTFHRT/wiki/29602/165250.html | 1164 ------ .../wiki/{30843/171431 => 29602/165437} | 0 groups.io/g/MTFHRT/wiki/29602/165437.html | 1164 ------ .../wiki/{30843/171432 => 29602/165467} | 0 groups.io/g/MTFHRT/wiki/29602/165467.html | 1164 ------ .../wiki/{32288/175560 => 29602/165469} | 0 groups.io/g/MTFHRT/wiki/29602/165469.html | 1164 ------ .../wiki/{34293/189320 => 29602/165470} | 0 groups.io/g/MTFHRT/wiki/29602/165470.html | 1164 ------ .../wiki/{34293/189648 => 29602/165530} | 0 groups.io/g/MTFHRT/wiki/29602/165530.html | 1164 ------ .../wiki/{34293/201261 => 29602/165664} | 0 groups.io/g/MTFHRT/wiki/29602/165664.html | 1164 ------ .../wiki/{34293/201262 => 29602/165830} | 0 groups.io/g/MTFHRT/wiki/29602/165830.html | 1165 ------ .../wiki/{34293/201265 => 29602/165840} | 0 groups.io/g/MTFHRT/wiki/29602/165840.html | 1165 ------ groups.io/g/MTFHRT/wiki/29602/165842 | 1 + groups.io/g/MTFHRT/wiki/29602/165842.html | 1165 ------ groups.io/g/MTFHRT/wiki/29602/165844.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/165880.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/165882.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/165974.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/165976.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/165985.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/165986.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/166032.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/166033.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/167382.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/167697.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/167699.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/167700.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/167779.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/168088.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/168292.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/168872.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/169943.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/169996.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170001.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170019.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170041.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170043.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170046.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170117.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170292.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170474.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170480.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170493.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170570.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170572.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170644.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170646.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170647.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/170730.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171102.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171375.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171433.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171603.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171634.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171787.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171799.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171800.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171816.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171845.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171848.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171933.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171989.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/171993.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172034.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172036.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172154.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172157.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172161.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172176.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172555.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172560.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172567.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172748.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/172772.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173017.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173018.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173019.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173224.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173225.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173240.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173241.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173242.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173359.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173385.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173450.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173566.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173659.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173669.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173845.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/173933.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/174038.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/174146.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175306.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175308.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175309.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175312.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175559.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175562.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175563.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175671.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175689.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175730.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175908.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175930.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/175991.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176625.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176627.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176633.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176690.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176779.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176862.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176863.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176870.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/176939.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/177139.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/177140.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/178199.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/178236.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/178516.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/178517.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/178526.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/179227.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/179444.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/181040.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/181092.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/181266.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/181781.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/183064.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/184065.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/184355.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/184356.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/184675.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/184793.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/184817.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/185552.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/185742.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/185743.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/185980.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/186269.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/186348.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/186514.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/186633.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/186634.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/186944.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/186993.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187032.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187071.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187072.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187073.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187215.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187225.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187258.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187259.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187324.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187370.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187371.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187424.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187581.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187590.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187593.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187707.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187775.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187810.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187811.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187839.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187840.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187847.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/187896.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188033.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188034.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188214.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188232.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188240.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188243.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188266.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188385.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188427.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/188484.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/189123.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/189321.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/189646.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/189647.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/189700.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/189952.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190227.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190628.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190629.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190846.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190847.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190872.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190915.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/190942.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/191406.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/191417.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/191626.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/192624.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/193627.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/194218.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/194253.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/194629.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/194635.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/194867.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/194939.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/195405.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/195973.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/195986.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/196048.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/196085.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/196597.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197239.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197796.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197814.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197818.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197828.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197829.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197830.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/197997.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/198070.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/198075.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/198774.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/199148.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/199960.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/201192.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/201237.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/202979.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/203230.html | 887 +++-- groups.io/g/MTFHRT/wiki/29602/204015.html | 1533 ++++++++ groups.io/g/MTFHRT/wiki/29602/history.html | 799 ++-- groups.io/g/MTFHRT/wiki/30843.html | 875 +++-- groups.io/g/MTFHRT/wiki/30843/171363.html | 1403 ++++++++ groups.io/g/MTFHRT/wiki/30843/171364.html | 1403 ++++++++ groups.io/g/MTFHRT/wiki/30843/171365.html | 1403 ++++++++ groups.io/g/MTFHRT/wiki/30843/171431.html | 1404 ++++++++ groups.io/g/MTFHRT/wiki/30843/171432.html | 1404 ++++++++ groups.io/g/MTFHRT/wiki/30843/history.html | 749 ++-- groups.io/g/MTFHRT/wiki/30846.html | 873 +++-- groups.io/g/MTFHRT/wiki/30846/171373.html | 859 +++-- groups.io/g/MTFHRT/wiki/30846/175561.html | 861 +++-- groups.io/g/MTFHRT/wiki/30846/175575.html | 871 +++-- groups.io/g/MTFHRT/wiki/30846/175576.html | 873 +++-- groups.io/g/MTFHRT/wiki/30846/175577.html | 873 +++-- groups.io/g/MTFHRT/wiki/30846/history.html | 739 +++- groups.io/g/MTFHRT/wiki/32288.html | 895 +++-- groups.io/g/MTFHRT/wiki/32288/175560.html | 1375 +++++++ groups.io/g/MTFHRT/wiki/32288/history.html | 741 +++- groups.io/g/MTFHRT/wiki/34293.html | 867 +++-- groups.io/g/MTFHRT/wiki/34293/189320.html | 1360 +++++++ groups.io/g/MTFHRT/wiki/34293/189648.html | 1360 +++++++ groups.io/g/MTFHRT/wiki/34293/201261.html | 1361 +++++++ groups.io/g/MTFHRT/wiki/34293/201262.html | 1361 +++++++ groups.io/g/MTFHRT/wiki/34293/201265.html | 1361 +++++++ groups.io/g/MTFHRT/wiki/34293/history.html | 749 ++-- groups.io/g/MTFHRT/wiki/index.html | 873 +++-- ...ation-2fb8693374ebdea0ffcbb3b8c1d39910.js} | 256 +- groups.io/tinymce-4.7.13/tinymce.min.js | 2 - groups.io/tinymce-5.10.9/tinymce.min.js | 9 + groups.io/webfonts/fa-sharp-light-300.ttf | Bin 0 -> 896932 bytes groups.io/webfonts/fa-sharp-light-300.woff2 | Bin 0 -> 362836 bytes groups.io/webfonts/fa-sharp-regular-400.ttf | Bin 0 -> 795080 bytes groups.io/webfonts/fa-sharp-regular-400.woff2 | Bin 0 -> 327912 bytes groups.io/webfonts/fa-sharp-solid-900.ttf | Bin 0 -> 639276 bytes groups.io/webfonts/fa-sharp-solid-900.woff2 | Bin 0 -> 257496 bytes 274 files changed, 160311 insertions(+), 75290 deletions(-) rename groups.io/css/{application-e223b9cc72bae00ecc93c35c77a729b2.css => application-0fdc8fb7b212ef119ea05f76b6c42703.css} (90%) rename groups.io/g/MTFHRT/wiki/{30843/171363 => 29602/165198} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165198.html rename groups.io/g/MTFHRT/wiki/{30843/171364 => 29602/165219} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165219.html rename groups.io/g/MTFHRT/wiki/{30843/171365 => 29602/165250} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165250.html rename groups.io/g/MTFHRT/wiki/{30843/171431 => 29602/165437} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165437.html rename groups.io/g/MTFHRT/wiki/{30843/171432 => 29602/165467} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165467.html rename groups.io/g/MTFHRT/wiki/{32288/175560 => 29602/165469} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165469.html rename groups.io/g/MTFHRT/wiki/{34293/189320 => 29602/165470} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165470.html rename groups.io/g/MTFHRT/wiki/{34293/189648 => 29602/165530} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165530.html rename groups.io/g/MTFHRT/wiki/{34293/201261 => 29602/165664} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165664.html rename groups.io/g/MTFHRT/wiki/{34293/201262 => 29602/165830} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165830.html rename groups.io/g/MTFHRT/wiki/{34293/201265 => 29602/165840} (100%) delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165840.html create mode 100644 groups.io/g/MTFHRT/wiki/29602/165842 delete mode 100644 groups.io/g/MTFHRT/wiki/29602/165842.html create mode 100644 groups.io/g/MTFHRT/wiki/29602/204015.html create mode 100644 groups.io/g/MTFHRT/wiki/30843/171363.html create mode 100644 groups.io/g/MTFHRT/wiki/30843/171364.html create mode 100644 groups.io/g/MTFHRT/wiki/30843/171365.html create mode 100644 groups.io/g/MTFHRT/wiki/30843/171431.html create mode 100644 groups.io/g/MTFHRT/wiki/30843/171432.html create mode 100644 groups.io/g/MTFHRT/wiki/32288/175560.html create mode 100644 groups.io/g/MTFHRT/wiki/34293/189320.html create mode 100644 groups.io/g/MTFHRT/wiki/34293/189648.html create mode 100644 groups.io/g/MTFHRT/wiki/34293/201261.html create mode 100644 groups.io/g/MTFHRT/wiki/34293/201262.html create mode 100644 groups.io/g/MTFHRT/wiki/34293/201265.html rename groups.io/js/{application-6b3b1791facc58d99b1e9c143e69bd45.js => application-2fb8693374ebdea0ffcbb3b8c1d39910.js} (92%) delete mode 100644 groups.io/tinymce-4.7.13/tinymce.min.js create mode 100644 groups.io/tinymce-5.10.9/tinymce.min.js create mode 100644 groups.io/webfonts/fa-sharp-light-300.ttf create mode 100644 groups.io/webfonts/fa-sharp-light-300.woff2 create mode 100644 groups.io/webfonts/fa-sharp-regular-400.ttf create mode 100644 groups.io/webfonts/fa-sharp-regular-400.woff2 create mode 100644 groups.io/webfonts/fa-sharp-solid-900.ttf create mode 100644 groups.io/webfonts/fa-sharp-solid-900.woff2 diff --git a/groups.io/css/application-e223b9cc72bae00ecc93c35c77a729b2.css b/groups.io/css/application-0fdc8fb7b212ef119ea05f76b6c42703.css similarity index 90% rename from groups.io/css/application-e223b9cc72bae00ecc93c35c77a729b2.css rename to groups.io/css/application-0fdc8fb7b212ef119ea05f76b6c42703.css index 2e117618..fdfbe4ea 100644 --- a/groups.io/css/application-e223b9cc72bae00ecc93c35c77a729b2.css +++ b/groups.io/css/application-0fdc8fb7b212ef119ea05f76b6c42703.css @@ -4,12 +4,6 @@ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:"Glyphicons Halflings";src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot%3F) format("embedded-opentype"),url(../fonts/glyphicons-halflings-regular.woff2) format("woff2"),url(../fonts/glyphicons-halflings-regular.woff) format("woff"),url(../fonts/glyphicons-halflings-regular.ttf) format("truetype"),url(../fonts/glyphicons-halflings-regular.svg) format("svg")}.glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:"\2014 \00A0"}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:""}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:"\00A0 \2014"}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.row-no-gutters{margin-right:0;margin-left:0}.row-no-gutters [class*=col-]{padding-right:0;padding-left:0}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;background-image:none;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;background-image:none;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;background-image:none;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;background-image:none;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;background-image:none;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover>.arrow{border-width:11px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;filter:alpha(opacity=90);opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:"\2039"}.carousel-control .icon-next:before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} /*# sourceMappingURL=bootstrap.min.css.map */ -/*! - * Bootstrap v3.4.1 (https://getbootstrap.com/) - * Copyright 2011-2019 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} -/*# sourceMappingURL=bootstrap-theme.min.css.map */ /*! * Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license (Commercial License) @@ -22,6 +16,24 @@ .fa-duotone.fa-0:after,.fad.fa-0:after{content:"\30\30"}.fa-duotone.fa-1:after,.fad.fa-1:after{content:"\31\31"}.fa-duotone.fa-2:after,.fad.fa-2:after{content:"\32\32"}.fa-duotone.fa-3:after,.fad.fa-3:after{content:"\33\33"}.fa-duotone.fa-4:after,.fad.fa-4:after{content:"\34\34"}.fa-duotone.fa-5:after,.fad.fa-5:after{content:"\35\35"}.fa-duotone.fa-6:after,.fad.fa-6:after{content:"\36\36"}.fa-duotone.fa-7:after,.fad.fa-7:after{content:"\37\37"}.fa-duotone.fa-8:after,.fad.fa-8:after{content:"\38\38"}.fa-duotone.fa-9:after,.fad.fa-9:after{content:"\39\39"}.fa-duotone.fa-fill-drip:after,.fad.fa-fill-drip:after{content:"\f576\f576"}.fa-duotone.fa-arrows-to-circle:after,.fad.fa-arrows-to-circle:after{content:"\e4bd\e4bd"}.fa-duotone.fa-chevron-circle-right:after,.fa-duotone.fa-circle-chevron-right:after,.fad.fa-chevron-circle-right:after,.fad.fa-circle-chevron-right:after{content:"\f138\f138"}.fa-duotone.fa-wagon-covered:after,.fad.fa-wagon-covered:after{content:"\f8ee\f8ee"}.fa-duotone.fa-line-height:after,.fad.fa-line-height:after{content:"\f871\f871"}.fa-duotone.fa-bagel:after,.fad.fa-bagel:after{content:"\e3d7\e3d7"}.fa-duotone.fa-transporter-7:after,.fad.fa-transporter-7:after{content:"\e2a8\e2a8"}.fa-duotone.fa-at:after,.fad.fa-at:after{content:"\40\40"}.fa-duotone.fa-rectangles-mixed:after,.fad.fa-rectangles-mixed:after{content:"\e323\e323"}.fa-duotone.fa-phone-arrow-up-right:after,.fa-duotone.fa-phone-arrow-up:after,.fa-duotone.fa-phone-outgoing:after,.fad.fa-phone-arrow-up-right:after,.fad.fa-phone-arrow-up:after,.fad.fa-phone-outgoing:after{content:"\e224\e224"}.fa-duotone.fa-trash-alt:after,.fa-duotone.fa-trash-can:after,.fad.fa-trash-alt:after,.fad.fa-trash-can:after{content:"\f2ed\f2ed"}.fa-duotone.fa-circle-l:after,.fad.fa-circle-l:after{content:"\e114\e114"}.fa-duotone.fa-head-side-goggles:after,.fa-duotone.fa-head-vr:after,.fad.fa-head-side-goggles:after,.fad.fa-head-vr:after{content:"\f6ea\f6ea"}.fa-duotone.fa-text-height:after,.fad.fa-text-height:after{content:"\f034\f034"}.fa-duotone.fa-user-times:after,.fa-duotone.fa-user-xmark:after,.fad.fa-user-times:after,.fad.fa-user-xmark:after{content:"\f235\f235"}.fa-duotone.fa-face-hand-yawn:after,.fad.fa-face-hand-yawn:after{content:"\e379\e379"}.fa-duotone.fa-gauge-simple-min:after,.fa-duotone.fa-tachometer-slowest:after,.fad.fa-gauge-simple-min:after,.fad.fa-tachometer-slowest:after{content:"\f62d\f62d"}.fa-duotone.fa-stethoscope:after,.fad.fa-stethoscope:after{content:"\f0f1\f0f1"}.fa-duotone.fa-coffin:after,.fad.fa-coffin:after{content:"\f6c6\f6c6"}.fa-duotone.fa-comment-alt:after,.fa-duotone.fa-message:after,.fad.fa-comment-alt:after,.fad.fa-message:after{content:"\f27a\f27a"}.fa-duotone.fa-bowl-salad:after,.fa-duotone.fa-salad:after,.fad.fa-bowl-salad:after,.fad.fa-salad:after{content:"\f81e\f81e"}.fa-duotone.fa-info:after,.fad.fa-info:after{content:"\f129\f129"}.fa-duotone.fa-robot-astromech:after,.fad.fa-robot-astromech:after{content:"\e2d2\e2d2"}.fa-duotone.fa-ring-diamond:after,.fad.fa-ring-diamond:after{content:"\e5ab\e5ab"}.fa-duotone.fa-fondue-pot:after,.fad.fa-fondue-pot:after{content:"\e40d\e40d"}.fa-duotone.fa-theta:after,.fad.fa-theta:after{content:"\f69e\f69e"}.fa-duotone.fa-face-hand-peeking:after,.fad.fa-face-hand-peeking:after{content:"\e481\e481"}.fa-duotone.fa-square-user:after,.fad.fa-square-user:after{content:"\e283\e283"}.fa-duotone.fa-compress-alt:after,.fa-duotone.fa-down-left-and-up-right-to-center:after,.fad.fa-compress-alt:after,.fad.fa-down-left-and-up-right-to-center:after{content:"\f422\f422"}.fa-duotone.fa-explosion:after,.fad.fa-explosion:after{content:"\e4e9\e4e9"}.fa-duotone.fa-file-alt:after,.fa-duotone.fa-file-lines:after,.fa-duotone.fa-file-text:after,.fad.fa-file-alt:after,.fad.fa-file-lines:after,.fad.fa-file-text:after{content:"\f15c\f15c"}.fa-duotone.fa-wave-square:after,.fad.fa-wave-square:after{content:"\f83e\f83e"}.fa-duotone.fa-ring:after,.fad.fa-ring:after{content:"\f70b\f70b"}.fa-duotone.fa-building-un:after,.fad.fa-building-un:after{content:"\e4d9\e4d9"}.fa-duotone.fa-dice-three:after,.fad.fa-dice-three:after{content:"\f527\f527"}.fa-duotone.fa-tire-pressure-warning:after,.fad.fa-tire-pressure-warning:after{content:"\f633\f633"}.fa-duotone.fa-wifi-2:after,.fa-duotone.fa-wifi-fair:after,.fad.fa-wifi-2:after,.fad.fa-wifi-fair:after{content:"\f6ab\f6ab"}.fa-duotone.fa-calendar-alt:after,.fa-duotone.fa-calendar-days:after,.fad.fa-calendar-alt:after,.fad.fa-calendar-days:after{content:"\f073\f073"}.fa-duotone.fa-mp3-player:after,.fad.fa-mp3-player:after{content:"\f8ce\f8ce"}.fa-duotone.fa-anchor-circle-check:after,.fad.fa-anchor-circle-check:after{content:"\e4aa\e4aa"}.fa-duotone.fa-tally-4:after,.fad.fa-tally-4:after{content:"\e297\e297"}.fa-duotone.fa-rectangle-history:after,.fad.fa-rectangle-history:after{content:"\e4a2\e4a2"}.fa-duotone.fa-building-circle-arrow-right:after,.fad.fa-building-circle-arrow-right:after{content:"\e4d1\e4d1"}.fa-duotone.fa-volleyball-ball:after,.fa-duotone.fa-volleyball:after,.fad.fa-volleyball-ball:after,.fad.fa-volleyball:after{content:"\f45f\f45f"}.fa-duotone.fa-sun-haze:after,.fad.fa-sun-haze:after{content:"\f765\f765"}.fa-duotone.fa-text-size:after,.fad.fa-text-size:after{content:"\f894\f894"}.fa-duotone.fa-ufo:after,.fad.fa-ufo:after{content:"\e047\e047"}.fa-duotone.fa-fork:after,.fa-duotone.fa-utensil-fork:after,.fad.fa-fork:after,.fad.fa-utensil-fork:after{content:"\f2e3\f2e3"}.fa-duotone.fa-arrows-up-to-line:after,.fad.fa-arrows-up-to-line:after{content:"\e4c2\e4c2"}.fa-duotone.fa-mobile-signal:after,.fad.fa-mobile-signal:after{content:"\e1ef\e1ef"}.fa-duotone.fa-barcode-scan:after,.fad.fa-barcode-scan:after{content:"\f465\f465"}.fa-duotone.fa-sort-desc:after,.fa-duotone.fa-sort-down:after,.fad.fa-sort-desc:after,.fad.fa-sort-down:after{content:"\f0dd\f0dd"}.fa-duotone.fa-folder-arrow-down:after,.fa-duotone.fa-folder-download:after,.fad.fa-folder-arrow-down:after,.fad.fa-folder-download:after{content:"\e053\e053"}.fa-duotone.fa-circle-minus:after,.fa-duotone.fa-minus-circle:after,.fad.fa-circle-minus:after,.fad.fa-minus-circle:after{content:"\f056\f056"}.fa-duotone.fa-face-icicles:after,.fad.fa-face-icicles:after{content:"\e37c\e37c"}.fa-duotone.fa-shovel:after,.fad.fa-shovel:after{content:"\f713\f713"}.fa-duotone.fa-door-open:after,.fad.fa-door-open:after{content:"\f52b\f52b"}.fa-duotone.fa-films:after,.fad.fa-films:after{content:"\e17a\e17a"}.fa-duotone.fa-right-from-bracket:after,.fa-duotone.fa-sign-out-alt:after,.fad.fa-right-from-bracket:after,.fad.fa-sign-out-alt:after{content:"\f2f5\f2f5"}.fa-duotone.fa-face-glasses:after,.fad.fa-face-glasses:after{content:"\e377\e377"}.fa-duotone.fa-nfc:after,.fad.fa-nfc:after{content:"\e1f7\e1f7"}.fa-duotone.fa-atom:after,.fad.fa-atom:after{content:"\f5d2\f5d2"}.fa-duotone.fa-soap:after,.fad.fa-soap:after{content:"\e06e\e06e"}.fa-duotone.fa-heart-music-camera-bolt:after,.fa-duotone.fa-icons:after,.fad.fa-heart-music-camera-bolt:after,.fad.fa-icons:after{content:"\f86d\f86d"}.fa-duotone.fa-microphone-alt-slash:after,.fa-duotone.fa-microphone-lines-slash:after,.fad.fa-microphone-alt-slash:after,.fad.fa-microphone-lines-slash:after{content:"\f539\f539"}.fa-duotone.fa-closed-captioning-slash:after,.fad.fa-closed-captioning-slash:after{content:"\e135\e135"}.fa-duotone.fa-calculator-alt:after,.fa-duotone.fa-calculator-simple:after,.fad.fa-calculator-alt:after,.fad.fa-calculator-simple:after{content:"\f64c\f64c"}.fa-duotone.fa-bridge-circle-check:after,.fad.fa-bridge-circle-check:after{content:"\e4c9\e4c9"}.fa-duotone.fa-sliders-up:after,.fa-duotone.fa-sliders-v:after,.fad.fa-sliders-up:after,.fad.fa-sliders-v:after{content:"\f3f1\f3f1"}.fa-duotone.fa-location-minus:after,.fa-duotone.fa-map-marker-minus:after,.fad.fa-location-minus:after,.fad.fa-map-marker-minus:after{content:"\f609\f609"}.fa-duotone.fa-pump-medical:after,.fad.fa-pump-medical:after{content:"\e06a\e06a"}.fa-duotone.fa-fingerprint:after,.fad.fa-fingerprint:after{content:"\f577\f577"}.fa-duotone.fa-ski-boot:after,.fad.fa-ski-boot:after{content:"\e3cc\e3cc"}.fa-duotone.fa-rectangle-sd:after,.fa-duotone.fa-standard-definition:after,.fad.fa-rectangle-sd:after,.fad.fa-standard-definition:after{content:"\e28a\e28a"}.fa-duotone.fa-h1:after,.fad.fa-h1:after{content:"\f313\f313"}.fa-duotone.fa-hand-point-right:after,.fad.fa-hand-point-right:after{content:"\f0a4\f0a4"}.fa-duotone.fa-magnifying-glass-location:after,.fa-duotone.fa-search-location:after,.fad.fa-magnifying-glass-location:after,.fad.fa-search-location:after{content:"\f689\f689"}.fa-duotone.fa-message-bot:after,.fad.fa-message-bot:after{content:"\e3b8\e3b8"}.fa-duotone.fa-forward-step:after,.fa-duotone.fa-step-forward:after,.fad.fa-forward-step:after,.fad.fa-step-forward:after{content:"\f051\f051"}.fa-duotone.fa-face-smile-beam:after,.fa-duotone.fa-smile-beam:after,.fad.fa-face-smile-beam:after,.fad.fa-smile-beam:after{content:"\f5b8\f5b8"}.fa-duotone.fa-light-ceiling:after,.fad.fa-light-ceiling:after{content:"\e016\e016"}.fa-duotone.fa-comment-alt-exclamation:after,.fa-duotone.fa-message-exclamation:after,.fad.fa-comment-alt-exclamation:after,.fad.fa-message-exclamation:after{content:"\f4a5\f4a5"}.fa-duotone.fa-bowl-scoop:after,.fa-duotone.fa-bowl-shaved-ice:after,.fad.fa-bowl-scoop:after,.fad.fa-bowl-shaved-ice:after{content:"\e3de\e3de"}.fa-duotone.fa-square-x:after,.fad.fa-square-x:after{content:"\e286\e286"}.fa-duotone.fa-utility-pole-double:after,.fad.fa-utility-pole-double:after{content:"\e2c4\e2c4"}.fa-duotone.fa-flag-checkered:after,.fad.fa-flag-checkered:after{content:"\f11e\f11e"}.fa-duotone.fa-chevron-double-up:after,.fa-duotone.fa-chevrons-up:after,.fad.fa-chevron-double-up:after,.fad.fa-chevrons-up:after{content:"\f325\f325"}.fa-duotone.fa-football-ball:after,.fa-duotone.fa-football:after,.fad.fa-football-ball:after,.fad.fa-football:after{content:"\f44e\f44e"}.fa-duotone.fa-user-vneck:after,.fad.fa-user-vneck:after{content:"\e461\e461"}.fa-duotone.fa-school-circle-exclamation:after,.fad.fa-school-circle-exclamation:after{content:"\e56c\e56c"}.fa-duotone.fa-crop:after,.fad.fa-crop:after{content:"\f125\f125"}.fa-duotone.fa-angle-double-down:after,.fa-duotone.fa-angles-down:after,.fad.fa-angle-double-down:after,.fad.fa-angles-down:after{content:"\f103\f103"}.fa-duotone.fa-users-rectangle:after,.fad.fa-users-rectangle:after{content:"\e594\e594"}.fa-duotone.fa-people-roof:after,.fad.fa-people-roof:after{content:"\e537\e537"}.fa-duotone.fa-arrow-square-right:after,.fa-duotone.fa-square-arrow-right:after,.fad.fa-arrow-square-right:after,.fad.fa-square-arrow-right:after{content:"\f33b\f33b"}.fa-duotone.fa-location-plus:after,.fa-duotone.fa-map-marker-plus:after,.fad.fa-location-plus:after,.fad.fa-map-marker-plus:after{content:"\f60a\f60a"}.fa-duotone.fa-lightbulb-exclamation-on:after,.fad.fa-lightbulb-exclamation-on:after{content:"\e1ca\e1ca"}.fa-duotone.fa-people-line:after,.fad.fa-people-line:after{content:"\e534\e534"}.fa-duotone.fa-beer-mug-empty:after,.fa-duotone.fa-beer:after,.fad.fa-beer-mug-empty:after,.fad.fa-beer:after{content:"\f0fc\f0fc"}.fa-duotone.fa-crate-empty:after,.fad.fa-crate-empty:after{content:"\e151\e151"}.fa-duotone.fa-diagram-predecessor:after,.fad.fa-diagram-predecessor:after{content:"\e477\e477"}.fa-duotone.fa-transporter:after,.fad.fa-transporter:after{content:"\e042\e042"}.fa-duotone.fa-calendar-circle-user:after,.fad.fa-calendar-circle-user:after{content:"\e471\e471"}.fa-duotone.fa-arrow-up-long:after,.fa-duotone.fa-long-arrow-up:after,.fad.fa-arrow-up-long:after,.fad.fa-long-arrow-up:after{content:"\f176\f176"}.fa-duotone.fa-person-carry-box:after,.fa-duotone.fa-person-carry:after,.fad.fa-person-carry-box:after,.fad.fa-person-carry:after{content:"\f4cf\f4cf"}.fa-duotone.fa-burn:after,.fa-duotone.fa-fire-flame-simple:after,.fad.fa-burn:after,.fad.fa-fire-flame-simple:after{content:"\f46a\f46a"}.fa-duotone.fa-male:after,.fa-duotone.fa-person:after,.fad.fa-male:after,.fad.fa-person:after{content:"\f183\f183"}.fa-duotone.fa-laptop:after,.fad.fa-laptop:after{content:"\f109\f109"}.fa-duotone.fa-file-csv:after,.fad.fa-file-csv:after{content:"\f6dd\f6dd"}.fa-duotone.fa-menorah:after,.fad.fa-menorah:after{content:"\f676\f676"}.fa-duotone.fa-union:after,.fad.fa-union:after{content:"\f6a2\f6a2"}.fa-duotone.fa-chevron-double-left:after,.fa-duotone.fa-chevrons-left:after,.fad.fa-chevron-double-left:after,.fad.fa-chevrons-left:after{content:"\f323\f323"}.fa-duotone.fa-circle-heart:after,.fa-duotone.fa-heart-circle:after,.fad.fa-circle-heart:after,.fad.fa-heart-circle:after{content:"\f4c7\f4c7"}.fa-duotone.fa-truck-plane:after,.fad.fa-truck-plane:after{content:"\e58f\e58f"}.fa-duotone.fa-record-vinyl:after,.fad.fa-record-vinyl:after{content:"\f8d9\f8d9"}.fa-duotone.fa-bring-forward:after,.fad.fa-bring-forward:after{content:"\f856\f856"}.fa-duotone.fa-square-p:after,.fad.fa-square-p:after{content:"\e279\e279"}.fa-duotone.fa-face-grin-stars:after,.fa-duotone.fa-grin-stars:after,.fad.fa-face-grin-stars:after,.fad.fa-grin-stars:after{content:"\f587\f587"}.fa-duotone.fa-sigma:after,.fad.fa-sigma:after{content:"\f68b\f68b"}.fa-duotone.fa-camera-movie:after,.fad.fa-camera-movie:after{content:"\f8a9\f8a9"}.fa-duotone.fa-bong:after,.fad.fa-bong:after{content:"\f55c\f55c"}.fa-duotone.fa-clarinet:after,.fad.fa-clarinet:after{content:"\f8ad\f8ad"}.fa-duotone.fa-truck-flatbed:after,.fad.fa-truck-flatbed:after{content:"\e2b6\e2b6"}.fa-duotone.fa-pastafarianism:after,.fa-duotone.fa-spaghetti-monster-flying:after,.fad.fa-pastafarianism:after,.fad.fa-spaghetti-monster-flying:after{content:"\f67b\f67b"}.fa-duotone.fa-arrow-down-up-across-line:after,.fad.fa-arrow-down-up-across-line:after{content:"\e4af\e4af"}.fa-duotone.fa-leaf-heart:after,.fad.fa-leaf-heart:after{content:"\f4cb\f4cb"}.fa-duotone.fa-house-building:after,.fad.fa-house-building:after{content:"\e1b1\e1b1"}.fa-duotone.fa-cheese-swiss:after,.fad.fa-cheese-swiss:after{content:"\f7f0\f7f0"}.fa-duotone.fa-spoon:after,.fa-duotone.fa-utensil-spoon:after,.fad.fa-spoon:after,.fad.fa-utensil-spoon:after{content:"\f2e5\f2e5"}.fa-duotone.fa-jar-wheat:after,.fad.fa-jar-wheat:after{content:"\e517\e517"}.fa-duotone.fa-envelopes-bulk:after,.fa-duotone.fa-mail-bulk:after,.fad.fa-envelopes-bulk:after,.fad.fa-mail-bulk:after{content:"\f674\f674"}.fa-duotone.fa-file-circle-exclamation:after,.fad.fa-file-circle-exclamation:after{content:"\e4eb\e4eb"}.fa-duotone.fa-bow-arrow:after,.fad.fa-bow-arrow:after{content:"\f6b9\f6b9"}.fa-duotone.fa-cart-xmark:after,.fad.fa-cart-xmark:after{content:"\e0dd\e0dd"}.fa-duotone.fa-hexagon-xmark:after,.fa-duotone.fa-times-hexagon:after,.fa-duotone.fa-xmark-hexagon:after,.fad.fa-hexagon-xmark:after,.fad.fa-times-hexagon:after,.fad.fa-xmark-hexagon:after{content:"\f2ee\f2ee"}.fa-duotone.fa-circle-h:after,.fa-duotone.fa-hospital-symbol:after,.fad.fa-circle-h:after,.fad.fa-hospital-symbol:after{content:"\f47e\f47e"}.fa-duotone.fa-merge:after,.fad.fa-merge:after{content:"\e526\e526"}.fa-duotone.fa-pager:after,.fad.fa-pager:after{content:"\f815\f815"}.fa-duotone.fa-cart-minus:after,.fad.fa-cart-minus:after{content:"\e0db\e0db"}.fa-duotone.fa-address-book:after,.fa-duotone.fa-contact-book:after,.fad.fa-address-book:after,.fad.fa-contact-book:after{content:"\f2b9\f2b9"}.fa-duotone.fa-pan-frying:after,.fad.fa-pan-frying:after{content:"\e42c\e42c"}.fa-duotone.fa-grid-3:after,.fa-duotone.fa-grid:after,.fad.fa-grid-3:after,.fad.fa-grid:after{content:"\e195\e195"}.fa-duotone.fa-football-helmet:after,.fad.fa-football-helmet:after{content:"\f44f\f44f"}.fa-duotone.fa-hand-love:after,.fad.fa-hand-love:after{content:"\e1a5\e1a5"}.fa-duotone.fa-trees:after,.fad.fa-trees:after{content:"\f724\f724"}.fa-duotone.fa-strikethrough:after,.fad.fa-strikethrough:after{content:"\f0cc\f0cc"}.fa-duotone.fa-page:after,.fad.fa-page:after{content:"\e428\e428"}.fa-duotone.fa-k:after,.fad.fa-k:after{content:"\4b\4b"}.fa-duotone.fa-diagram-previous:after,.fad.fa-diagram-previous:after{content:"\e478\e478"}.fa-duotone.fa-gauge-min:after,.fa-duotone.fa-tachometer-alt-slowest:after,.fad.fa-gauge-min:after,.fad.fa-tachometer-alt-slowest:after{content:"\f628\f628"}.fa-duotone.fa-folder-grid:after,.fad.fa-folder-grid:after{content:"\e188\e188"}.fa-duotone.fa-eggplant:after,.fad.fa-eggplant:after{content:"\e16c\e16c"}.fa-duotone.fa-ram:after,.fad.fa-ram:after{content:"\f70a\f70a"}.fa-duotone.fa-landmark-flag:after,.fad.fa-landmark-flag:after{content:"\e51c\e51c"}.fa-duotone.fa-lips:after,.fad.fa-lips:after{content:"\f600\f600"}.fa-duotone.fa-pencil-alt:after,.fa-duotone.fa-pencil:after,.fad.fa-pencil-alt:after,.fad.fa-pencil:after{content:"\f303\f303"}.fa-duotone.fa-backward:after,.fad.fa-backward:after{content:"\f04a\f04a"}.fa-duotone.fa-caret-right:after,.fad.fa-caret-right:after{content:"\f0da\f0da"}.fa-duotone.fa-comments:after,.fad.fa-comments:after{content:"\f086\f086"}.fa-duotone.fa-file-clipboard:after,.fa-duotone.fa-paste:after,.fad.fa-file-clipboard:after,.fad.fa-paste:after{content:"\f0ea\f0ea"}.fa-duotone.fa-desktop-arrow-down:after,.fad.fa-desktop-arrow-down:after{content:"\e155\e155"}.fa-duotone.fa-code-pull-request:after,.fad.fa-code-pull-request:after{content:"\e13c\e13c"}.fa-duotone.fa-pumpkin:after,.fad.fa-pumpkin:after{content:"\f707\f707"}.fa-duotone.fa-clipboard-list:after,.fad.fa-clipboard-list:after{content:"\f46d\f46d"}.fa-duotone.fa-pen-field:after,.fad.fa-pen-field:after{content:"\e211\e211"}.fa-duotone.fa-blueberries:after,.fad.fa-blueberries:after{content:"\e2e8\e2e8"}.fa-duotone.fa-truck-loading:after,.fa-duotone.fa-truck-ramp-box:after,.fad.fa-truck-loading:after,.fad.fa-truck-ramp-box:after{content:"\f4de\f4de"}.fa-duotone.fa-note:after,.fad.fa-note:after{content:"\e1ff\e1ff"}.fa-duotone.fa-arrow-down-to-square:after,.fad.fa-arrow-down-to-square:after{content:"\e096\e096"}.fa-duotone.fa-user-check:after,.fad.fa-user-check:after{content:"\f4fc\f4fc"}.fa-duotone.fa-cloud-xmark:after,.fad.fa-cloud-xmark:after{content:"\e35f\e35f"}.fa-duotone.fa-vial-virus:after,.fad.fa-vial-virus:after{content:"\e597\e597"}.fa-duotone.fa-book-alt:after,.fa-duotone.fa-book-blank:after,.fad.fa-book-alt:after,.fad.fa-book-blank:after{content:"\f5d9\f5d9"}.fa-duotone.fa-golf-flag-hole:after,.fad.fa-golf-flag-hole:after{content:"\e3ac\e3ac"}.fa-duotone.fa-comment-alt-arrow-down:after,.fa-duotone.fa-message-arrow-down:after,.fad.fa-comment-alt-arrow-down:after,.fad.fa-message-arrow-down:after{content:"\e1db\e1db"}.fa-duotone.fa-face-unamused:after,.fad.fa-face-unamused:after{content:"\e39f\e39f"}.fa-duotone.fa-sheet-plastic:after,.fad.fa-sheet-plastic:after{content:"\e571\e571"}.fa-duotone.fa-circle-9:after,.fad.fa-circle-9:after{content:"\e0f6\e0f6"}.fa-duotone.fa-blog:after,.fad.fa-blog:after{content:"\f781\f781"}.fa-duotone.fa-user-ninja:after,.fad.fa-user-ninja:after{content:"\f504\f504"}.fa-duotone.fa-pencil-slash:after,.fad.fa-pencil-slash:after{content:"\e215\e215"}.fa-duotone.fa-bowling-pins:after,.fad.fa-bowling-pins:after{content:"\f437\f437"}.fa-duotone.fa-person-arrow-up-from-line:after,.fad.fa-person-arrow-up-from-line:after{content:"\e539\e539"}.fa-duotone.fa-down-right:after,.fad.fa-down-right:after{content:"\e16b\e16b"}.fa-duotone.fa-scroll-torah:after,.fa-duotone.fa-torah:after,.fad.fa-scroll-torah:after,.fad.fa-torah:after{content:"\f6a0\f6a0"}.fa-duotone.fa-webhook:after,.fad.fa-webhook:after{content:"\e5d5\e5d5"}.fa-duotone.fa-blinds-open:after,.fad.fa-blinds-open:after{content:"\f8fc\f8fc"}.fa-duotone.fa-fence:after,.fad.fa-fence:after{content:"\e303\e303"}.fa-duotone.fa-arrow-alt-up:after,.fa-duotone.fa-up:after,.fad.fa-arrow-alt-up:after,.fad.fa-up:after{content:"\f357\f357"}.fa-duotone.fa-broom-ball:after,.fa-duotone.fa-quidditch-broom-ball:after,.fa-duotone.fa-quidditch:after,.fad.fa-broom-ball:after,.fad.fa-quidditch-broom-ball:after,.fad.fa-quidditch:after{content:"\f458\f458"}.fa-duotone.fa-drumstick:after,.fad.fa-drumstick:after{content:"\f6d6\f6d6"}.fa-duotone.fa-square-v:after,.fad.fa-square-v:after{content:"\e284\e284"}.fa-duotone.fa-face-awesome:after,.fa-duotone.fa-gave-dandy:after,.fad.fa-face-awesome:after,.fad.fa-gave-dandy:after{content:"\e409\e409"}.fa-duotone.fa-dial-off:after,.fad.fa-dial-off:after{content:"\e162\e162"}.fa-duotone.fa-toggle-off:after,.fad.fa-toggle-off:after{content:"\f204\f204"}.fa-duotone.fa-face-smile-horns:after,.fad.fa-face-smile-horns:after{content:"\e391\e391"}.fa-duotone.fa-archive:after,.fa-duotone.fa-box-archive:after,.fad.fa-archive:after,.fad.fa-box-archive:after{content:"\f187\f187"}.fa-duotone.fa-grapes:after,.fad.fa-grapes:after{content:"\e306\e306"}.fa-duotone.fa-person-drowning:after,.fad.fa-person-drowning:after{content:"\e545\e545"}.fa-duotone.fa-dial-max:after,.fad.fa-dial-max:after{content:"\e15e\e15e"}.fa-duotone.fa-circle-m:after,.fad.fa-circle-m:after{content:"\e115\e115"}.fa-duotone.fa-calendar-image:after,.fad.fa-calendar-image:after{content:"\e0d4\e0d4"}.fa-duotone.fa-caret-circle-down:after,.fa-duotone.fa-circle-caret-down:after,.fad.fa-caret-circle-down:after,.fad.fa-circle-caret-down:after{content:"\f32d\f32d"}.fa-duotone.fa-arrow-down-9-1:after,.fa-duotone.fa-sort-numeric-desc:after,.fa-duotone.fa-sort-numeric-down-alt:after,.fad.fa-arrow-down-9-1:after,.fad.fa-sort-numeric-desc:after,.fad.fa-sort-numeric-down-alt:after{content:"\f886\f886"}.fa-duotone.fa-face-grin-tongue-squint:after,.fa-duotone.fa-grin-tongue-squint:after,.fad.fa-face-grin-tongue-squint:after,.fad.fa-grin-tongue-squint:after{content:"\f58a\f58a"}.fa-duotone.fa-shish-kebab:after,.fad.fa-shish-kebab:after{content:"\f821\f821"}.fa-duotone.fa-spray-can:after,.fad.fa-spray-can:after{content:"\f5bd\f5bd"}.fa-duotone.fa-alarm-snooze:after,.fad.fa-alarm-snooze:after{content:"\f845\f845"}.fa-duotone.fa-scarecrow:after,.fad.fa-scarecrow:after{content:"\f70d\f70d"}.fa-duotone.fa-truck-monster:after,.fad.fa-truck-monster:after{content:"\f63b\f63b"}.fa-duotone.fa-gift-card:after,.fad.fa-gift-card:after{content:"\f663\f663"}.fa-duotone.fa-w:after,.fad.fa-w:after{content:"\57\57"}.fa-duotone.fa-code-pull-request-draft:after,.fad.fa-code-pull-request-draft:after{content:"\e3fa\e3fa"}.fa-duotone.fa-square-b:after,.fad.fa-square-b:after{content:"\e264\e264"}.fa-duotone.fa-elephant:after,.fad.fa-elephant:after{content:"\f6da\f6da"}.fa-duotone.fa-earth-africa:after,.fa-duotone.fa-globe-africa:after,.fad.fa-earth-africa:after,.fad.fa-globe-africa:after{content:"\f57c\f57c"}.fa-duotone.fa-rainbow:after,.fad.fa-rainbow:after{content:"\f75b\f75b"}.fa-duotone.fa-circle-notch:after,.fad.fa-circle-notch:after{content:"\f1ce\f1ce"}.fa-duotone.fa-tablet-alt:after,.fa-duotone.fa-tablet-screen-button:after,.fad.fa-tablet-alt:after,.fad.fa-tablet-screen-button:after{content:"\f3fa\f3fa"}.fa-duotone.fa-paw:after,.fad.fa-paw:after{content:"\f1b0\f1b0"}.fa-duotone.fa-message-question:after,.fad.fa-message-question:after{content:"\e1e3\e1e3"}.fa-duotone.fa-cloud:after,.fad.fa-cloud:after{content:"\f0c2\f0c2"}.fa-duotone.fa-trowel-bricks:after,.fad.fa-trowel-bricks:after{content:"\e58a\e58a"}.fa-duotone.fa-square-3:after,.fad.fa-square-3:after{content:"\e258\e258"}.fa-duotone.fa-face-flushed:after,.fa-duotone.fa-flushed:after,.fad.fa-face-flushed:after,.fad.fa-flushed:after{content:"\f579\f579"}.fa-duotone.fa-hospital-user:after,.fad.fa-hospital-user:after{content:"\f80d\f80d"}.fa-duotone.fa-microwave:after,.fad.fa-microwave:after{content:"\e01b\e01b"}.fa-duotone.fa-chf-sign:after,.fad.fa-chf-sign:after{content:"\e602\e602"}.fa-duotone.fa-tent-arrow-left-right:after,.fad.fa-tent-arrow-left-right:after{content:"\e57f\e57f"}.fa-duotone.fa-cart-circle-arrow-up:after,.fad.fa-cart-circle-arrow-up:after{content:"\e3f0\e3f0"}.fa-duotone.fa-trash-clock:after,.fad.fa-trash-clock:after{content:"\e2b0\e2b0"}.fa-duotone.fa-gavel:after,.fa-duotone.fa-legal:after,.fad.fa-gavel:after,.fad.fa-legal:after{content:"\f0e3\f0e3"}.fa-duotone.fa-sprinkler-ceiling:after,.fad.fa-sprinkler-ceiling:after{content:"\e44c\e44c"}.fa-duotone.fa-browsers:after,.fad.fa-browsers:after{content:"\e0cb\e0cb"}.fa-duotone.fa-trillium:after,.fad.fa-trillium:after{content:"\e588\e588"}.fa-duotone.fa-music-slash:after,.fad.fa-music-slash:after{content:"\f8d1\f8d1"}.fa-duotone.fa-truck-ramp:after,.fad.fa-truck-ramp:after{content:"\f4e0\f4e0"}.fa-duotone.fa-binoculars:after,.fad.fa-binoculars:after{content:"\f1e5\f1e5"}.fa-duotone.fa-microphone-slash:after,.fad.fa-microphone-slash:after{content:"\f131\f131"}.fa-duotone.fa-box-tissue:after,.fad.fa-box-tissue:after{content:"\e05b\e05b"}.fa-duotone.fa-circle-c:after,.fad.fa-circle-c:after{content:"\e101\e101"}.fa-duotone.fa-star-christmas:after,.fad.fa-star-christmas:after{content:"\f7d4\f7d4"}.fa-duotone.fa-chart-bullet:after,.fad.fa-chart-bullet:after{content:"\e0e1\e0e1"}.fa-duotone.fa-motorcycle:after,.fad.fa-motorcycle:after{content:"\f21c\f21c"}.fa-duotone.fa-tree-christmas:after,.fad.fa-tree-christmas:after{content:"\f7db\f7db"}.fa-duotone.fa-tire-flat:after,.fad.fa-tire-flat:after{content:"\f632\f632"}.fa-duotone.fa-sunglasses:after,.fad.fa-sunglasses:after{content:"\f892\f892"}.fa-duotone.fa-badge:after,.fad.fa-badge:after{content:"\f335\f335"}.fa-duotone.fa-comment-alt-edit:after,.fa-duotone.fa-message-edit:after,.fa-duotone.fa-message-pen:after,.fad.fa-comment-alt-edit:after,.fad.fa-message-edit:after,.fad.fa-message-pen:after{content:"\f4a4\f4a4"}.fa-duotone.fa-bell-concierge:after,.fa-duotone.fa-concierge-bell:after,.fad.fa-bell-concierge:after,.fad.fa-concierge-bell:after{content:"\f562\f562"}.fa-duotone.fa-pen-ruler:after,.fa-duotone.fa-pencil-ruler:after,.fad.fa-pen-ruler:after,.fad.fa-pencil-ruler:after{content:"\f5ae\f5ae"}.fa-duotone.fa-arrow-progress:after,.fad.fa-arrow-progress:after{content:"\e5df\e5df"}.fa-duotone.fa-chess-rook-alt:after,.fa-duotone.fa-chess-rook-piece:after,.fad.fa-chess-rook-alt:after,.fad.fa-chess-rook-piece:after{content:"\f448\f448"}.fa-duotone.fa-square-root:after,.fad.fa-square-root:after{content:"\f697\f697"}.fa-duotone.fa-album-collection-circle-plus:after,.fad.fa-album-collection-circle-plus:after{content:"\e48e\e48e"}.fa-duotone.fa-people-arrows-left-right:after,.fa-duotone.fa-people-arrows:after,.fad.fa-people-arrows-left-right:after,.fad.fa-people-arrows:after{content:"\e068\e068"}.fa-duotone.fa-face-angry-horns:after,.fad.fa-face-angry-horns:after{content:"\e368\e368"}.fa-duotone.fa-mars-and-venus-burst:after,.fad.fa-mars-and-venus-burst:after{content:"\e523\e523"}.fa-duotone.fa-tombstone:after,.fad.fa-tombstone:after{content:"\f720\f720"}.fa-duotone.fa-caret-square-right:after,.fa-duotone.fa-square-caret-right:after,.fad.fa-caret-square-right:after,.fad.fa-square-caret-right:after{content:"\f152\f152"}.fa-duotone.fa-cut:after,.fa-duotone.fa-scissors:after,.fad.fa-cut:after,.fad.fa-scissors:after{content:"\f0c4\f0c4"}.fa-duotone.fa-list-music:after,.fad.fa-list-music:after{content:"\f8c9\f8c9"}.fa-duotone.fa-sun-plant-wilt:after,.fad.fa-sun-plant-wilt:after{content:"\e57a\e57a"}.fa-duotone.fa-toilets-portable:after,.fad.fa-toilets-portable:after{content:"\e584\e584"}.fa-duotone.fa-hockey-puck:after,.fad.fa-hockey-puck:after{content:"\f453\f453"}.fa-duotone.fa-mustache:after,.fad.fa-mustache:after{content:"\e5bc\e5bc"}.fa-duotone.fa-hyphen:after,.fad.fa-hyphen:after{content:"\2d\2d"}.fa-duotone.fa-table:after,.fad.fa-table:after{content:"\f0ce\f0ce"}.fa-duotone.fa-user-chef:after,.fad.fa-user-chef:after{content:"\e3d2\e3d2"}.fa-duotone.fa-comment-alt-image:after,.fa-duotone.fa-message-image:after,.fad.fa-comment-alt-image:after,.fad.fa-message-image:after{content:"\e1e0\e1e0"}.fa-duotone.fa-users-medical:after,.fad.fa-users-medical:after{content:"\f830\f830"}.fa-duotone.fa-sensor-alert:after,.fa-duotone.fa-sensor-triangle-exclamation:after,.fad.fa-sensor-alert:after,.fad.fa-sensor-triangle-exclamation:after{content:"\e029\e029"}.fa-duotone.fa-magnifying-glass-arrow-right:after,.fad.fa-magnifying-glass-arrow-right:after{content:"\e521\e521"}.fa-duotone.fa-digital-tachograph:after,.fa-duotone.fa-tachograph-digital:after,.fad.fa-digital-tachograph:after,.fad.fa-tachograph-digital:after{content:"\f566\f566"}.fa-duotone.fa-face-mask:after,.fad.fa-face-mask:after{content:"\e37f\e37f"}.fa-duotone.fa-pickleball:after,.fad.fa-pickleball:after{content:"\e435\e435"}.fa-duotone.fa-star-sharp-half:after,.fad.fa-star-sharp-half:after{content:"\e28c\e28c"}.fa-duotone.fa-users-slash:after,.fad.fa-users-slash:after{content:"\e073\e073"}.fa-duotone.fa-clover:after,.fad.fa-clover:after{content:"\e139\e139"}.fa-duotone.fa-meat:after,.fad.fa-meat:after{content:"\f814\f814"}.fa-duotone.fa-mail-reply:after,.fa-duotone.fa-reply:after,.fad.fa-mail-reply:after,.fad.fa-reply:after{content:"\f3e5\f3e5"}.fa-duotone.fa-star-and-crescent:after,.fad.fa-star-and-crescent:after{content:"\f699\f699"}.fa-duotone.fa-empty-set:after,.fad.fa-empty-set:after{content:"\f656\f656"}.fa-duotone.fa-house-fire:after,.fad.fa-house-fire:after{content:"\e50c\e50c"}.fa-duotone.fa-minus-square:after,.fa-duotone.fa-square-minus:after,.fad.fa-minus-square:after,.fad.fa-square-minus:after{content:"\f146\f146"}.fa-duotone.fa-helicopter:after,.fad.fa-helicopter:after{content:"\f533\f533"}.fa-duotone.fa-bird:after,.fad.fa-bird:after{content:"\e469\e469"}.fa-duotone.fa-compass:after,.fad.fa-compass:after{content:"\f14e\f14e"}.fa-duotone.fa-caret-square-down:after,.fa-duotone.fa-square-caret-down:after,.fad.fa-caret-square-down:after,.fad.fa-square-caret-down:after{content:"\f150\f150"}.fa-duotone.fa-heart-half-alt:after,.fa-duotone.fa-heart-half-stroke:after,.fad.fa-heart-half-alt:after,.fad.fa-heart-half-stroke:after{content:"\e1ac\e1ac"}.fa-duotone.fa-file-circle-question:after,.fad.fa-file-circle-question:after{content:"\e4ef\e4ef"}.fa-duotone.fa-laptop-code:after,.fad.fa-laptop-code:after{content:"\f5fc\f5fc"}.fa-duotone.fa-joystick:after,.fad.fa-joystick:after{content:"\f8c5\f8c5"}.fa-duotone.fa-grill-fire:after,.fad.fa-grill-fire:after{content:"\e5a4\e5a4"}.fa-duotone.fa-rectangle-vertical-history:after,.fad.fa-rectangle-vertical-history:after{content:"\e237\e237"}.fa-duotone.fa-swatchbook:after,.fad.fa-swatchbook:after{content:"\f5c3\f5c3"}.fa-duotone.fa-prescription-bottle:after,.fad.fa-prescription-bottle:after{content:"\f485\f485"}.fa-duotone.fa-bars:after,.fa-duotone.fa-navicon:after,.fad.fa-bars:after,.fad.fa-navicon:after{content:"\f0c9\f0c9"}.fa-duotone.fa-keyboard-left:after,.fad.fa-keyboard-left:after{content:"\e1c3\e1c3"}.fa-duotone.fa-people-group:after,.fad.fa-people-group:after{content:"\e533\e533"}.fa-duotone.fa-hourglass-3:after,.fa-duotone.fa-hourglass-end:after,.fad.fa-hourglass-3:after,.fad.fa-hourglass-end:after{content:"\f253\f253"}.fa-duotone.fa-heart-broken:after,.fa-duotone.fa-heart-crack:after,.fad.fa-heart-broken:after,.fad.fa-heart-crack:after{content:"\f7a9\f7a9"}.fa-duotone.fa-face-beam-hand-over-mouth:after,.fad.fa-face-beam-hand-over-mouth:after{content:"\e47c\e47c"}.fa-duotone.fa-droplet-percent:after,.fa-duotone.fa-humidity:after,.fad.fa-droplet-percent:after,.fad.fa-humidity:after{content:"\f750\f750"}.fa-duotone.fa-external-link-square-alt:after,.fa-duotone.fa-square-up-right:after,.fad.fa-external-link-square-alt:after,.fad.fa-square-up-right:after{content:"\f360\f360"}.fa-duotone.fa-face-kiss-beam:after,.fa-duotone.fa-kiss-beam:after,.fad.fa-face-kiss-beam:after,.fad.fa-kiss-beam:after{content:"\f597\f597"}.fa-duotone.fa-corn:after,.fad.fa-corn:after{content:"\f6c7\f6c7"}.fa-duotone.fa-roller-coaster:after,.fad.fa-roller-coaster:after{content:"\e324\e324"}.fa-duotone.fa-photo-film-music:after,.fad.fa-photo-film-music:after{content:"\e228\e228"}.fa-duotone.fa-radar:after,.fad.fa-radar:after{content:"\e024\e024"}.fa-duotone.fa-sickle:after,.fad.fa-sickle:after{content:"\f822\f822"}.fa-duotone.fa-film:after,.fad.fa-film:after{content:"\f008\f008"}.fa-duotone.fa-coconut:after,.fad.fa-coconut:after{content:"\e2f6\e2f6"}.fa-duotone.fa-ruler-horizontal:after,.fad.fa-ruler-horizontal:after{content:"\f547\f547"}.fa-duotone.fa-shield-cross:after,.fad.fa-shield-cross:after{content:"\f712\f712"}.fa-duotone.fa-cassette-tape:after,.fad.fa-cassette-tape:after{content:"\f8ab\f8ab"}.fa-duotone.fa-square-terminal:after,.fad.fa-square-terminal:after{content:"\e32a\e32a"}.fa-duotone.fa-people-robbery:after,.fad.fa-people-robbery:after{content:"\e536\e536"}.fa-duotone.fa-lightbulb:after,.fad.fa-lightbulb:after{content:"\f0eb\f0eb"}.fa-duotone.fa-caret-left:after,.fad.fa-caret-left:after{content:"\f0d9\f0d9"}.fa-duotone.fa-comment-middle:after,.fad.fa-comment-middle:after{content:"\e149\e149"}.fa-duotone.fa-trash-can-list:after,.fad.fa-trash-can-list:after{content:"\e2ab\e2ab"}.fa-duotone.fa-block:after,.fad.fa-block:after{content:"\e46a\e46a"}.fa-duotone.fa-circle-exclamation:after,.fa-duotone.fa-exclamation-circle:after,.fad.fa-circle-exclamation:after,.fad.fa-exclamation-circle:after{content:"\f06a\f06a"}.fa-duotone.fa-school-circle-xmark:after,.fad.fa-school-circle-xmark:after{content:"\e56d\e56d"}.fa-duotone.fa-arrow-right-from-bracket:after,.fa-duotone.fa-sign-out:after,.fad.fa-arrow-right-from-bracket:after,.fad.fa-sign-out:after{content:"\f08b\f08b"}.fa-duotone.fa-face-frown-slight:after,.fad.fa-face-frown-slight:after{content:"\e376\e376"}.fa-duotone.fa-chevron-circle-down:after,.fa-duotone.fa-circle-chevron-down:after,.fad.fa-chevron-circle-down:after,.fad.fa-circle-chevron-down:after{content:"\f13a\f13a"}.fa-duotone.fa-sidebar-flip:after,.fad.fa-sidebar-flip:after{content:"\e24f\e24f"}.fa-duotone.fa-unlock-alt:after,.fa-duotone.fa-unlock-keyhole:after,.fad.fa-unlock-alt:after,.fad.fa-unlock-keyhole:after{content:"\f13e\f13e"}.fa-duotone.fa-temperature-list:after,.fad.fa-temperature-list:after{content:"\e299\e299"}.fa-duotone.fa-cloud-showers-heavy:after,.fad.fa-cloud-showers-heavy:after{content:"\f740\f740"}.fa-duotone.fa-headphones-alt:after,.fa-duotone.fa-headphones-simple:after,.fad.fa-headphones-alt:after,.fad.fa-headphones-simple:after{content:"\f58f\f58f"}.fa-duotone.fa-sitemap:after,.fad.fa-sitemap:after{content:"\f0e8\f0e8"}.fa-duotone.fa-pipe-section:after,.fad.fa-pipe-section:after{content:"\e438\e438"}.fa-duotone.fa-space-station-moon-alt:after,.fa-duotone.fa-space-station-moon-construction:after,.fad.fa-space-station-moon-alt:after,.fad.fa-space-station-moon-construction:after{content:"\e034\e034"}.fa-duotone.fa-circle-dollar-to-slot:after,.fa-duotone.fa-donate:after,.fad.fa-circle-dollar-to-slot:after,.fad.fa-donate:after{content:"\f4b9\f4b9"}.fa-duotone.fa-memory:after,.fad.fa-memory:after{content:"\f538\f538"}.fa-duotone.fa-face-sleeping:after,.fad.fa-face-sleeping:after{content:"\e38d\e38d"}.fa-duotone.fa-road-spikes:after,.fad.fa-road-spikes:after{content:"\e568\e568"}.fa-duotone.fa-fire-burner:after,.fad.fa-fire-burner:after{content:"\e4f1\e4f1"}.fa-duotone.fa-squirrel:after,.fad.fa-squirrel:after{content:"\f71a\f71a"}.fa-duotone.fa-arrow-to-top:after,.fa-duotone.fa-arrow-up-to-line:after,.fad.fa-arrow-to-top:after,.fad.fa-arrow-up-to-line:after{content:"\f341\f341"}.fa-duotone.fa-flag:after,.fad.fa-flag:after{content:"\f024\f024"}.fa-duotone.fa-face-cowboy-hat:after,.fad.fa-face-cowboy-hat:after{content:"\e36e\e36e"}.fa-duotone.fa-hanukiah:after,.fad.fa-hanukiah:after{content:"\f6e6\f6e6"}.fa-duotone.fa-chart-scatter-3d:after,.fad.fa-chart-scatter-3d:after{content:"\e0e8\e0e8"}.fa-duotone.fa-display-chart-up:after,.fad.fa-display-chart-up:after{content:"\e5e3\e5e3"}.fa-duotone.fa-square-code:after,.fad.fa-square-code:after{content:"\e267\e267"}.fa-duotone.fa-feather:after,.fad.fa-feather:after{content:"\f52d\f52d"}.fa-duotone.fa-volume-down:after,.fa-duotone.fa-volume-low:after,.fad.fa-volume-down:after,.fad.fa-volume-low:after{content:"\f027\f027"}.fa-duotone.fa-times-to-slot:after,.fa-duotone.fa-vote-nay:after,.fa-duotone.fa-xmark-to-slot:after,.fad.fa-times-to-slot:after,.fad.fa-vote-nay:after,.fad.fa-xmark-to-slot:after{content:"\f771\f771"}.fa-duotone.fa-box-alt:after,.fa-duotone.fa-box-taped:after,.fad.fa-box-alt:after,.fad.fa-box-taped:after{content:"\f49a\f49a"}.fa-duotone.fa-comment-slash:after,.fad.fa-comment-slash:after{content:"\f4b3\f4b3"}.fa-duotone.fa-swords:after,.fad.fa-swords:after{content:"\f71d\f71d"}.fa-duotone.fa-cloud-sun-rain:after,.fad.fa-cloud-sun-rain:after{content:"\f743\f743"}.fa-duotone.fa-album:after,.fad.fa-album:after{content:"\f89f\f89f"}.fa-duotone.fa-circle-n:after,.fad.fa-circle-n:after{content:"\e118\e118"}.fa-duotone.fa-compress:after,.fad.fa-compress:after{content:"\f066\f066"}.fa-duotone.fa-wheat-alt:after,.fa-duotone.fa-wheat-awn:after,.fad.fa-wheat-alt:after,.fad.fa-wheat-awn:after{content:"\e2cd\e2cd"}.fa-duotone.fa-ankh:after,.fad.fa-ankh:after{content:"\f644\f644"}.fa-duotone.fa-hands-holding-child:after,.fad.fa-hands-holding-child:after{content:"\e4fa\e4fa"}.fa-duotone.fa-asterisk:after,.fad.fa-asterisk:after{content:"\2a\2a"}.fa-duotone.fa-key-skeleton-left-right:after,.fad.fa-key-skeleton-left-right:after{content:"\e3b4\e3b4"}.fa-duotone.fa-comment-lines:after,.fad.fa-comment-lines:after{content:"\f4b0\f4b0"}.fa-duotone.fa-luchador-mask:after,.fa-duotone.fa-luchador:after,.fa-duotone.fa-mask-luchador:after,.fad.fa-luchador-mask:after,.fad.fa-luchador:after,.fad.fa-mask-luchador:after{content:"\f455\f455"}.fa-duotone.fa-check-square:after,.fa-duotone.fa-square-check:after,.fad.fa-check-square:after,.fad.fa-square-check:after{content:"\f14a\f14a"}.fa-duotone.fa-shredder:after,.fad.fa-shredder:after{content:"\f68a\f68a"}.fa-duotone.fa-book-open-alt:after,.fa-duotone.fa-book-open-cover:after,.fad.fa-book-open-alt:after,.fad.fa-book-open-cover:after{content:"\e0c0\e0c0"}.fa-duotone.fa-sandwich:after,.fad.fa-sandwich:after{content:"\f81f\f81f"}.fa-duotone.fa-peseta-sign:after,.fad.fa-peseta-sign:after{content:"\e221\e221"}.fa-duotone.fa-parking-slash:after,.fa-duotone.fa-square-parking-slash:after,.fad.fa-parking-slash:after,.fad.fa-square-parking-slash:after{content:"\f617\f617"}.fa-duotone.fa-train-tunnel:after,.fad.fa-train-tunnel:after{content:"\e454\e454"}.fa-duotone.fa-header:after,.fa-duotone.fa-heading:after,.fad.fa-header:after,.fad.fa-heading:after{content:"\f1dc\f1dc"}.fa-duotone.fa-ghost:after,.fad.fa-ghost:after{content:"\f6e2\f6e2"}.fa-duotone.fa-face-anguished:after,.fad.fa-face-anguished:after{content:"\e369\e369"}.fa-duotone.fa-hockey-sticks:after,.fad.fa-hockey-sticks:after{content:"\f454\f454"}.fa-duotone.fa-abacus:after,.fad.fa-abacus:after{content:"\f640\f640"}.fa-duotone.fa-film-alt:after,.fa-duotone.fa-film-simple:after,.fad.fa-film-alt:after,.fad.fa-film-simple:after{content:"\f3a0\f3a0"}.fa-duotone.fa-list-squares:after,.fa-duotone.fa-list:after,.fad.fa-list-squares:after,.fad.fa-list:after{content:"\f03a\f03a"}.fa-duotone.fa-tree-palm:after,.fad.fa-tree-palm:after{content:"\f82b\f82b"}.fa-duotone.fa-phone-square-alt:after,.fa-duotone.fa-square-phone-flip:after,.fad.fa-phone-square-alt:after,.fad.fa-square-phone-flip:after{content:"\f87b\f87b"}.fa-duotone.fa-cart-plus:after,.fad.fa-cart-plus:after{content:"\f217\f217"}.fa-duotone.fa-gamepad:after,.fad.fa-gamepad:after{content:"\f11b\f11b"}.fa-duotone.fa-border-center-v:after,.fad.fa-border-center-v:after{content:"\f89d\f89d"}.fa-duotone.fa-circle-dot:after,.fa-duotone.fa-dot-circle:after,.fad.fa-circle-dot:after,.fad.fa-dot-circle:after{content:"\f192\f192"}.fa-duotone.fa-clipboard-medical:after,.fad.fa-clipboard-medical:after{content:"\e133\e133"}.fa-duotone.fa-dizzy:after,.fa-duotone.fa-face-dizzy:after,.fad.fa-dizzy:after,.fad.fa-face-dizzy:after{content:"\f567\f567"}.fa-duotone.fa-egg:after,.fad.fa-egg:after{content:"\f7fb\f7fb"}.fa-duotone.fa-arrow-alt-to-top:after,.fa-duotone.fa-up-to-line:after,.fad.fa-arrow-alt-to-top:after,.fad.fa-up-to-line:after{content:"\f34d\f34d"}.fa-duotone.fa-house-medical-circle-xmark:after,.fad.fa-house-medical-circle-xmark:after{content:"\e513\e513"}.fa-duotone.fa-watch-fitness:after,.fad.fa-watch-fitness:after{content:"\f63e\f63e"}.fa-duotone.fa-clock-nine-thirty:after,.fad.fa-clock-nine-thirty:after{content:"\e34d\e34d"}.fa-duotone.fa-campground:after,.fad.fa-campground:after{content:"\f6bb\f6bb"}.fa-duotone.fa-folder-plus:after,.fad.fa-folder-plus:after{content:"\f65e\f65e"}.fa-duotone.fa-jug:after,.fad.fa-jug:after{content:"\f8c6\f8c6"}.fa-duotone.fa-futbol-ball:after,.fa-duotone.fa-futbol:after,.fa-duotone.fa-soccer-ball:after,.fad.fa-futbol-ball:after,.fad.fa-futbol:after,.fad.fa-soccer-ball:after{content:"\f1e3\f1e3"}.fa-duotone.fa-snow-blowing:after,.fad.fa-snow-blowing:after{content:"\f761\f761"}.fa-duotone.fa-paint-brush:after,.fa-duotone.fa-paintbrush:after,.fad.fa-paint-brush:after,.fad.fa-paintbrush:after{content:"\f1fc\f1fc"}.fa-duotone.fa-lock:after,.fad.fa-lock:after{content:"\f023\f023"}.fa-duotone.fa-arrow-down-from-line:after,.fa-duotone.fa-arrow-from-top:after,.fad.fa-arrow-down-from-line:after,.fad.fa-arrow-from-top:after{content:"\f345\f345"}.fa-duotone.fa-gas-pump:after,.fad.fa-gas-pump:after{content:"\f52f\f52f"}.fa-duotone.fa-signal-alt-slash:after,.fa-duotone.fa-signal-bars-slash:after,.fad.fa-signal-alt-slash:after,.fad.fa-signal-bars-slash:after{content:"\f694\f694"}.fa-duotone.fa-monkey:after,.fad.fa-monkey:after{content:"\f6fb\f6fb"}.fa-duotone.fa-pro:after,.fa-duotone.fa-rectangle-pro:after,.fad.fa-pro:after,.fad.fa-rectangle-pro:after{content:"\e235\e235"}.fa-duotone.fa-house-night:after,.fad.fa-house-night:after{content:"\e010\e010"}.fa-duotone.fa-hot-tub-person:after,.fa-duotone.fa-hot-tub:after,.fad.fa-hot-tub-person:after,.fad.fa-hot-tub:after{content:"\f593\f593"}.fa-duotone.fa-globe-pointer:after,.fad.fa-globe-pointer:after{content:"\e60e\e60e"}.fa-duotone.fa-blanket:after,.fad.fa-blanket:after{content:"\f498\f498"}.fa-duotone.fa-map-location:after,.fa-duotone.fa-map-marked:after,.fad.fa-map-location:after,.fad.fa-map-marked:after{content:"\f59f\f59f"}.fa-duotone.fa-house-flood-water:after,.fad.fa-house-flood-water:after{content:"\e50e\e50e"}.fa-duotone.fa-comments-question-check:after,.fad.fa-comments-question-check:after{content:"\e14f\e14f"}.fa-duotone.fa-tree:after,.fad.fa-tree:after{content:"\f1bb\f1bb"}.fa-duotone.fa-arrows-cross:after,.fad.fa-arrows-cross:after{content:"\e0a2\e0a2"}.fa-duotone.fa-backpack:after,.fad.fa-backpack:after{content:"\f5d4\f5d4"}.fa-duotone.fa-square-small:after,.fad.fa-square-small:after{content:"\e27e\e27e"}.fa-duotone.fa-folder-arrow-up:after,.fa-duotone.fa-folder-upload:after,.fad.fa-folder-arrow-up:after,.fad.fa-folder-upload:after{content:"\e054\e054"}.fa-duotone.fa-bridge-lock:after,.fad.fa-bridge-lock:after{content:"\e4cc\e4cc"}.fa-duotone.fa-crosshairs-simple:after,.fad.fa-crosshairs-simple:after{content:"\e59f\e59f"}.fa-duotone.fa-sack-dollar:after,.fad.fa-sack-dollar:after{content:"\f81d\f81d"}.fa-duotone.fa-edit:after,.fa-duotone.fa-pen-to-square:after,.fad.fa-edit:after,.fad.fa-pen-to-square:after{content:"\f044\f044"}.fa-duotone.fa-sliders-h-square:after,.fa-duotone.fa-square-sliders:after,.fad.fa-sliders-h-square:after,.fad.fa-square-sliders:after{content:"\f3f0\f3f0"}.fa-duotone.fa-car-side:after,.fad.fa-car-side:after{content:"\f5e4\f5e4"}.fa-duotone.fa-comment-middle-top-alt:after,.fa-duotone.fa-message-middle-top:after,.fad.fa-comment-middle-top-alt:after,.fad.fa-message-middle-top:after{content:"\e1e2\e1e2"}.fa-duotone.fa-lightbulb-on:after,.fad.fa-lightbulb-on:after{content:"\f672\f672"}.fa-duotone.fa-knife:after,.fa-duotone.fa-utensil-knife:after,.fad.fa-knife:after,.fad.fa-utensil-knife:after{content:"\f2e4\f2e4"}.fa-duotone.fa-share-alt:after,.fa-duotone.fa-share-nodes:after,.fad.fa-share-alt:after,.fad.fa-share-nodes:after{content:"\f1e0\f1e0"}.fa-duotone.fa-display-chart-up-circle-dollar:after,.fad.fa-display-chart-up-circle-dollar:after{content:"\e5e6\e5e6"}.fa-duotone.fa-wave-sine:after,.fad.fa-wave-sine:after{content:"\f899\f899"}.fa-duotone.fa-heart-circle-minus:after,.fad.fa-heart-circle-minus:after{content:"\e4ff\e4ff"}.fa-duotone.fa-circle-w:after,.fad.fa-circle-w:after{content:"\e12c\e12c"}.fa-duotone.fa-calendar-circle:after,.fa-duotone.fa-circle-calendar:after,.fad.fa-calendar-circle:after,.fad.fa-circle-calendar:after{content:"\e102\e102"}.fa-duotone.fa-hourglass-2:after,.fa-duotone.fa-hourglass-half:after,.fad.fa-hourglass-2:after,.fad.fa-hourglass-half:after{content:"\f252\f252"}.fa-duotone.fa-microscope:after,.fad.fa-microscope:after{content:"\f610\f610"}.fa-duotone.fa-sunset:after,.fad.fa-sunset:after{content:"\f767\f767"}.fa-duotone.fa-sink:after,.fad.fa-sink:after{content:"\e06d\e06d"}.fa-duotone.fa-calendar-exclamation:after,.fad.fa-calendar-exclamation:after{content:"\f334\f334"}.fa-duotone.fa-truck-container-empty:after,.fad.fa-truck-container-empty:after{content:"\e2b5\e2b5"}.fa-duotone.fa-hand-heart:after,.fad.fa-hand-heart:after{content:"\f4bc\f4bc"}.fa-duotone.fa-bag-shopping:after,.fa-duotone.fa-shopping-bag:after,.fad.fa-bag-shopping:after,.fad.fa-shopping-bag:after{content:"\f290\f290"}.fa-duotone.fa-arrow-down-z-a:after,.fa-duotone.fa-sort-alpha-desc:after,.fa-duotone.fa-sort-alpha-down-alt:after,.fad.fa-arrow-down-z-a:after,.fad.fa-sort-alpha-desc:after,.fad.fa-sort-alpha-down-alt:after{content:"\f881\f881"}.fa-duotone.fa-mitten:after,.fad.fa-mitten:after{content:"\f7b5\f7b5"}.fa-duotone.fa-reply-clock:after,.fa-duotone.fa-reply-time:after,.fad.fa-reply-clock:after,.fad.fa-reply-time:after{content:"\e239\e239"}.fa-duotone.fa-person-rays:after,.fad.fa-person-rays:after{content:"\e54d\e54d"}.fa-duotone.fa-arrow-alt-right:after,.fa-duotone.fa-right:after,.fad.fa-arrow-alt-right:after,.fad.fa-right:after{content:"\f356\f356"}.fa-duotone.fa-circle-f:after,.fad.fa-circle-f:after{content:"\e10e\e10e"}.fa-duotone.fa-users:after,.fad.fa-users:after{content:"\f0c0\f0c0"}.fa-duotone.fa-face-pleading:after,.fad.fa-face-pleading:after{content:"\e386\e386"}.fa-duotone.fa-eye-slash:after,.fad.fa-eye-slash:after{content:"\f070\f070"}.fa-duotone.fa-flask-vial:after,.fad.fa-flask-vial:after{content:"\e4f3\e4f3"}.fa-duotone.fa-police-box:after,.fad.fa-police-box:after{content:"\e021\e021"}.fa-duotone.fa-cucumber:after,.fad.fa-cucumber:after{content:"\e401\e401"}.fa-duotone.fa-head-side-brain:after,.fad.fa-head-side-brain:after{content:"\f808\f808"}.fa-duotone.fa-hand-paper:after,.fa-duotone.fa-hand:after,.fad.fa-hand-paper:after,.fad.fa-hand:after{content:"\f256\f256"}.fa-duotone.fa-biking-mountain:after,.fa-duotone.fa-person-biking-mountain:after,.fad.fa-biking-mountain:after,.fad.fa-person-biking-mountain:after{content:"\f84b\f84b"}.fa-duotone.fa-utensils-slash:after,.fad.fa-utensils-slash:after{content:"\e464\e464"}.fa-duotone.fa-print-magnifying-glass:after,.fa-duotone.fa-print-search:after,.fad.fa-print-magnifying-glass:after,.fad.fa-print-search:after{content:"\f81a\f81a"}.fa-duotone.fa-folder-bookmark:after,.fad.fa-folder-bookmark:after{content:"\e186\e186"}.fa-duotone.fa-om:after,.fad.fa-om:after{content:"\f679\f679"}.fa-duotone.fa-pi:after,.fad.fa-pi:after{content:"\f67e\f67e"}.fa-duotone.fa-flask-potion:after,.fa-duotone.fa-flask-round-potion:after,.fad.fa-flask-potion:after,.fad.fa-flask-round-potion:after{content:"\f6e1\f6e1"}.fa-duotone.fa-face-shush:after,.fad.fa-face-shush:after{content:"\e38c\e38c"}.fa-duotone.fa-worm:after,.fad.fa-worm:after{content:"\e599\e599"}.fa-duotone.fa-house-circle-xmark:after,.fad.fa-house-circle-xmark:after{content:"\e50b\e50b"}.fa-duotone.fa-plug:after,.fad.fa-plug:after{content:"\f1e6\f1e6"}.fa-duotone.fa-calendar-circle-exclamation:after,.fad.fa-calendar-circle-exclamation:after{content:"\e46e\e46e"}.fa-duotone.fa-square-i:after,.fad.fa-square-i:after{content:"\e272\e272"}.fa-duotone.fa-chevron-up:after,.fad.fa-chevron-up:after{content:"\f077\f077"}.fa-duotone.fa-face-saluting:after,.fad.fa-face-saluting:after{content:"\e484\e484"}.fa-duotone.fa-gauge-simple-low:after,.fa-duotone.fa-tachometer-slow:after,.fad.fa-gauge-simple-low:after,.fad.fa-tachometer-slow:after{content:"\f62c\f62c"}.fa-duotone.fa-face-persevering:after,.fad.fa-face-persevering:after{content:"\e385\e385"}.fa-duotone.fa-camera-circle:after,.fa-duotone.fa-circle-camera:after,.fad.fa-camera-circle:after,.fad.fa-circle-camera:after{content:"\e103\e103"}.fa-duotone.fa-hand-spock:after,.fad.fa-hand-spock:after{content:"\f259\f259"}.fa-duotone.fa-spider-web:after,.fad.fa-spider-web:after{content:"\f719\f719"}.fa-duotone.fa-circle-microphone:after,.fa-duotone.fa-microphone-circle:after,.fad.fa-circle-microphone:after,.fad.fa-microphone-circle:after{content:"\e116\e116"}.fa-duotone.fa-book-arrow-up:after,.fad.fa-book-arrow-up:after{content:"\e0ba\e0ba"}.fa-duotone.fa-popsicle:after,.fad.fa-popsicle:after{content:"\e43e\e43e"}.fa-duotone.fa-command:after,.fad.fa-command:after{content:"\e142\e142"}.fa-duotone.fa-blinds:after,.fad.fa-blinds:after{content:"\f8fb\f8fb"}.fa-duotone.fa-stopwatch:after,.fad.fa-stopwatch:after{content:"\f2f2\f2f2"}.fa-duotone.fa-saxophone:after,.fad.fa-saxophone:after{content:"\f8dc\f8dc"}.fa-duotone.fa-square-2:after,.fad.fa-square-2:after{content:"\e257\e257"}.fa-duotone.fa-field-hockey-stick-ball:after,.fa-duotone.fa-field-hockey:after,.fad.fa-field-hockey-stick-ball:after,.fad.fa-field-hockey:after{content:"\f44c\f44c"}.fa-duotone.fa-arrow-up-square-triangle:after,.fa-duotone.fa-sort-shapes-up-alt:after,.fad.fa-arrow-up-square-triangle:after,.fad.fa-sort-shapes-up-alt:after{content:"\f88b\f88b"}.fa-duotone.fa-face-scream:after,.fad.fa-face-scream:after{content:"\e38b\e38b"}.fa-duotone.fa-square-m:after,.fad.fa-square-m:after{content:"\e276\e276"}.fa-duotone.fa-camera-web:after,.fa-duotone.fa-webcam:after,.fad.fa-camera-web:after,.fad.fa-webcam:after{content:"\f832\f832"}.fa-duotone.fa-comment-arrow-down:after,.fad.fa-comment-arrow-down:after{content:"\e143\e143"}.fa-duotone.fa-lightbulb-cfl:after,.fad.fa-lightbulb-cfl:after{content:"\e5a6\e5a6"}.fa-duotone.fa-window-frame-open:after,.fad.fa-window-frame-open:after{content:"\e050\e050"}.fa-duotone.fa-face-kiss:after,.fa-duotone.fa-kiss:after,.fad.fa-face-kiss:after,.fad.fa-kiss:after{content:"\f596\f596"}.fa-duotone.fa-bridge-circle-xmark:after,.fad.fa-bridge-circle-xmark:after{content:"\e4cb\e4cb"}.fa-duotone.fa-period:after,.fad.fa-period:after{content:"\2e\2e"}.fa-duotone.fa-face-grin-tongue:after,.fa-duotone.fa-grin-tongue:after,.fad.fa-face-grin-tongue:after,.fad.fa-grin-tongue:after{content:"\f589\f589"}.fa-duotone.fa-up-to-dotted-line:after,.fad.fa-up-to-dotted-line:after{content:"\e457\e457"}.fa-duotone.fa-thought-bubble:after,.fad.fa-thought-bubble:after{content:"\e32e\e32e"}.fa-duotone.fa-skeleton-ribs:after,.fad.fa-skeleton-ribs:after{content:"\e5cb\e5cb"}.fa-duotone.fa-raygun:after,.fad.fa-raygun:after{content:"\e025\e025"}.fa-duotone.fa-flute:after,.fad.fa-flute:after{content:"\f8b9\f8b9"}.fa-duotone.fa-acorn:after,.fad.fa-acorn:after{content:"\f6ae\f6ae"}.fa-duotone.fa-video-arrow-up-right:after,.fad.fa-video-arrow-up-right:after{content:"\e2c9\e2c9"}.fa-duotone.fa-grate-droplet:after,.fad.fa-grate-droplet:after{content:"\e194\e194"}.fa-duotone.fa-seal-exclamation:after,.fad.fa-seal-exclamation:after{content:"\e242\e242"}.fa-duotone.fa-chess-bishop:after,.fad.fa-chess-bishop:after{content:"\f43a\f43a"}.fa-duotone.fa-message-sms:after,.fad.fa-message-sms:after{content:"\e1e5\e1e5"}.fa-duotone.fa-coffee-beans:after,.fad.fa-coffee-beans:after{content:"\e13f\e13f"}.fa-duotone.fa-hat-witch:after,.fad.fa-hat-witch:after{content:"\f6e7\f6e7"}.fa-duotone.fa-face-grin-wink:after,.fa-duotone.fa-grin-wink:after,.fad.fa-face-grin-wink:after,.fad.fa-grin-wink:after{content:"\f58c\f58c"}.fa-duotone.fa-clock-three-thirty:after,.fad.fa-clock-three-thirty:after{content:"\e357\e357"}.fa-duotone.fa-deaf:after,.fa-duotone.fa-deafness:after,.fa-duotone.fa-ear-deaf:after,.fa-duotone.fa-hard-of-hearing:after,.fad.fa-deaf:after,.fad.fa-deafness:after,.fad.fa-ear-deaf:after,.fad.fa-hard-of-hearing:after{content:"\f2a4\f2a4"}.fa-duotone.fa-alarm-clock:after,.fad.fa-alarm-clock:after{content:"\f34e\f34e"}.fa-duotone.fa-eclipse:after,.fad.fa-eclipse:after{content:"\f749\f749"}.fa-duotone.fa-face-relieved:after,.fad.fa-face-relieved:after{content:"\e389\e389"}.fa-duotone.fa-road-circle-check:after,.fad.fa-road-circle-check:after{content:"\e564\e564"}.fa-duotone.fa-dice-five:after,.fad.fa-dice-five:after{content:"\f523\f523"}.fa-duotone.fa-minus-octagon:after,.fa-duotone.fa-octagon-minus:after,.fad.fa-minus-octagon:after,.fad.fa-octagon-minus:after{content:"\f308\f308"}.fa-duotone.fa-rss-square:after,.fa-duotone.fa-square-rss:after,.fad.fa-rss-square:after,.fad.fa-square-rss:after{content:"\f143\f143"}.fa-duotone.fa-face-zany:after,.fad.fa-face-zany:after{content:"\e3a4\e3a4"}.fa-duotone.fa-tricycle:after,.fad.fa-tricycle:after{content:"\e5c3\e5c3"}.fa-duotone.fa-land-mine-on:after,.fad.fa-land-mine-on:after{content:"\e51b\e51b"}.fa-duotone.fa-square-arrow-up-left:after,.fad.fa-square-arrow-up-left:after{content:"\e263\e263"}.fa-duotone.fa-i-cursor:after,.fad.fa-i-cursor:after{content:"\f246\f246"}.fa-duotone.fa-chart-mixed-up-circle-dollar:after,.fad.fa-chart-mixed-up-circle-dollar:after{content:"\e5d9\e5d9"}.fa-duotone.fa-salt-shaker:after,.fad.fa-salt-shaker:after{content:"\e446\e446"}.fa-duotone.fa-stamp:after,.fad.fa-stamp:after{content:"\f5bf\f5bf"}.fa-duotone.fa-file-plus:after,.fad.fa-file-plus:after{content:"\f319\f319"}.fa-duotone.fa-draw-square:after,.fad.fa-draw-square:after{content:"\f5ef\f5ef"}.fa-duotone.fa-toilet-paper-reverse-slash:after,.fa-duotone.fa-toilet-paper-under-slash:after,.fad.fa-toilet-paper-reverse-slash:after,.fad.fa-toilet-paper-under-slash:after{content:"\e2a1\e2a1"}.fa-duotone.fa-stairs:after,.fad.fa-stairs:after{content:"\e289\e289"}.fa-duotone.fa-drone-alt:after,.fa-duotone.fa-drone-front:after,.fad.fa-drone-alt:after,.fad.fa-drone-front:after{content:"\f860\f860"}.fa-duotone.fa-glass-empty:after,.fad.fa-glass-empty:after{content:"\e191\e191"}.fa-duotone.fa-dial-high:after,.fad.fa-dial-high:after{content:"\e15c\e15c"}.fa-duotone.fa-user-construction:after,.fa-duotone.fa-user-hard-hat:after,.fa-duotone.fa-user-helmet-safety:after,.fad.fa-user-construction:after,.fad.fa-user-hard-hat:after,.fad.fa-user-helmet-safety:after{content:"\f82c\f82c"}.fa-duotone.fa-i:after,.fad.fa-i:after{content:"\49\49"}.fa-duotone.fa-hryvnia-sign:after,.fa-duotone.fa-hryvnia:after,.fad.fa-hryvnia-sign:after,.fad.fa-hryvnia:after{content:"\f6f2\f6f2"}.fa-duotone.fa-arrow-down-left-and-arrow-up-right-to-center:after,.fad.fa-arrow-down-left-and-arrow-up-right-to-center:after{content:"\e092\e092"}.fa-duotone.fa-pills:after,.fad.fa-pills:after{content:"\f484\f484"}.fa-duotone.fa-face-grin-wide:after,.fa-duotone.fa-grin-alt:after,.fad.fa-face-grin-wide:after,.fad.fa-grin-alt:after{content:"\f581\f581"}.fa-duotone.fa-tooth:after,.fad.fa-tooth:after{content:"\f5c9\f5c9"}.fa-duotone.fa-basketball-hoop:after,.fad.fa-basketball-hoop:after{content:"\f435\f435"}.fa-duotone.fa-objects-align-bottom:after,.fad.fa-objects-align-bottom:after{content:"\e3bb\e3bb"}.fa-duotone.fa-v:after,.fad.fa-v:after{content:"\56\56"}.fa-duotone.fa-sparkles:after,.fad.fa-sparkles:after{content:"\f890\f890"}.fa-duotone.fa-squid:after,.fad.fa-squid:after{content:"\e450\e450"}.fa-duotone.fa-leafy-green:after,.fad.fa-leafy-green:after{content:"\e41d\e41d"}.fa-duotone.fa-circle-arrow-up-right:after,.fad.fa-circle-arrow-up-right:after{content:"\e0fc\e0fc"}.fa-duotone.fa-calendars:after,.fad.fa-calendars:after{content:"\e0d7\e0d7"}.fa-duotone.fa-bangladeshi-taka-sign:after,.fad.fa-bangladeshi-taka-sign:after{content:"\e2e6\e2e6"}.fa-duotone.fa-bicycle:after,.fad.fa-bicycle:after{content:"\f206\f206"}.fa-duotone.fa-hammer-war:after,.fad.fa-hammer-war:after{content:"\f6e4\f6e4"}.fa-duotone.fa-circle-d:after,.fad.fa-circle-d:after{content:"\e104\e104"}.fa-duotone.fa-spider-black-widow:after,.fad.fa-spider-black-widow:after{content:"\f718\f718"}.fa-duotone.fa-rod-asclepius:after,.fa-duotone.fa-rod-snake:after,.fa-duotone.fa-staff-aesculapius:after,.fa-duotone.fa-staff-snake:after,.fad.fa-rod-asclepius:after,.fad.fa-rod-snake:after,.fad.fa-staff-aesculapius:after,.fad.fa-staff-snake:after{content:"\e579\e579"}.fa-duotone.fa-pear:after,.fad.fa-pear:after{content:"\e20c\e20c"}.fa-duotone.fa-head-side-cough-slash:after,.fad.fa-head-side-cough-slash:after{content:"\e062\e062"}.fa-duotone.fa-triangle:after,.fad.fa-triangle:after{content:"\f2ec\f2ec"}.fa-duotone.fa-apartment:after,.fad.fa-apartment:after{content:"\e468\e468"}.fa-duotone.fa-ambulance:after,.fa-duotone.fa-truck-medical:after,.fad.fa-ambulance:after,.fad.fa-truck-medical:after{content:"\f0f9\f0f9"}.fa-duotone.fa-pepper:after,.fad.fa-pepper:after{content:"\e432\e432"}.fa-duotone.fa-piano:after,.fad.fa-piano:after{content:"\f8d4\f8d4"}.fa-duotone.fa-gun-squirt:after,.fad.fa-gun-squirt:after{content:"\e19d\e19d"}.fa-duotone.fa-wheat-awn-circle-exclamation:after,.fad.fa-wheat-awn-circle-exclamation:after{content:"\e598\e598"}.fa-duotone.fa-snowman:after,.fad.fa-snowman:after{content:"\f7d0\f7d0"}.fa-duotone.fa-user-alien:after,.fad.fa-user-alien:after{content:"\e04a\e04a"}.fa-duotone.fa-shield-check:after,.fad.fa-shield-check:after{content:"\f2f7\f2f7"}.fa-duotone.fa-mortar-pestle:after,.fad.fa-mortar-pestle:after{content:"\f5a7\f5a7"}.fa-duotone.fa-road-barrier:after,.fad.fa-road-barrier:after{content:"\e562\e562"}.fa-duotone.fa-chart-candlestick:after,.fad.fa-chart-candlestick:after{content:"\e0e2\e0e2"}.fa-duotone.fa-briefcase-blank:after,.fad.fa-briefcase-blank:after{content:"\e0c8\e0c8"}.fa-duotone.fa-school:after,.fad.fa-school:after{content:"\f549\f549"}.fa-duotone.fa-igloo:after,.fad.fa-igloo:after{content:"\f7ae\f7ae"}.fa-duotone.fa-bracket-round:after,.fa-duotone.fa-parenthesis:after,.fad.fa-bracket-round:after,.fad.fa-parenthesis:after{content:"\28\28"}.fa-duotone.fa-joint:after,.fad.fa-joint:after{content:"\f595\f595"}.fa-duotone.fa-horse-saddle:after,.fad.fa-horse-saddle:after{content:"\f8c3\f8c3"}.fa-duotone.fa-mug-marshmallows:after,.fad.fa-mug-marshmallows:after{content:"\f7b7\f7b7"}.fa-duotone.fa-filters:after,.fad.fa-filters:after{content:"\e17e\e17e"}.fa-duotone.fa-bell-on:after,.fad.fa-bell-on:after{content:"\f8fa\f8fa"}.fa-duotone.fa-angle-right:after,.fad.fa-angle-right:after{content:"\f105\f105"}.fa-duotone.fa-dial-med:after,.fad.fa-dial-med:after{content:"\e15f\e15f"}.fa-duotone.fa-horse:after,.fad.fa-horse:after{content:"\f6f0\f6f0"}.fa-duotone.fa-q:after,.fad.fa-q:after{content:"\51\51"}.fa-duotone.fa-monitor-heart-rate:after,.fa-duotone.fa-monitor-waveform:after,.fad.fa-monitor-heart-rate:after,.fad.fa-monitor-waveform:after{content:"\f611\f611"}.fa-duotone.fa-link-simple:after,.fad.fa-link-simple:after{content:"\e1cd\e1cd"}.fa-duotone.fa-whistle:after,.fad.fa-whistle:after{content:"\f460\f460"}.fa-duotone.fa-g:after,.fad.fa-g:after{content:"\47\47"}.fa-duotone.fa-fragile:after,.fa-duotone.fa-wine-glass-crack:after,.fad.fa-fragile:after,.fad.fa-wine-glass-crack:after{content:"\f4bb\f4bb"}.fa-duotone.fa-slot-machine:after,.fad.fa-slot-machine:after{content:"\e3ce\e3ce"}.fa-duotone.fa-notes-medical:after,.fad.fa-notes-medical:after{content:"\f481\f481"}.fa-duotone.fa-car-wash:after,.fad.fa-car-wash:after{content:"\f5e6\f5e6"}.fa-duotone.fa-escalator:after,.fad.fa-escalator:after{content:"\e171\e171"}.fa-duotone.fa-comment-image:after,.fad.fa-comment-image:after{content:"\e148\e148"}.fa-duotone.fa-temperature-2:after,.fa-duotone.fa-temperature-half:after,.fa-duotone.fa-thermometer-2:after,.fa-duotone.fa-thermometer-half:after,.fad.fa-temperature-2:after,.fad.fa-temperature-half:after,.fad.fa-thermometer-2:after,.fad.fa-thermometer-half:after{content:"\f2c9\f2c9"}.fa-duotone.fa-dong-sign:after,.fad.fa-dong-sign:after{content:"\e169\e169"}.fa-duotone.fa-donut:after,.fa-duotone.fa-doughnut:after,.fad.fa-donut:after,.fad.fa-doughnut:after{content:"\e406\e406"}.fa-duotone.fa-capsules:after,.fad.fa-capsules:after{content:"\f46b\f46b"}.fa-duotone.fa-poo-bolt:after,.fa-duotone.fa-poo-storm:after,.fad.fa-poo-bolt:after,.fad.fa-poo-storm:after{content:"\f75a\f75a"}.fa-duotone.fa-tally-1:after,.fad.fa-tally-1:after{content:"\e294\e294"}.fa-duotone.fa-face-frown-open:after,.fa-duotone.fa-frown-open:after,.fad.fa-face-frown-open:after,.fad.fa-frown-open:after{content:"\f57a\f57a"}.fa-duotone.fa-square-dashed:after,.fad.fa-square-dashed:after{content:"\e269\e269"}.fa-duotone.fa-square-j:after,.fad.fa-square-j:after{content:"\e273\e273"}.fa-duotone.fa-hand-point-up:after,.fad.fa-hand-point-up:after{content:"\f0a6\f0a6"}.fa-duotone.fa-money-bill:after,.fad.fa-money-bill:after{content:"\f0d6\f0d6"}.fa-duotone.fa-arrow-up-big-small:after,.fa-duotone.fa-sort-size-up:after,.fad.fa-arrow-up-big-small:after,.fad.fa-sort-size-up:after{content:"\f88e\f88e"}.fa-duotone.fa-barcode-read:after,.fad.fa-barcode-read:after{content:"\f464\f464"}.fa-duotone.fa-baguette:after,.fad.fa-baguette:after{content:"\e3d8\e3d8"}.fa-duotone.fa-bowl-soft-serve:after,.fad.fa-bowl-soft-serve:after{content:"\e46b\e46b"}.fa-duotone.fa-face-holding-back-tears:after,.fad.fa-face-holding-back-tears:after{content:"\e482\e482"}.fa-duotone.fa-arrow-alt-square-up:after,.fa-duotone.fa-square-up:after,.fad.fa-arrow-alt-square-up:after,.fad.fa-square-up:after{content:"\f353\f353"}.fa-duotone.fa-subway-tunnel:after,.fa-duotone.fa-train-subway-tunnel:after,.fad.fa-subway-tunnel:after,.fad.fa-train-subway-tunnel:after{content:"\e2a3\e2a3"}.fa-duotone.fa-exclamation-square:after,.fa-duotone.fa-square-exclamation:after,.fad.fa-exclamation-square:after,.fad.fa-square-exclamation:after{content:"\f321\f321"}.fa-duotone.fa-semicolon:after,.fad.fa-semicolon:after{content:"\3b\3b"}.fa-duotone.fa-bookmark:after,.fad.fa-bookmark:after{content:"\f02e\f02e"}.fa-duotone.fa-fan-table:after,.fad.fa-fan-table:after{content:"\e004\e004"}.fa-duotone.fa-align-justify:after,.fad.fa-align-justify:after{content:"\f039\f039"}.fa-duotone.fa-battery-1:after,.fa-duotone.fa-battery-low:after,.fad.fa-battery-1:after,.fad.fa-battery-low:after{content:"\e0b1\e0b1"}.fa-duotone.fa-credit-card-front:after,.fad.fa-credit-card-front:after{content:"\f38a\f38a"}.fa-duotone.fa-brain-arrow-curved-right:after,.fa-duotone.fa-mind-share:after,.fad.fa-brain-arrow-curved-right:after,.fad.fa-mind-share:after{content:"\f677\f677"}.fa-duotone.fa-umbrella-beach:after,.fad.fa-umbrella-beach:after{content:"\f5ca\f5ca"}.fa-duotone.fa-helmet-un:after,.fad.fa-helmet-un:after{content:"\e503\e503"}.fa-duotone.fa-location-smile:after,.fa-duotone.fa-map-marker-smile:after,.fad.fa-location-smile:after,.fad.fa-map-marker-smile:after{content:"\f60d\f60d"}.fa-duotone.fa-arrow-left-to-line:after,.fa-duotone.fa-arrow-to-left:after,.fad.fa-arrow-left-to-line:after,.fad.fa-arrow-to-left:after{content:"\f33e\f33e"}.fa-duotone.fa-bullseye:after,.fad.fa-bullseye:after{content:"\f140\f140"}.fa-duotone.fa-nigiri:after,.fa-duotone.fa-sushi:after,.fad.fa-nigiri:after,.fad.fa-sushi:after{content:"\e48a\e48a"}.fa-duotone.fa-comment-alt-captions:after,.fa-duotone.fa-message-captions:after,.fad.fa-comment-alt-captions:after,.fad.fa-message-captions:after{content:"\e1de\e1de"}.fa-duotone.fa-trash-list:after,.fad.fa-trash-list:after{content:"\e2b1\e2b1"}.fa-duotone.fa-bacon:after,.fad.fa-bacon:after{content:"\f7e5\f7e5"}.fa-duotone.fa-option:after,.fad.fa-option:after{content:"\e318\e318"}.fa-duotone.fa-raccoon:after,.fad.fa-raccoon:after{content:"\e613\e613"}.fa-duotone.fa-hand-point-down:after,.fad.fa-hand-point-down:after{content:"\f0a7\f0a7"}.fa-duotone.fa-arrow-up-from-bracket:after,.fad.fa-arrow-up-from-bracket:after{content:"\e09a\e09a"}.fa-duotone.fa-head-side-gear:after,.fad.fa-head-side-gear:after{content:"\e611\e611"}.fa-duotone.fa-trash-plus:after,.fad.fa-trash-plus:after{content:"\e2b2\e2b2"}.fa-duotone.fa-objects-align-top:after,.fad.fa-objects-align-top:after{content:"\e3c0\e3c0"}.fa-duotone.fa-folder-blank:after,.fa-duotone.fa-folder:after,.fad.fa-folder-blank:after,.fad.fa-folder:after{content:"\f07b\f07b"}.fa-duotone.fa-face-anxious-sweat:after,.fad.fa-face-anxious-sweat:after{content:"\e36a\e36a"}.fa-duotone.fa-credit-card-blank:after,.fad.fa-credit-card-blank:after{content:"\f389\f389"}.fa-duotone.fa-file-medical-alt:after,.fa-duotone.fa-file-waveform:after,.fad.fa-file-medical-alt:after,.fad.fa-file-waveform:after{content:"\f478\f478"}.fa-duotone.fa-microchip-ai:after,.fad.fa-microchip-ai:after{content:"\e1ec\e1ec"}.fa-duotone.fa-mug:after,.fad.fa-mug:after{content:"\f874\f874"}.fa-duotone.fa-plane-up-slash:after,.fad.fa-plane-up-slash:after{content:"\e22e\e22e"}.fa-duotone.fa-radiation:after,.fad.fa-radiation:after{content:"\f7b9\f7b9"}.fa-duotone.fa-pen-circle:after,.fad.fa-pen-circle:after{content:"\e20e\e20e"}.fa-duotone.fa-bag-seedling:after,.fad.fa-bag-seedling:after{content:"\e5f2\e5f2"}.fa-duotone.fa-chart-simple:after,.fad.fa-chart-simple:after{content:"\e473\e473"}.fa-duotone.fa-crutches:after,.fad.fa-crutches:after{content:"\f7f8\f7f8"}.fa-duotone.fa-circle-parking:after,.fa-duotone.fa-parking-circle:after,.fad.fa-circle-parking:after,.fad.fa-parking-circle:after{content:"\f615\f615"}.fa-duotone.fa-mars-stroke:after,.fad.fa-mars-stroke:after{content:"\f229\f229"}.fa-duotone.fa-leaf-oak:after,.fad.fa-leaf-oak:after{content:"\f6f7\f6f7"}.fa-duotone.fa-square-bolt:after,.fad.fa-square-bolt:after{content:"\e265\e265"}.fa-duotone.fa-vial:after,.fad.fa-vial:after{content:"\f492\f492"}.fa-duotone.fa-dashboard:after,.fa-duotone.fa-gauge-med:after,.fa-duotone.fa-gauge:after,.fa-duotone.fa-tachometer-alt-average:after,.fad.fa-dashboard:after,.fad.fa-gauge-med:after,.fad.fa-gauge:after,.fad.fa-tachometer-alt-average:after{content:"\f624\f624"}.fa-duotone.fa-magic-wand-sparkles:after,.fa-duotone.fa-wand-magic-sparkles:after,.fad.fa-magic-wand-sparkles:after,.fad.fa-wand-magic-sparkles:after{content:"\e2ca\e2ca"}.fa-duotone.fa-lambda:after,.fad.fa-lambda:after{content:"\f66e\f66e"}.fa-duotone.fa-e:after,.fad.fa-e:after{content:"\45\45"}.fa-duotone.fa-pizza:after,.fad.fa-pizza:after{content:"\f817\f817"}.fa-duotone.fa-bowl-chopsticks-noodles:after,.fad.fa-bowl-chopsticks-noodles:after{content:"\e2ea\e2ea"}.fa-duotone.fa-h3:after,.fad.fa-h3:after{content:"\f315\f315"}.fa-duotone.fa-pen-alt:after,.fa-duotone.fa-pen-clip:after,.fad.fa-pen-alt:after,.fad.fa-pen-clip:after{content:"\f305\f305"}.fa-duotone.fa-bridge-circle-exclamation:after,.fad.fa-bridge-circle-exclamation:after{content:"\e4ca\e4ca"}.fa-duotone.fa-badge-percent:after,.fad.fa-badge-percent:after{content:"\f646\f646"}.fa-duotone.fa-user:after,.fad.fa-user:after{content:"\f007\f007"}.fa-duotone.fa-sensor:after,.fad.fa-sensor:after{content:"\e028\e028"}.fa-duotone.fa-comma:after,.fad.fa-comma:after{content:"\2c\2c"}.fa-duotone.fa-school-circle-check:after,.fad.fa-school-circle-check:after{content:"\e56b\e56b"}.fa-duotone.fa-toilet-paper-reverse:after,.fa-duotone.fa-toilet-paper-under:after,.fad.fa-toilet-paper-reverse:after,.fad.fa-toilet-paper-under:after{content:"\e2a0\e2a0"}.fa-duotone.fa-light-emergency:after,.fad.fa-light-emergency:after{content:"\e41f\e41f"}.fa-duotone.fa-arrow-down-to-arc:after,.fad.fa-arrow-down-to-arc:after{content:"\e4ae\e4ae"}.fa-duotone.fa-dumpster:after,.fad.fa-dumpster:after{content:"\f793\f793"}.fa-duotone.fa-shuttle-van:after,.fa-duotone.fa-van-shuttle:after,.fad.fa-shuttle-van:after,.fad.fa-van-shuttle:after{content:"\f5b6\f5b6"}.fa-duotone.fa-building-user:after,.fad.fa-building-user:after{content:"\e4da\e4da"}.fa-duotone.fa-light-switch:after,.fad.fa-light-switch:after{content:"\e017\e017"}.fa-duotone.fa-caret-square-left:after,.fa-duotone.fa-square-caret-left:after,.fad.fa-caret-square-left:after,.fad.fa-square-caret-left:after{content:"\f191\f191"}.fa-duotone.fa-highlighter:after,.fad.fa-highlighter:after{content:"\f591\f591"}.fa-duotone.fa-heart-rate:after,.fa-duotone.fa-wave-pulse:after,.fad.fa-heart-rate:after,.fad.fa-wave-pulse:after{content:"\f5f8\f5f8"}.fa-duotone.fa-key:after,.fad.fa-key:after{content:"\f084\f084"}.fa-duotone.fa-hat-santa:after,.fad.fa-hat-santa:after{content:"\f7a7\f7a7"}.fa-duotone.fa-tamale:after,.fad.fa-tamale:after{content:"\e451\e451"}.fa-duotone.fa-box-check:after,.fad.fa-box-check:after{content:"\f467\f467"}.fa-duotone.fa-bullhorn:after,.fad.fa-bullhorn:after{content:"\f0a1\f0a1"}.fa-duotone.fa-steak:after,.fad.fa-steak:after{content:"\f824\f824"}.fa-duotone.fa-location-crosshairs-slash:after,.fa-duotone.fa-location-slash:after,.fad.fa-location-crosshairs-slash:after,.fad.fa-location-slash:after{content:"\f603\f603"}.fa-duotone.fa-person-dolly:after,.fad.fa-person-dolly:after{content:"\f4d0\f4d0"}.fa-duotone.fa-globe:after,.fad.fa-globe:after{content:"\f0ac\f0ac"}.fa-duotone.fa-synagogue:after,.fad.fa-synagogue:after{content:"\f69b\f69b"}.fa-duotone.fa-file-chart-column:after,.fa-duotone.fa-file-chart-line:after,.fad.fa-file-chart-column:after,.fad.fa-file-chart-line:after{content:"\f659\f659"}.fa-duotone.fa-person-half-dress:after,.fad.fa-person-half-dress:after{content:"\e548\e548"}.fa-duotone.fa-folder-image:after,.fad.fa-folder-image:after{content:"\e18a\e18a"}.fa-duotone.fa-calendar-edit:after,.fa-duotone.fa-calendar-pen:after,.fad.fa-calendar-edit:after,.fad.fa-calendar-pen:after{content:"\f333\f333"}.fa-duotone.fa-road-bridge:after,.fad.fa-road-bridge:after{content:"\e563\e563"}.fa-duotone.fa-face-smile-tear:after,.fad.fa-face-smile-tear:after{content:"\e393\e393"}.fa-duotone.fa-comment-alt-plus:after,.fa-duotone.fa-message-plus:after,.fad.fa-comment-alt-plus:after,.fad.fa-message-plus:after{content:"\f4a8\f4a8"}.fa-duotone.fa-location-arrow:after,.fad.fa-location-arrow:after{content:"\f124\f124"}.fa-duotone.fa-c:after,.fad.fa-c:after{content:"\43\43"}.fa-duotone.fa-tablet-button:after,.fad.fa-tablet-button:after{content:"\f10a\f10a"}.fa-duotone.fa-person-dress-fairy:after,.fad.fa-person-dress-fairy:after{content:"\e607\e607"}.fa-duotone.fa-rectangle-history-circle-user:after,.fad.fa-rectangle-history-circle-user:after{content:"\e4a4\e4a4"}.fa-duotone.fa-building-lock:after,.fad.fa-building-lock:after{content:"\e4d6\e4d6"}.fa-duotone.fa-chart-line-up:after,.fad.fa-chart-line-up:after{content:"\e0e5\e0e5"}.fa-duotone.fa-mailbox:after,.fad.fa-mailbox:after{content:"\f813\f813"}.fa-duotone.fa-truck-bolt:after,.fad.fa-truck-bolt:after{content:"\e3d0\e3d0"}.fa-duotone.fa-pizza-slice:after,.fad.fa-pizza-slice:after{content:"\f818\f818"}.fa-duotone.fa-money-bill-wave:after,.fad.fa-money-bill-wave:after{content:"\f53a\f53a"}.fa-duotone.fa-area-chart:after,.fa-duotone.fa-chart-area:after,.fad.fa-area-chart:after,.fad.fa-chart-area:after{content:"\f1fe\f1fe"}.fa-duotone.fa-house-flag:after,.fad.fa-house-flag:after{content:"\e50d\e50d"}.fa-duotone.fa-circle-three-quarters-stroke:after,.fad.fa-circle-three-quarters-stroke:after{content:"\e5d4\e5d4"}.fa-duotone.fa-person-circle-minus:after,.fad.fa-person-circle-minus:after{content:"\e540\e540"}.fa-duotone.fa-scalpel:after,.fad.fa-scalpel:after{content:"\f61d\f61d"}.fa-duotone.fa-ban:after,.fa-duotone.fa-cancel:after,.fad.fa-ban:after,.fad.fa-cancel:after{content:"\f05e\f05e"}.fa-duotone.fa-bell-exclamation:after,.fad.fa-bell-exclamation:after{content:"\f848\f848"}.fa-duotone.fa-bookmark-circle:after,.fa-duotone.fa-circle-bookmark:after,.fad.fa-bookmark-circle:after,.fad.fa-circle-bookmark:after{content:"\e100\e100"}.fa-duotone.fa-egg-fried:after,.fad.fa-egg-fried:after{content:"\f7fc\f7fc"}.fa-duotone.fa-face-weary:after,.fad.fa-face-weary:after{content:"\e3a1\e3a1"}.fa-duotone.fa-uniform-martial-arts:after,.fad.fa-uniform-martial-arts:after{content:"\e3d1\e3d1"}.fa-duotone.fa-camera-rotate:after,.fad.fa-camera-rotate:after{content:"\e0d8\e0d8"}.fa-duotone.fa-sun-dust:after,.fad.fa-sun-dust:after{content:"\f764\f764"}.fa-duotone.fa-comment-text:after,.fad.fa-comment-text:after{content:"\e14d\e14d"}.fa-duotone.fa-air-freshener:after,.fa-duotone.fa-spray-can-sparkles:after,.fad.fa-air-freshener:after,.fad.fa-spray-can-sparkles:after{content:"\f5d0\f5d0"}.fa-duotone.fa-signal-alt-4:after,.fa-duotone.fa-signal-alt:after,.fa-duotone.fa-signal-bars-strong:after,.fa-duotone.fa-signal-bars:after,.fad.fa-signal-alt-4:after,.fad.fa-signal-alt:after,.fad.fa-signal-bars-strong:after,.fad.fa-signal-bars:after{content:"\f690\f690"}.fa-duotone.fa-diamond-exclamation:after,.fad.fa-diamond-exclamation:after{content:"\e405\e405"}.fa-duotone.fa-star:after,.fad.fa-star:after{content:"\f005\f005"}.fa-duotone.fa-dial-min:after,.fad.fa-dial-min:after{content:"\e161\e161"}.fa-duotone.fa-repeat:after,.fad.fa-repeat:after{content:"\f363\f363"}.fa-duotone.fa-cross:after,.fad.fa-cross:after{content:"\f654\f654"}.fa-duotone.fa-file-caret-down:after,.fa-duotone.fa-page-caret-down:after,.fad.fa-file-caret-down:after,.fad.fa-page-caret-down:after{content:"\e429\e429"}.fa-duotone.fa-box:after,.fad.fa-box:after{content:"\f466\f466"}.fa-duotone.fa-venus-mars:after,.fad.fa-venus-mars:after{content:"\f228\f228"}.fa-duotone.fa-clock-seven-thirty:after,.fad.fa-clock-seven-thirty:after{content:"\e351\e351"}.fa-duotone.fa-arrow-pointer:after,.fa-duotone.fa-mouse-pointer:after,.fad.fa-arrow-pointer:after,.fad.fa-mouse-pointer:after{content:"\f245\f245"}.fa-duotone.fa-clock-four-thirty:after,.fad.fa-clock-four-thirty:after{content:"\e34b\e34b"}.fa-duotone.fa-signal-alt-3:after,.fa-duotone.fa-signal-bars-good:after,.fad.fa-signal-alt-3:after,.fad.fa-signal-bars-good:after{content:"\f693\f693"}.fa-duotone.fa-cactus:after,.fad.fa-cactus:after{content:"\f8a7\f8a7"}.fa-duotone.fa-lightbulb-gear:after,.fad.fa-lightbulb-gear:after{content:"\e5fd\e5fd"}.fa-duotone.fa-expand-arrows-alt:after,.fa-duotone.fa-maximize:after,.fad.fa-expand-arrows-alt:after,.fad.fa-maximize:after{content:"\f31e\f31e"}.fa-duotone.fa-charging-station:after,.fad.fa-charging-station:after{content:"\f5e7\f5e7"}.fa-duotone.fa-shapes:after,.fa-duotone.fa-triangle-circle-square:after,.fad.fa-shapes:after,.fad.fa-triangle-circle-square:after{content:"\f61f\f61f"}.fa-duotone.fa-plane-tail:after,.fad.fa-plane-tail:after{content:"\e22c\e22c"}.fa-duotone.fa-gauge-simple-max:after,.fa-duotone.fa-tachometer-fastest:after,.fad.fa-gauge-simple-max:after,.fad.fa-tachometer-fastest:after{content:"\f62b\f62b"}.fa-duotone.fa-circle-u:after,.fad.fa-circle-u:after{content:"\e127\e127"}.fa-duotone.fa-shield-slash:after,.fad.fa-shield-slash:after{content:"\e24b\e24b"}.fa-duotone.fa-phone-square-down:after,.fa-duotone.fa-square-phone-hangup:after,.fad.fa-phone-square-down:after,.fad.fa-square-phone-hangup:after{content:"\e27a\e27a"}.fa-duotone.fa-arrow-up-left:after,.fad.fa-arrow-up-left:after{content:"\e09d\e09d"}.fa-duotone.fa-transporter-1:after,.fad.fa-transporter-1:after{content:"\e043\e043"}.fa-duotone.fa-peanuts:after,.fad.fa-peanuts:after{content:"\e431\e431"}.fa-duotone.fa-random:after,.fa-duotone.fa-shuffle:after,.fad.fa-random:after,.fad.fa-shuffle:after{content:"\f074\f074"}.fa-duotone.fa-person-running:after,.fa-duotone.fa-running:after,.fad.fa-person-running:after,.fad.fa-running:after{content:"\f70c\f70c"}.fa-duotone.fa-mobile-retro:after,.fad.fa-mobile-retro:after{content:"\e527\e527"}.fa-duotone.fa-grip-lines-vertical:after,.fad.fa-grip-lines-vertical:after{content:"\f7a5\f7a5"}.fa-duotone.fa-bin-bottles-recycle:after,.fad.fa-bin-bottles-recycle:after{content:"\e5f6\e5f6"}.fa-duotone.fa-arrow-up-from-square:after,.fad.fa-arrow-up-from-square:after{content:"\e09c\e09c"}.fa-duotone.fa-file-dashed-line:after,.fa-duotone.fa-page-break:after,.fad.fa-file-dashed-line:after,.fad.fa-page-break:after{content:"\f877\f877"}.fa-duotone.fa-bracket-curly-right:after,.fad.fa-bracket-curly-right:after{content:"\7d\7d"}.fa-duotone.fa-spider:after,.fad.fa-spider:after{content:"\f717\f717"}.fa-duotone.fa-clock-three:after,.fad.fa-clock-three:after{content:"\e356\e356"}.fa-duotone.fa-hands-bound:after,.fad.fa-hands-bound:after{content:"\e4f9\e4f9"}.fa-duotone.fa-scalpel-line-dashed:after,.fa-duotone.fa-scalpel-path:after,.fad.fa-scalpel-line-dashed:after,.fad.fa-scalpel-path:after{content:"\f61e\f61e"}.fa-duotone.fa-file-invoice-dollar:after,.fad.fa-file-invoice-dollar:after{content:"\f571\f571"}.fa-duotone.fa-pipe-smoking:after,.fad.fa-pipe-smoking:after{content:"\e3c4\e3c4"}.fa-duotone.fa-face-astonished:after,.fad.fa-face-astonished:after{content:"\e36b\e36b"}.fa-duotone.fa-window:after,.fad.fa-window:after{content:"\f40e\f40e"}.fa-duotone.fa-plane-circle-exclamation:after,.fad.fa-plane-circle-exclamation:after{content:"\e556\e556"}.fa-duotone.fa-ear:after,.fad.fa-ear:after{content:"\f5f0\f5f0"}.fa-duotone.fa-file-lock:after,.fad.fa-file-lock:after{content:"\e3a6\e3a6"}.fa-duotone.fa-diagram-venn:after,.fad.fa-diagram-venn:after{content:"\e15a\e15a"}.fa-duotone.fa-x-ray:after,.fad.fa-x-ray:after{content:"\f497\f497"}.fa-duotone.fa-goal-net:after,.fad.fa-goal-net:after{content:"\e3ab\e3ab"}.fa-duotone.fa-coffin-cross:after,.fad.fa-coffin-cross:after{content:"\e051\e051"}.fa-duotone.fa-spell-check:after,.fad.fa-spell-check:after{content:"\f891\f891"}.fa-duotone.fa-location-xmark:after,.fa-duotone.fa-map-marker-times:after,.fa-duotone.fa-map-marker-xmark:after,.fad.fa-location-xmark:after,.fad.fa-map-marker-times:after,.fad.fa-map-marker-xmark:after{content:"\f60e\f60e"}.fa-duotone.fa-circle-quarter-stroke:after,.fad.fa-circle-quarter-stroke:after{content:"\e5d3\e5d3"}.fa-duotone.fa-lasso:after,.fad.fa-lasso:after{content:"\f8c8\f8c8"}.fa-duotone.fa-slash:after,.fad.fa-slash:after{content:"\f715\f715"}.fa-duotone.fa-person-to-portal:after,.fa-duotone.fa-portal-enter:after,.fad.fa-person-to-portal:after,.fad.fa-portal-enter:after{content:"\e022\e022"}.fa-duotone.fa-calendar-star:after,.fad.fa-calendar-star:after{content:"\f736\f736"}.fa-duotone.fa-computer-mouse:after,.fa-duotone.fa-mouse:after,.fad.fa-computer-mouse:after,.fad.fa-mouse:after{content:"\f8cc\f8cc"}.fa-duotone.fa-arrow-right-to-bracket:after,.fa-duotone.fa-sign-in:after,.fad.fa-arrow-right-to-bracket:after,.fad.fa-sign-in:after{content:"\f090\f090"}.fa-duotone.fa-pegasus:after,.fad.fa-pegasus:after{content:"\f703\f703"}.fa-duotone.fa-files-medical:after,.fad.fa-files-medical:after{content:"\f7fd\f7fd"}.fa-duotone.fa-nfc-lock:after,.fad.fa-nfc-lock:after{content:"\e1f8\e1f8"}.fa-duotone.fa-person-ski-lift:after,.fa-duotone.fa-ski-lift:after,.fad.fa-person-ski-lift:after,.fad.fa-ski-lift:after{content:"\f7c8\f7c8"}.fa-duotone.fa-square-6:after,.fad.fa-square-6:after{content:"\e25b\e25b"}.fa-duotone.fa-shop-slash:after,.fa-duotone.fa-store-alt-slash:after,.fad.fa-shop-slash:after,.fad.fa-store-alt-slash:after{content:"\e070\e070"}.fa-duotone.fa-wind-turbine:after,.fad.fa-wind-turbine:after{content:"\f89b\f89b"}.fa-duotone.fa-sliders-simple:after,.fad.fa-sliders-simple:after{content:"\e253\e253"}.fa-duotone.fa-grid-round:after,.fad.fa-grid-round:after{content:"\e5da\e5da"}.fa-duotone.fa-badge-sheriff:after,.fad.fa-badge-sheriff:after{content:"\f8a2\f8a2"}.fa-duotone.fa-server:after,.fad.fa-server:after{content:"\f233\f233"}.fa-duotone.fa-virus-covid-slash:after,.fad.fa-virus-covid-slash:after{content:"\e4a9\e4a9"}.fa-duotone.fa-intersection:after,.fad.fa-intersection:after{content:"\f668\f668"}.fa-duotone.fa-shop-lock:after,.fad.fa-shop-lock:after{content:"\e4a5\e4a5"}.fa-duotone.fa-family:after,.fad.fa-family:after{content:"\e300\e300"}.fa-duotone.fa-hourglass-1:after,.fa-duotone.fa-hourglass-start:after,.fad.fa-hourglass-1:after,.fad.fa-hourglass-start:after{content:"\f251\f251"}.fa-duotone.fa-user-hair-buns:after,.fad.fa-user-hair-buns:after{content:"\e3d3\e3d3"}.fa-duotone.fa-blender-phone:after,.fad.fa-blender-phone:after{content:"\f6b6\f6b6"}.fa-duotone.fa-hourglass-clock:after,.fad.fa-hourglass-clock:after{content:"\e41b\e41b"}.fa-duotone.fa-person-seat-reclined:after,.fad.fa-person-seat-reclined:after{content:"\e21f\e21f"}.fa-duotone.fa-paper-plane-alt:after,.fa-duotone.fa-paper-plane-top:after,.fa-duotone.fa-send:after,.fad.fa-paper-plane-alt:after,.fad.fa-paper-plane-top:after,.fad.fa-send:after{content:"\e20a\e20a"}.fa-duotone.fa-comment-alt-arrow-up:after,.fa-duotone.fa-message-arrow-up:after,.fad.fa-comment-alt-arrow-up:after,.fad.fa-message-arrow-up:after{content:"\e1dc\e1dc"}.fa-duotone.fa-lightbulb-exclamation:after,.fad.fa-lightbulb-exclamation:after{content:"\f671\f671"}.fa-duotone.fa-layer-group-minus:after,.fa-duotone.fa-layer-minus:after,.fad.fa-layer-group-minus:after,.fad.fa-layer-minus:after{content:"\f5fe\f5fe"}.fa-duotone.fa-chart-pie-simple-circle-currency:after,.fad.fa-chart-pie-simple-circle-currency:after{content:"\e604\e604"}.fa-duotone.fa-circle-e:after,.fad.fa-circle-e:after{content:"\e109\e109"}.fa-duotone.fa-building-wheat:after,.fad.fa-building-wheat:after{content:"\e4db\e4db"}.fa-duotone.fa-gauge-max:after,.fa-duotone.fa-tachometer-alt-fastest:after,.fad.fa-gauge-max:after,.fad.fa-tachometer-alt-fastest:after{content:"\f626\f626"}.fa-duotone.fa-person-breastfeeding:after,.fad.fa-person-breastfeeding:after{content:"\e53a\e53a"}.fa-duotone.fa-apostrophe:after,.fad.fa-apostrophe:after{content:"\27\27"}.fa-duotone.fa-fire-hydrant:after,.fad.fa-fire-hydrant:after{content:"\e17f\e17f"}.fa-duotone.fa-right-to-bracket:after,.fa-duotone.fa-sign-in-alt:after,.fad.fa-right-to-bracket:after,.fad.fa-sign-in-alt:after{content:"\f2f6\f2f6"}.fa-duotone.fa-video-plus:after,.fad.fa-video-plus:after{content:"\f4e1\f4e1"}.fa-duotone.fa-arrow-alt-square-right:after,.fa-duotone.fa-square-right:after,.fad.fa-arrow-alt-square-right:after,.fad.fa-square-right:after{content:"\f352\f352"}.fa-duotone.fa-comment-smile:after,.fad.fa-comment-smile:after{content:"\f4b4\f4b4"}.fa-duotone.fa-venus:after,.fad.fa-venus:after{content:"\f221\f221"}.fa-duotone.fa-passport:after,.fad.fa-passport:after{content:"\f5ab\f5ab"}.fa-duotone.fa-inbox-arrow-down:after,.fa-duotone.fa-inbox-in:after,.fad.fa-inbox-arrow-down:after,.fad.fa-inbox-in:after{content:"\f310\f310"}.fa-duotone.fa-heart-pulse:after,.fa-duotone.fa-heartbeat:after,.fad.fa-heart-pulse:after,.fad.fa-heartbeat:after{content:"\f21e\f21e"}.fa-duotone.fa-circle-8:after,.fad.fa-circle-8:after{content:"\e0f5\e0f5"}.fa-duotone.fa-clouds-moon:after,.fad.fa-clouds-moon:after{content:"\f745\f745"}.fa-duotone.fa-clock-ten-thirty:after,.fad.fa-clock-ten-thirty:after{content:"\e355\e355"}.fa-duotone.fa-people-carry-box:after,.fa-duotone.fa-people-carry:after,.fad.fa-people-carry-box:after,.fad.fa-people-carry:after{content:"\f4ce\f4ce"}.fa-duotone.fa-folder-user:after,.fad.fa-folder-user:after{content:"\e18e\e18e"}.fa-duotone.fa-trash-can-xmark:after,.fad.fa-trash-can-xmark:after{content:"\e2ae\e2ae"}.fa-duotone.fa-temperature-high:after,.fad.fa-temperature-high:after{content:"\f769\f769"}.fa-duotone.fa-microchip:after,.fad.fa-microchip:after{content:"\f2db\f2db"}.fa-duotone.fa-left-long-to-line:after,.fad.fa-left-long-to-line:after{content:"\e41e\e41e"}.fa-duotone.fa-crown:after,.fad.fa-crown:after{content:"\f521\f521"}.fa-duotone.fa-weight-hanging:after,.fad.fa-weight-hanging:after{content:"\f5cd\f5cd"}.fa-duotone.fa-xmarks-lines:after,.fad.fa-xmarks-lines:after{content:"\e59a\e59a"}.fa-duotone.fa-file-prescription:after,.fad.fa-file-prescription:after{content:"\f572\f572"}.fa-duotone.fa-calendar-range:after,.fad.fa-calendar-range:after{content:"\e0d6\e0d6"}.fa-duotone.fa-flower-daffodil:after,.fad.fa-flower-daffodil:after{content:"\f800\f800"}.fa-duotone.fa-hand-back-point-up:after,.fad.fa-hand-back-point-up:after{content:"\e1a2\e1a2"}.fa-duotone.fa-weight-scale:after,.fa-duotone.fa-weight:after,.fad.fa-weight-scale:after,.fad.fa-weight:after{content:"\f496\f496"}.fa-duotone.fa-arrow-up-to-arc:after,.fad.fa-arrow-up-to-arc:after{content:"\e617\e617"}.fa-duotone.fa-star-exclamation:after,.fad.fa-star-exclamation:after{content:"\f2f3\f2f3"}.fa-duotone.fa-books:after,.fad.fa-books:after{content:"\f5db\f5db"}.fa-duotone.fa-user-friends:after,.fa-duotone.fa-user-group:after,.fad.fa-user-friends:after,.fad.fa-user-group:after{content:"\f500\f500"}.fa-duotone.fa-arrow-up-a-z:after,.fa-duotone.fa-sort-alpha-up:after,.fad.fa-arrow-up-a-z:after,.fad.fa-sort-alpha-up:after{content:"\f15e\f15e"}.fa-duotone.fa-layer-group-plus:after,.fa-duotone.fa-layer-plus:after,.fad.fa-layer-group-plus:after,.fad.fa-layer-plus:after{content:"\f5ff\f5ff"}.fa-duotone.fa-play-pause:after,.fad.fa-play-pause:after{content:"\e22f\e22f"}.fa-duotone.fa-block-question:after,.fad.fa-block-question:after{content:"\e3dd\e3dd"}.fa-duotone.fa-snooze:after,.fa-duotone.fa-zzz:after,.fad.fa-snooze:after,.fad.fa-zzz:after{content:"\f880\f880"}.fa-duotone.fa-scanner-image:after,.fad.fa-scanner-image:after{content:"\f8f3\f8f3"}.fa-duotone.fa-tv-retro:after,.fad.fa-tv-retro:after{content:"\f401\f401"}.fa-duotone.fa-square-t:after,.fad.fa-square-t:after{content:"\e280\e280"}.fa-duotone.fa-barn-silo:after,.fa-duotone.fa-farm:after,.fad.fa-barn-silo:after,.fad.fa-farm:after{content:"\f864\f864"}.fa-duotone.fa-chess-knight:after,.fad.fa-chess-knight:after{content:"\f441\f441"}.fa-duotone.fa-bars-sort:after,.fad.fa-bars-sort:after{content:"\e0ae\e0ae"}.fa-duotone.fa-palette-boxes:after,.fa-duotone.fa-pallet-alt:after,.fa-duotone.fa-pallet-boxes:after,.fad.fa-palette-boxes:after,.fad.fa-pallet-alt:after,.fad.fa-pallet-boxes:after{content:"\f483\f483"}.fa-duotone.fa-face-laugh-squint:after,.fa-duotone.fa-laugh-squint:after,.fad.fa-face-laugh-squint:after,.fad.fa-laugh-squint:after{content:"\f59b\f59b"}.fa-duotone.fa-code-simple:after,.fad.fa-code-simple:after{content:"\e13d\e13d"}.fa-duotone.fa-bolt-slash:after,.fad.fa-bolt-slash:after{content:"\e0b8\e0b8"}.fa-duotone.fa-panel-fire:after,.fad.fa-panel-fire:after{content:"\e42f\e42f"}.fa-duotone.fa-binary-circle-check:after,.fad.fa-binary-circle-check:after{content:"\e33c\e33c"}.fa-duotone.fa-comment-minus:after,.fad.fa-comment-minus:after{content:"\f4b1\f4b1"}.fa-duotone.fa-burrito:after,.fad.fa-burrito:after{content:"\f7ed\f7ed"}.fa-duotone.fa-violin:after,.fad.fa-violin:after{content:"\f8ed\f8ed"}.fa-duotone.fa-objects-column:after,.fad.fa-objects-column:after{content:"\e3c1\e3c1"}.fa-duotone.fa-chevron-square-down:after,.fa-duotone.fa-square-chevron-down:after,.fad.fa-chevron-square-down:after,.fad.fa-square-chevron-down:after{content:"\f329\f329"}.fa-duotone.fa-comment-plus:after,.fad.fa-comment-plus:after{content:"\f4b2\f4b2"}.fa-duotone.fa-triangle-instrument:after,.fa-duotone.fa-triangle-music:after,.fad.fa-triangle-instrument:after,.fad.fa-triangle-music:after{content:"\f8e2\f8e2"}.fa-duotone.fa-wheelchair:after,.fad.fa-wheelchair:after{content:"\f193\f193"}.fa-duotone.fa-user-pilot-tie:after,.fad.fa-user-pilot-tie:after{content:"\e2c1\e2c1"}.fa-duotone.fa-piano-keyboard:after,.fad.fa-piano-keyboard:after{content:"\f8d5\f8d5"}.fa-duotone.fa-bed-empty:after,.fad.fa-bed-empty:after{content:"\f8f9\f8f9"}.fa-duotone.fa-arrow-circle-up:after,.fa-duotone.fa-circle-arrow-up:after,.fad.fa-arrow-circle-up:after,.fad.fa-circle-arrow-up:after{content:"\f0aa\f0aa"}.fa-duotone.fa-toggle-on:after,.fad.fa-toggle-on:after{content:"\f205\f205"}.fa-duotone.fa-rectangle-portrait:after,.fa-duotone.fa-rectangle-vertical:after,.fad.fa-rectangle-portrait:after,.fad.fa-rectangle-vertical:after{content:"\f2fb\f2fb"}.fa-duotone.fa-person-walking:after,.fa-duotone.fa-walking:after,.fad.fa-person-walking:after,.fad.fa-walking:after{content:"\f554\f554"}.fa-duotone.fa-l:after,.fad.fa-l:after{content:"\4c\4c"}.fa-duotone.fa-signal-stream:after,.fad.fa-signal-stream:after{content:"\f8dd\f8dd"}.fa-duotone.fa-down-to-bracket:after,.fad.fa-down-to-bracket:after{content:"\e4e7\e4e7"}.fa-duotone.fa-circle-z:after,.fad.fa-circle-z:after{content:"\e130\e130"}.fa-duotone.fa-stars:after,.fad.fa-stars:after{content:"\f762\f762"}.fa-duotone.fa-fire:after,.fad.fa-fire:after{content:"\f06d\f06d"}.fa-duotone.fa-bed-pulse:after,.fa-duotone.fa-procedures:after,.fad.fa-bed-pulse:after,.fad.fa-procedures:after{content:"\f487\f487"}.fa-duotone.fa-house-day:after,.fad.fa-house-day:after{content:"\e00e\e00e"}.fa-duotone.fa-shuttle-space:after,.fa-duotone.fa-space-shuttle:after,.fad.fa-shuttle-space:after,.fad.fa-space-shuttle:after{content:"\f197\f197"}.fa-duotone.fa-shirt-long-sleeve:after,.fad.fa-shirt-long-sleeve:after{content:"\e3c7\e3c7"}.fa-duotone.fa-chart-pie-alt:after,.fa-duotone.fa-chart-pie-simple:after,.fad.fa-chart-pie-alt:after,.fad.fa-chart-pie-simple:after{content:"\f64e\f64e"}.fa-duotone.fa-face-laugh:after,.fa-duotone.fa-laugh:after,.fad.fa-face-laugh:after,.fad.fa-laugh:after{content:"\f599\f599"}.fa-duotone.fa-folder-open:after,.fad.fa-folder-open:after{content:"\f07c\f07c"}.fa-duotone.fa-album-collection-circle-user:after,.fad.fa-album-collection-circle-user:after{content:"\e48f\e48f"}.fa-duotone.fa-candy:after,.fad.fa-candy:after{content:"\e3e7\e3e7"}.fa-duotone.fa-bowl-hot:after,.fa-duotone.fa-soup:after,.fad.fa-bowl-hot:after,.fad.fa-soup:after{content:"\f823\f823"}.fa-duotone.fa-flatbread:after,.fad.fa-flatbread:after{content:"\e40b\e40b"}.fa-duotone.fa-heart-circle-plus:after,.fad.fa-heart-circle-plus:after{content:"\e500\e500"}.fa-duotone.fa-code-fork:after,.fad.fa-code-fork:after{content:"\e13b\e13b"}.fa-duotone.fa-city:after,.fad.fa-city:after{content:"\f64f\f64f"}.fa-duotone.fa-signal-alt-1:after,.fa-duotone.fa-signal-bars-weak:after,.fad.fa-signal-alt-1:after,.fad.fa-signal-bars-weak:after{content:"\f691\f691"}.fa-duotone.fa-microphone-alt:after,.fa-duotone.fa-microphone-lines:after,.fad.fa-microphone-alt:after,.fad.fa-microphone-lines:after{content:"\f3c9\f3c9"}.fa-duotone.fa-clock-twelve:after,.fad.fa-clock-twelve:after{content:"\e358\e358"}.fa-duotone.fa-pepper-hot:after,.fad.fa-pepper-hot:after{content:"\f816\f816"}.fa-duotone.fa-citrus-slice:after,.fad.fa-citrus-slice:after{content:"\e2f5\e2f5"}.fa-duotone.fa-sheep:after,.fad.fa-sheep:after{content:"\f711\f711"}.fa-duotone.fa-unlock:after,.fad.fa-unlock:after{content:"\f09c\f09c"}.fa-duotone.fa-colon-sign:after,.fad.fa-colon-sign:after{content:"\e140\e140"}.fa-duotone.fa-headset:after,.fad.fa-headset:after{content:"\f590\f590"}.fa-duotone.fa-badger-honey:after,.fad.fa-badger-honey:after{content:"\f6b4\f6b4"}.fa-duotone.fa-h4:after,.fad.fa-h4:after{content:"\f86a\f86a"}.fa-duotone.fa-store-slash:after,.fad.fa-store-slash:after{content:"\e071\e071"}.fa-duotone.fa-road-circle-xmark:after,.fad.fa-road-circle-xmark:after{content:"\e566\e566"}.fa-duotone.fa-signal-slash:after,.fad.fa-signal-slash:after{content:"\f695\f695"}.fa-duotone.fa-user-minus:after,.fad.fa-user-minus:after{content:"\f503\f503"}.fa-duotone.fa-mars-stroke-up:after,.fa-duotone.fa-mars-stroke-v:after,.fad.fa-mars-stroke-up:after,.fad.fa-mars-stroke-v:after{content:"\f22a\f22a"}.fa-duotone.fa-champagne-glasses:after,.fa-duotone.fa-glass-cheers:after,.fad.fa-champagne-glasses:after,.fad.fa-glass-cheers:after{content:"\f79f\f79f"}.fa-duotone.fa-taco:after,.fad.fa-taco:after{content:"\f826\f826"}.fa-duotone.fa-hexagon-plus:after,.fa-duotone.fa-plus-hexagon:after,.fad.fa-hexagon-plus:after,.fad.fa-plus-hexagon:after{content:"\f300\f300"}.fa-duotone.fa-clipboard:after,.fad.fa-clipboard:after{content:"\f328\f328"}.fa-duotone.fa-house-circle-exclamation:after,.fad.fa-house-circle-exclamation:after{content:"\e50a\e50a"}.fa-duotone.fa-file-arrow-up:after,.fa-duotone.fa-file-upload:after,.fad.fa-file-arrow-up:after,.fad.fa-file-upload:after{content:"\f574\f574"}.fa-duotone.fa-wifi-3:after,.fa-duotone.fa-wifi-strong:after,.fa-duotone.fa-wifi:after,.fad.fa-wifi-3:after,.fad.fa-wifi-strong:after,.fad.fa-wifi:after{content:"\f1eb\f1eb"}.fa-duotone.fa-comments-alt:after,.fa-duotone.fa-messages:after,.fad.fa-comments-alt:after,.fad.fa-messages:after{content:"\f4b6\f4b6"}.fa-duotone.fa-bath:after,.fa-duotone.fa-bathtub:after,.fad.fa-bath:after,.fad.fa-bathtub:after{content:"\f2cd\f2cd"}.fa-duotone.fa-umbrella-alt:after,.fa-duotone.fa-umbrella-simple:after,.fad.fa-umbrella-alt:after,.fad.fa-umbrella-simple:after{content:"\e2bc\e2bc"}.fa-duotone.fa-rectangle-history-circle-plus:after,.fad.fa-rectangle-history-circle-plus:after{content:"\e4a3\e4a3"}.fa-duotone.fa-underline:after,.fad.fa-underline:after{content:"\f0cd\f0cd"}.fa-duotone.fa-prescription-bottle-pill:after,.fad.fa-prescription-bottle-pill:after{content:"\e5c0\e5c0"}.fa-duotone.fa-user-edit:after,.fa-duotone.fa-user-pen:after,.fad.fa-user-edit:after,.fad.fa-user-pen:after{content:"\f4ff\f4ff"}.fa-duotone.fa-binary-slash:after,.fad.fa-binary-slash:after{content:"\e33e\e33e"}.fa-duotone.fa-square-o:after,.fad.fa-square-o:after{content:"\e278\e278"}.fa-duotone.fa-signature:after,.fad.fa-signature:after{content:"\f5b7\f5b7"}.fa-duotone.fa-stroopwafel:after,.fad.fa-stroopwafel:after{content:"\f551\f551"}.fa-duotone.fa-bold:after,.fad.fa-bold:after{content:"\f032\f032"}.fa-duotone.fa-anchor-lock:after,.fad.fa-anchor-lock:after{content:"\e4ad\e4ad"}.fa-duotone.fa-building-ngo:after,.fad.fa-building-ngo:after{content:"\e4d7\e4d7"}.fa-duotone.fa-transporter-3:after,.fad.fa-transporter-3:after{content:"\e045\e045"}.fa-duotone.fa-engine-exclamation:after,.fa-duotone.fa-engine-warning:after,.fad.fa-engine-exclamation:after,.fad.fa-engine-warning:after{content:"\f5f2\f5f2"}.fa-duotone.fa-circle-down-right:after,.fad.fa-circle-down-right:after{content:"\e108\e108"}.fa-duotone.fa-square-k:after,.fad.fa-square-k:after{content:"\e274\e274"}.fa-duotone.fa-manat-sign:after,.fad.fa-manat-sign:after{content:"\e1d5\e1d5"}.fa-duotone.fa-money-check-edit:after,.fa-duotone.fa-money-check-pen:after,.fad.fa-money-check-edit:after,.fad.fa-money-check-pen:after{content:"\f872\f872"}.fa-duotone.fa-not-equal:after,.fad.fa-not-equal:after{content:"\f53e\f53e"}.fa-duotone.fa-border-style:after,.fa-duotone.fa-border-top-left:after,.fad.fa-border-style:after,.fad.fa-border-top-left:after{content:"\f853\f853"}.fa-duotone.fa-map-location-dot:after,.fa-duotone.fa-map-marked-alt:after,.fad.fa-map-location-dot:after,.fad.fa-map-marked-alt:after{content:"\f5a0\f5a0"}.fa-duotone.fa-tilde:after,.fad.fa-tilde:after{content:"\7e\7e"}.fa-duotone.fa-jedi:after,.fad.fa-jedi:after{content:"\f669\f669"}.fa-duotone.fa-poll:after,.fa-duotone.fa-square-poll-vertical:after,.fad.fa-poll:after,.fad.fa-square-poll-vertical:after{content:"\f681\f681"}.fa-duotone.fa-arrow-down-square-triangle:after,.fa-duotone.fa-sort-shapes-down-alt:after,.fad.fa-arrow-down-square-triangle:after,.fad.fa-sort-shapes-down-alt:after{content:"\f889\f889"}.fa-duotone.fa-mug-hot:after,.fad.fa-mug-hot:after{content:"\f7b6\f7b6"}.fa-duotone.fa-dog-leashed:after,.fad.fa-dog-leashed:after{content:"\f6d4\f6d4"}.fa-duotone.fa-battery-car:after,.fa-duotone.fa-car-battery:after,.fad.fa-battery-car:after,.fad.fa-car-battery:after{content:"\f5df\f5df"}.fa-duotone.fa-face-downcast-sweat:after,.fad.fa-face-downcast-sweat:after{content:"\e371\e371"}.fa-duotone.fa-mailbox-flag-up:after,.fad.fa-mailbox-flag-up:after{content:"\e5bb\e5bb"}.fa-duotone.fa-memo-circle-info:after,.fad.fa-memo-circle-info:after{content:"\e49a\e49a"}.fa-duotone.fa-gift:after,.fad.fa-gift:after{content:"\f06b\f06b"}.fa-duotone.fa-dice-two:after,.fad.fa-dice-two:after{content:"\f528\f528"}.fa-duotone.fa-volume-medium:after,.fa-duotone.fa-volume:after,.fad.fa-volume-medium:after,.fad.fa-volume:after{content:"\f6a8\f6a8"}.fa-duotone.fa-transporter-5:after,.fad.fa-transporter-5:after{content:"\e2a6\e2a6"}.fa-duotone.fa-gauge-circle-bolt:after,.fad.fa-gauge-circle-bolt:after{content:"\e496\e496"}.fa-duotone.fa-coin-front:after,.fad.fa-coin-front:after{content:"\e3fc\e3fc"}.fa-duotone.fa-file-slash:after,.fad.fa-file-slash:after{content:"\e3a7\e3a7"}.fa-duotone.fa-message-arrow-up-right:after,.fad.fa-message-arrow-up-right:after{content:"\e1dd\e1dd"}.fa-duotone.fa-treasure-chest:after,.fad.fa-treasure-chest:after{content:"\f723\f723"}.fa-duotone.fa-chess-queen:after,.fad.fa-chess-queen:after{content:"\f445\f445"}.fa-duotone.fa-paint-brush-alt:after,.fa-duotone.fa-paint-brush-fine:after,.fa-duotone.fa-paintbrush-alt:after,.fa-duotone.fa-paintbrush-fine:after,.fad.fa-paint-brush-alt:after,.fad.fa-paint-brush-fine:after,.fad.fa-paintbrush-alt:after,.fad.fa-paintbrush-fine:after{content:"\f5a9\f5a9"}.fa-duotone.fa-glasses:after,.fad.fa-glasses:after{content:"\f530\f530"}.fa-duotone.fa-hood-cloak:after,.fad.fa-hood-cloak:after{content:"\f6ef\f6ef"}.fa-duotone.fa-square-quote:after,.fad.fa-square-quote:after{content:"\e329\e329"}.fa-duotone.fa-up-left:after,.fad.fa-up-left:after{content:"\e2bd\e2bd"}.fa-duotone.fa-bring-front:after,.fad.fa-bring-front:after{content:"\f857\f857"}.fa-duotone.fa-chess-board:after,.fad.fa-chess-board:after{content:"\f43c\f43c"}.fa-duotone.fa-burger-cheese:after,.fa-duotone.fa-cheeseburger:after,.fad.fa-burger-cheese:after,.fad.fa-cheeseburger:after{content:"\f7f1\f7f1"}.fa-duotone.fa-building-circle-check:after,.fad.fa-building-circle-check:after{content:"\e4d2\e4d2"}.fa-duotone.fa-repeat-1:after,.fad.fa-repeat-1:after{content:"\f365\f365"}.fa-duotone.fa-arrow-down-to-line:after,.fa-duotone.fa-arrow-to-bottom:after,.fad.fa-arrow-down-to-line:after,.fad.fa-arrow-to-bottom:after{content:"\f33d\f33d"}.fa-duotone.fa-grid-5:after,.fad.fa-grid-5:after{content:"\e199\e199"}.fa-duotone.fa-swap-arrows:after,.fad.fa-swap-arrows:after{content:"\e60a\e60a"}.fa-duotone.fa-right-long-to-line:after,.fad.fa-right-long-to-line:after{content:"\e444\e444"}.fa-duotone.fa-person-chalkboard:after,.fad.fa-person-chalkboard:after{content:"\e53d\e53d"}.fa-duotone.fa-mars-stroke-h:after,.fa-duotone.fa-mars-stroke-right:after,.fad.fa-mars-stroke-h:after,.fad.fa-mars-stroke-right:after{content:"\f22b\f22b"}.fa-duotone.fa-hand-back-fist:after,.fa-duotone.fa-hand-rock:after,.fad.fa-hand-back-fist:after,.fad.fa-hand-rock:after{content:"\f255\f255"}.fa-duotone.fa-grid-round-5:after,.fad.fa-grid-round-5:after{content:"\e5de\e5de"}.fa-duotone.fa-tally-5:after,.fa-duotone.fa-tally:after,.fad.fa-tally-5:after,.fad.fa-tally:after{content:"\f69c\f69c"}.fa-duotone.fa-caret-square-up:after,.fa-duotone.fa-square-caret-up:after,.fad.fa-caret-square-up:after,.fad.fa-square-caret-up:after{content:"\f151\f151"}.fa-duotone.fa-cloud-showers-water:after,.fad.fa-cloud-showers-water:after{content:"\e4e4\e4e4"}.fa-duotone.fa-bar-chart:after,.fa-duotone.fa-chart-bar:after,.fad.fa-bar-chart:after,.fad.fa-chart-bar:after{content:"\f080\f080"}.fa-duotone.fa-hands-bubbles:after,.fa-duotone.fa-hands-wash:after,.fad.fa-hands-bubbles:after,.fad.fa-hands-wash:after{content:"\e05e\e05e"}.fa-duotone.fa-less-than-equal:after,.fad.fa-less-than-equal:after{content:"\f537\f537"}.fa-duotone.fa-train:after,.fad.fa-train:after{content:"\f238\f238"}.fa-duotone.fa-up-from-dotted-line:after,.fad.fa-up-from-dotted-line:after{content:"\e456\e456"}.fa-duotone.fa-eye-low-vision:after,.fa-duotone.fa-low-vision:after,.fad.fa-eye-low-vision:after,.fad.fa-low-vision:after{content:"\f2a8\f2a8"}.fa-duotone.fa-traffic-light-go:after,.fad.fa-traffic-light-go:after{content:"\f638\f638"}.fa-duotone.fa-face-exhaling:after,.fad.fa-face-exhaling:after{content:"\e480\e480"}.fa-duotone.fa-sensor-fire:after,.fad.fa-sensor-fire:after{content:"\e02a\e02a"}.fa-duotone.fa-user-unlock:after,.fad.fa-user-unlock:after{content:"\e058\e058"}.fa-duotone.fa-hexagon-divide:after,.fad.fa-hexagon-divide:after{content:"\e1ad\e1ad"}.fa-duotone.fa-00:after,.fad.fa-00:after{content:"\e467\e467"}.fa-duotone.fa-crow:after,.fad.fa-crow:after{content:"\f520\f520"}.fa-duotone.fa-betamax:after,.fa-duotone.fa-cassette-betamax:after,.fad.fa-betamax:after,.fad.fa-cassette-betamax:after{content:"\f8a4\f8a4"}.fa-duotone.fa-sailboat:after,.fad.fa-sailboat:after{content:"\e445\e445"}.fa-duotone.fa-window-restore:after,.fad.fa-window-restore:after{content:"\f2d2\f2d2"}.fa-duotone.fa-nfc-magnifying-glass:after,.fad.fa-nfc-magnifying-glass:after{content:"\e1f9\e1f9"}.fa-duotone.fa-file-binary:after,.fad.fa-file-binary:after{content:"\e175\e175"}.fa-duotone.fa-circle-v:after,.fad.fa-circle-v:after{content:"\e12a\e12a"}.fa-duotone.fa-plus-square:after,.fa-duotone.fa-square-plus:after,.fad.fa-plus-square:after,.fad.fa-square-plus:after{content:"\f0fe\f0fe"}.fa-duotone.fa-bowl-scoops:after,.fad.fa-bowl-scoops:after{content:"\e3df\e3df"}.fa-duotone.fa-mistletoe:after,.fad.fa-mistletoe:after{content:"\f7b4\f7b4"}.fa-duotone.fa-custard:after,.fad.fa-custard:after{content:"\e403\e403"}.fa-duotone.fa-lacrosse-stick:after,.fad.fa-lacrosse-stick:after{content:"\e3b5\e3b5"}.fa-duotone.fa-hockey-mask:after,.fad.fa-hockey-mask:after{content:"\f6ee\f6ee"}.fa-duotone.fa-sunrise:after,.fad.fa-sunrise:after{content:"\f766\f766"}.fa-duotone.fa-subtitles:after,.fad.fa-subtitles:after{content:"\e60f\e60f"}.fa-duotone.fa-panel-ews:after,.fad.fa-panel-ews:after{content:"\e42e\e42e"}.fa-duotone.fa-torii-gate:after,.fad.fa-torii-gate:after{content:"\f6a1\f6a1"}.fa-duotone.fa-cloud-exclamation:after,.fad.fa-cloud-exclamation:after{content:"\e491\e491"}.fa-duotone.fa-comment-alt-lines:after,.fa-duotone.fa-message-lines:after,.fad.fa-comment-alt-lines:after,.fad.fa-message-lines:after{content:"\f4a6\f4a6"}.fa-duotone.fa-frog:after,.fad.fa-frog:after{content:"\f52e\f52e"}.fa-duotone.fa-bucket:after,.fad.fa-bucket:after{content:"\e4cf\e4cf"}.fa-duotone.fa-floppy-disk-pen:after,.fad.fa-floppy-disk-pen:after{content:"\e182\e182"}.fa-duotone.fa-image:after,.fad.fa-image:after{content:"\f03e\f03e"}.fa-duotone.fa-window-frame:after,.fad.fa-window-frame:after{content:"\e04f\e04f"}.fa-duotone.fa-microphone:after,.fad.fa-microphone:after{content:"\f130\f130"}.fa-duotone.fa-cow:after,.fad.fa-cow:after{content:"\f6c8\f6c8"}.fa-duotone.fa-file-zip:after,.fad.fa-file-zip:after{content:"\e5ee\e5ee"}.fa-duotone.fa-square-ring:after,.fad.fa-square-ring:after{content:"\e44f\e44f"}.fa-duotone.fa-arrow-alt-from-top:after,.fa-duotone.fa-down-from-line:after,.fad.fa-arrow-alt-from-top:after,.fad.fa-down-from-line:after{content:"\f349\f349"}.fa-duotone.fa-caret-up:after,.fad.fa-caret-up:after{content:"\f0d8\f0d8"}.fa-duotone.fa-shield-times:after,.fa-duotone.fa-shield-xmark:after,.fad.fa-shield-times:after,.fad.fa-shield-xmark:after{content:"\e24c\e24c"}.fa-duotone.fa-screwdriver:after,.fad.fa-screwdriver:after{content:"\f54a\f54a"}.fa-duotone.fa-circle-sort-down:after,.fa-duotone.fa-sort-circle-down:after,.fad.fa-circle-sort-down:after,.fad.fa-sort-circle-down:after{content:"\e031\e031"}.fa-duotone.fa-folder-closed:after,.fad.fa-folder-closed:after{content:"\e185\e185"}.fa-duotone.fa-house-tsunami:after,.fad.fa-house-tsunami:after{content:"\e515\e515"}.fa-duotone.fa-square-nfi:after,.fad.fa-square-nfi:after{content:"\e576\e576"}.fa-duotone.fa-forklift:after,.fad.fa-forklift:after{content:"\f47a\f47a"}.fa-duotone.fa-arrow-up-from-ground-water:after,.fad.fa-arrow-up-from-ground-water:after{content:"\e4b5\e4b5"}.fa-duotone.fa-bracket-square-right:after,.fad.fa-bracket-square-right:after{content:"\5d\5d"}.fa-duotone.fa-glass-martini-alt:after,.fa-duotone.fa-martini-glass:after,.fad.fa-glass-martini-alt:after,.fad.fa-martini-glass:after{content:"\f57b\f57b"}.fa-duotone.fa-rotate-back:after,.fa-duotone.fa-rotate-backward:after,.fa-duotone.fa-rotate-left:after,.fa-duotone.fa-undo-alt:after,.fad.fa-rotate-back:after,.fad.fa-rotate-backward:after,.fad.fa-rotate-left:after,.fad.fa-undo-alt:after{content:"\f2ea\f2ea"}.fa-duotone.fa-columns:after,.fa-duotone.fa-table-columns:after,.fad.fa-columns:after,.fad.fa-table-columns:after{content:"\f0db\f0db"}.fa-duotone.fa-square-a:after,.fad.fa-square-a:after{content:"\e25f\e25f"}.fa-duotone.fa-tick:after,.fad.fa-tick:after{content:"\e32f\e32f"}.fa-duotone.fa-lemon:after,.fad.fa-lemon:after{content:"\f094\f094"}.fa-duotone.fa-head-side-mask:after,.fad.fa-head-side-mask:after{content:"\e063\e063"}.fa-duotone.fa-handshake:after,.fad.fa-handshake:after{content:"\f2b5\f2b5"}.fa-duotone.fa-gem:after,.fad.fa-gem:after{content:"\f3a5\f3a5"}.fa-duotone.fa-dolly-box:after,.fa-duotone.fa-dolly:after,.fad.fa-dolly-box:after,.fad.fa-dolly:after{content:"\f472\f472"}.fa-duotone.fa-smoking:after,.fad.fa-smoking:after{content:"\f48d\f48d"}.fa-duotone.fa-compress-arrows-alt:after,.fa-duotone.fa-minimize:after,.fad.fa-compress-arrows-alt:after,.fad.fa-minimize:after{content:"\f78c\f78c"}.fa-duotone.fa-refrigerator:after,.fad.fa-refrigerator:after{content:"\e026\e026"}.fa-duotone.fa-monument:after,.fad.fa-monument:after{content:"\f5a6\f5a6"}.fa-duotone.fa-octagon-xmark:after,.fa-duotone.fa-times-octagon:after,.fa-duotone.fa-xmark-octagon:after,.fad.fa-octagon-xmark:after,.fad.fa-times-octagon:after,.fad.fa-xmark-octagon:after{content:"\f2f0\f2f0"}.fa-duotone.fa-align-slash:after,.fad.fa-align-slash:after{content:"\f846\f846"}.fa-duotone.fa-snowplow:after,.fad.fa-snowplow:after{content:"\f7d2\f7d2"}.fa-duotone.fa-angle-double-right:after,.fa-duotone.fa-angles-right:after,.fad.fa-angle-double-right:after,.fad.fa-angles-right:after{content:"\f101\f101"}.fa-duotone.fa-truck-couch:after,.fa-duotone.fa-truck-ramp-couch:after,.fad.fa-truck-couch:after,.fad.fa-truck-ramp-couch:after{content:"\f4dd\f4dd"}.fa-duotone.fa-cannabis:after,.fad.fa-cannabis:after{content:"\f55f\f55f"}.fa-duotone.fa-circle-play:after,.fa-duotone.fa-play-circle:after,.fad.fa-circle-play:after,.fad.fa-play-circle:after{content:"\f144\f144"}.fa-duotone.fa-arrow-up-right-and-arrow-down-left-from-center:after,.fad.fa-arrow-up-right-and-arrow-down-left-from-center:after{content:"\e0a0\e0a0"}.fa-duotone.fa-tablets:after,.fad.fa-tablets:after{content:"\f490\f490"}.fa-duotone.fa-360-degrees:after,.fad.fa-360-degrees:after{content:"\e2dc\e2dc"}.fa-duotone.fa-ethernet:after,.fad.fa-ethernet:after{content:"\f796\f796"}.fa-duotone.fa-eur:after,.fa-duotone.fa-euro-sign:after,.fa-duotone.fa-euro:after,.fad.fa-eur:after,.fad.fa-euro-sign:after,.fad.fa-euro:after{content:"\f153\f153"}.fa-duotone.fa-chair:after,.fad.fa-chair:after{content:"\f6c0\f6c0"}.fa-duotone.fa-check-circle:after,.fa-duotone.fa-circle-check:after,.fad.fa-check-circle:after,.fad.fa-circle-check:after{content:"\f058\f058"}.fa-duotone.fa-square-dashed-circle-plus:after,.fad.fa-square-dashed-circle-plus:after{content:"\e5c2\e5c2"}.fa-duotone.fa-money-simple-from-bracket:after,.fad.fa-money-simple-from-bracket:after{content:"\e313\e313"}.fa-duotone.fa-bat:after,.fad.fa-bat:after{content:"\f6b5\f6b5"}.fa-duotone.fa-circle-stop:after,.fa-duotone.fa-stop-circle:after,.fad.fa-circle-stop:after,.fad.fa-stop-circle:after{content:"\f28d\f28d"}.fa-duotone.fa-head-side-headphones:after,.fad.fa-head-side-headphones:after{content:"\f8c2\f8c2"}.fa-duotone.fa-phone-rotary:after,.fad.fa-phone-rotary:after{content:"\f8d3\f8d3"}.fa-duotone.fa-compass-drafting:after,.fa-duotone.fa-drafting-compass:after,.fad.fa-compass-drafting:after,.fad.fa-drafting-compass:after{content:"\f568\f568"}.fa-duotone.fa-plate-wheat:after,.fad.fa-plate-wheat:after{content:"\e55a\e55a"}.fa-duotone.fa-calendar-circle-minus:after,.fad.fa-calendar-circle-minus:after{content:"\e46f\e46f"}.fa-duotone.fa-chopsticks:after,.fad.fa-chopsticks:after{content:"\e3f7\e3f7"}.fa-duotone.fa-car-mechanic:after,.fa-duotone.fa-car-wrench:after,.fad.fa-car-mechanic:after,.fad.fa-car-wrench:after{content:"\f5e3\f5e3"}.fa-duotone.fa-icicles:after,.fad.fa-icicles:after{content:"\f7ad\f7ad"}.fa-duotone.fa-person-shelter:after,.fad.fa-person-shelter:after{content:"\e54f\e54f"}.fa-duotone.fa-neuter:after,.fad.fa-neuter:after{content:"\f22c\f22c"}.fa-duotone.fa-id-badge:after,.fad.fa-id-badge:after{content:"\f2c1\f2c1"}.fa-duotone.fa-kazoo:after,.fad.fa-kazoo:after{content:"\f8c7\f8c7"}.fa-duotone.fa-marker:after,.fad.fa-marker:after{content:"\f5a1\f5a1"}.fa-duotone.fa-bin-bottles:after,.fad.fa-bin-bottles:after{content:"\e5f5\e5f5"}.fa-duotone.fa-face-laugh-beam:after,.fa-duotone.fa-laugh-beam:after,.fad.fa-face-laugh-beam:after,.fad.fa-laugh-beam:after{content:"\f59a\f59a"}.fa-duotone.fa-square-arrow-down-left:after,.fad.fa-square-arrow-down-left:after{content:"\e261\e261"}.fa-duotone.fa-battery-bolt:after,.fad.fa-battery-bolt:after{content:"\f376\f376"}.fa-duotone.fa-tree-large:after,.fad.fa-tree-large:after{content:"\f7dd\f7dd"}.fa-duotone.fa-helicopter-symbol:after,.fad.fa-helicopter-symbol:after{content:"\e502\e502"}.fa-duotone.fa-aperture:after,.fad.fa-aperture:after{content:"\e2df\e2df"}.fa-duotone.fa-universal-access:after,.fad.fa-universal-access:after{content:"\f29a\f29a"}.fa-duotone.fa-gear-complex:after,.fad.fa-gear-complex:after{content:"\e5e9\e5e9"}.fa-duotone.fa-file-magnifying-glass:after,.fa-duotone.fa-file-search:after,.fad.fa-file-magnifying-glass:after,.fad.fa-file-search:after{content:"\f865\f865"}.fa-duotone.fa-up-right:after,.fad.fa-up-right:after{content:"\e2be\e2be"}.fa-duotone.fa-chevron-circle-up:after,.fa-duotone.fa-circle-chevron-up:after,.fad.fa-chevron-circle-up:after,.fad.fa-circle-chevron-up:after{content:"\f139\f139"}.fa-duotone.fa-user-police:after,.fad.fa-user-police:after{content:"\e333\e333"}.fa-duotone.fa-lari-sign:after,.fad.fa-lari-sign:after{content:"\e1c8\e1c8"}.fa-duotone.fa-volcano:after,.fad.fa-volcano:after{content:"\f770\f770"}.fa-duotone.fa-teddy-bear:after,.fad.fa-teddy-bear:after{content:"\e3cf\e3cf"}.fa-duotone.fa-stocking:after,.fad.fa-stocking:after{content:"\f7d5\f7d5"}.fa-duotone.fa-person-walking-dashed-line-arrow-right:after,.fad.fa-person-walking-dashed-line-arrow-right:after{content:"\e553\e553"}.fa-duotone.fa-image-slash:after,.fad.fa-image-slash:after{content:"\e1b7\e1b7"}.fa-duotone.fa-mask-snorkel:after,.fad.fa-mask-snorkel:after{content:"\e3b7\e3b7"}.fa-duotone.fa-smoke:after,.fad.fa-smoke:after{content:"\f760\f760"}.fa-duotone.fa-gbp:after,.fa-duotone.fa-pound-sign:after,.fa-duotone.fa-sterling-sign:after,.fad.fa-gbp:after,.fad.fa-pound-sign:after,.fad.fa-sterling-sign:after{content:"\f154\f154"}.fa-duotone.fa-battery-exclamation:after,.fad.fa-battery-exclamation:after{content:"\e0b0\e0b0"}.fa-duotone.fa-viruses:after,.fad.fa-viruses:after{content:"\e076\e076"}.fa-duotone.fa-square-person-confined:after,.fad.fa-square-person-confined:after{content:"\e577\e577"}.fa-duotone.fa-user-tie:after,.fad.fa-user-tie:after{content:"\f508\f508"}.fa-duotone.fa-arrow-down-long:after,.fa-duotone.fa-long-arrow-down:after,.fad.fa-arrow-down-long:after,.fad.fa-long-arrow-down:after{content:"\f175\f175"}.fa-duotone.fa-tent-arrow-down-to-line:after,.fad.fa-tent-arrow-down-to-line:after{content:"\e57e\e57e"}.fa-duotone.fa-certificate:after,.fad.fa-certificate:after{content:"\f0a3\f0a3"}.fa-duotone.fa-crystal-ball:after,.fad.fa-crystal-ball:after{content:"\e362\e362"}.fa-duotone.fa-mail-reply-all:after,.fa-duotone.fa-reply-all:after,.fad.fa-mail-reply-all:after,.fad.fa-reply-all:after{content:"\f122\f122"}.fa-duotone.fa-suitcase:after,.fad.fa-suitcase:after{content:"\f0f2\f0f2"}.fa-duotone.fa-person-skating:after,.fa-duotone.fa-skating:after,.fad.fa-person-skating:after,.fad.fa-skating:after{content:"\f7c5\f7c5"}.fa-duotone.fa-star-shooting:after,.fad.fa-star-shooting:after{content:"\e036\e036"}.fa-duotone.fa-binary-lock:after,.fad.fa-binary-lock:after{content:"\e33d\e33d"}.fa-duotone.fa-filter-circle-dollar:after,.fa-duotone.fa-funnel-dollar:after,.fad.fa-filter-circle-dollar:after,.fad.fa-funnel-dollar:after{content:"\f662\f662"}.fa-duotone.fa-camera-retro:after,.fad.fa-camera-retro:after{content:"\f083\f083"}.fa-duotone.fa-arrow-circle-down:after,.fa-duotone.fa-circle-arrow-down:after,.fad.fa-arrow-circle-down:after,.fad.fa-circle-arrow-down:after{content:"\f0ab\f0ab"}.fa-duotone.fa-comment-edit:after,.fa-duotone.fa-comment-pen:after,.fad.fa-comment-edit:after,.fad.fa-comment-pen:after{content:"\f4ae\f4ae"}.fa-duotone.fa-arrow-right-to-file:after,.fa-duotone.fa-file-import:after,.fad.fa-arrow-right-to-file:after,.fad.fa-file-import:after{content:"\f56f\f56f"}.fa-duotone.fa-banjo:after,.fad.fa-banjo:after{content:"\f8a3\f8a3"}.fa-duotone.fa-external-link-square:after,.fa-duotone.fa-square-arrow-up-right:after,.fad.fa-external-link-square:after,.fad.fa-square-arrow-up-right:after{content:"\f14c\f14c"}.fa-duotone.fa-light-emergency-on:after,.fad.fa-light-emergency-on:after{content:"\e420\e420"}.fa-duotone.fa-kerning:after,.fad.fa-kerning:after{content:"\f86f\f86f"}.fa-duotone.fa-box-open:after,.fad.fa-box-open:after{content:"\f49e\f49e"}.fa-duotone.fa-square-f:after,.fad.fa-square-f:after{content:"\e270\e270"}.fa-duotone.fa-scroll:after,.fad.fa-scroll:after{content:"\f70e\f70e"}.fa-duotone.fa-spa:after,.fad.fa-spa:after{content:"\f5bb\f5bb"}.fa-duotone.fa-arrow-from-right:after,.fa-duotone.fa-arrow-left-from-line:after,.fad.fa-arrow-from-right:after,.fad.fa-arrow-left-from-line:after{content:"\f344\f344"}.fa-duotone.fa-strawberry:after,.fad.fa-strawberry:after{content:"\e32b\e32b"}.fa-duotone.fa-location-pin-lock:after,.fad.fa-location-pin-lock:after{content:"\e51f\e51f"}.fa-duotone.fa-pause:after,.fad.fa-pause:after{content:"\f04c\f04c"}.fa-duotone.fa-clock-eight-thirty:after,.fad.fa-clock-eight-thirty:after{content:"\e346\e346"}.fa-duotone.fa-plane-alt:after,.fa-duotone.fa-plane-engines:after,.fad.fa-plane-alt:after,.fad.fa-plane-engines:after{content:"\f3de\f3de"}.fa-duotone.fa-hill-avalanche:after,.fad.fa-hill-avalanche:after{content:"\e507\e507"}.fa-duotone.fa-temperature-0:after,.fa-duotone.fa-temperature-empty:after,.fa-duotone.fa-thermometer-0:after,.fa-duotone.fa-thermometer-empty:after,.fad.fa-temperature-0:after,.fad.fa-temperature-empty:after,.fad.fa-thermometer-0:after,.fad.fa-thermometer-empty:after{content:"\f2cb\f2cb"}.fa-duotone.fa-bomb:after,.fad.fa-bomb:after{content:"\f1e2\f1e2"}.fa-duotone.fa-gauge-low:after,.fa-duotone.fa-tachometer-alt-slow:after,.fad.fa-gauge-low:after,.fad.fa-tachometer-alt-slow:after{content:"\f627\f627"}.fa-duotone.fa-registered:after,.fad.fa-registered:after{content:"\f25d\f25d"}.fa-duotone.fa-trash-can-plus:after,.fad.fa-trash-can-plus:after{content:"\e2ac\e2ac"}.fa-duotone.fa-address-card:after,.fa-duotone.fa-contact-card:after,.fa-duotone.fa-vcard:after,.fad.fa-address-card:after,.fad.fa-contact-card:after,.fad.fa-vcard:after{content:"\f2bb\f2bb"}.fa-duotone.fa-balance-scale-right:after,.fa-duotone.fa-scale-unbalanced-flip:after,.fad.fa-balance-scale-right:after,.fad.fa-scale-unbalanced-flip:after{content:"\f516\f516"}.fa-duotone.fa-globe-snow:after,.fad.fa-globe-snow:after{content:"\f7a3\f7a3"}.fa-duotone.fa-subscript:after,.fad.fa-subscript:after{content:"\f12c\f12c"}.fa-duotone.fa-diamond-turn-right:after,.fa-duotone.fa-directions:after,.fad.fa-diamond-turn-right:after,.fad.fa-directions:after{content:"\f5eb\f5eb"}.fa-duotone.fa-integral:after,.fad.fa-integral:after{content:"\f667\f667"}.fa-duotone.fa-burst:after,.fad.fa-burst:after{content:"\e4dc\e4dc"}.fa-duotone.fa-house-laptop:after,.fa-duotone.fa-laptop-house:after,.fad.fa-house-laptop:after,.fad.fa-laptop-house:after{content:"\e066\e066"}.fa-duotone.fa-face-tired:after,.fa-duotone.fa-tired:after,.fad.fa-face-tired:after,.fad.fa-tired:after{content:"\f5c8\f5c8"}.fa-duotone.fa-money-bills:after,.fad.fa-money-bills:after{content:"\e1f3\e1f3"}.fa-duotone.fa-blinds-raised:after,.fad.fa-blinds-raised:after{content:"\f8fd\f8fd"}.fa-duotone.fa-smog:after,.fad.fa-smog:after{content:"\f75f\f75f"}.fa-duotone.fa-ufo-beam:after,.fad.fa-ufo-beam:after{content:"\e048\e048"}.fa-duotone.fa-caret-circle-up:after,.fa-duotone.fa-circle-caret-up:after,.fad.fa-caret-circle-up:after,.fad.fa-circle-caret-up:after{content:"\f331\f331"}.fa-duotone.fa-user-vneck-hair-long:after,.fad.fa-user-vneck-hair-long:after{content:"\e463\e463"}.fa-duotone.fa-square-a-lock:after,.fad.fa-square-a-lock:after{content:"\e44d\e44d"}.fa-duotone.fa-crutch:after,.fad.fa-crutch:after{content:"\f7f7\f7f7"}.fa-duotone.fa-gas-pump-slash:after,.fad.fa-gas-pump-slash:after{content:"\f5f4\f5f4"}.fa-duotone.fa-cloud-arrow-up:after,.fa-duotone.fa-cloud-upload-alt:after,.fa-duotone.fa-cloud-upload:after,.fad.fa-cloud-arrow-up:after,.fad.fa-cloud-upload-alt:after,.fad.fa-cloud-upload:after{content:"\f0ee\f0ee"}.fa-duotone.fa-palette:after,.fad.fa-palette:after{content:"\f53f\f53f"}.fa-duotone.fa-transporter-4:after,.fad.fa-transporter-4:after{content:"\e2a5\e2a5"}.fa-duotone.fa-chart-mixed-up-circle-currency:after,.fad.fa-chart-mixed-up-circle-currency:after{content:"\e5d8\e5d8"}.fa-duotone.fa-objects-align-right:after,.fad.fa-objects-align-right:after{content:"\e3bf\e3bf"}.fa-duotone.fa-arrows-turn-right:after,.fad.fa-arrows-turn-right:after{content:"\e4c0\e4c0"}.fa-duotone.fa-vest:after,.fad.fa-vest:after{content:"\e085\e085"}.fa-duotone.fa-pig:after,.fad.fa-pig:after{content:"\f706\f706"}.fa-duotone.fa-inbox-full:after,.fad.fa-inbox-full:after{content:"\e1ba\e1ba"}.fa-duotone.fa-circle-envelope:after,.fa-duotone.fa-envelope-circle:after,.fad.fa-circle-envelope:after,.fad.fa-envelope-circle:after{content:"\e10c\e10c"}.fa-duotone.fa-construction:after,.fa-duotone.fa-triangle-person-digging:after,.fad.fa-construction:after,.fad.fa-triangle-person-digging:after{content:"\f85d\f85d"}.fa-duotone.fa-ferry:after,.fad.fa-ferry:after{content:"\e4ea\e4ea"}.fa-duotone.fa-bullseye-arrow:after,.fad.fa-bullseye-arrow:after{content:"\f648\f648"}.fa-duotone.fa-arrows-down-to-people:after,.fad.fa-arrows-down-to-people:after{content:"\e4b9\e4b9"}.fa-duotone.fa-seedling:after,.fa-duotone.fa-sprout:after,.fad.fa-seedling:after,.fad.fa-sprout:after{content:"\f4d8\f4d8"}.fa-duotone.fa-clock-seven:after,.fad.fa-clock-seven:after{content:"\e350\e350"}.fa-duotone.fa-arrows-alt-h:after,.fa-duotone.fa-left-right:after,.fad.fa-arrows-alt-h:after,.fad.fa-left-right:after{content:"\f337\f337"}.fa-duotone.fa-boxes-packing:after,.fad.fa-boxes-packing:after{content:"\e4c7\e4c7"}.fa-duotone.fa-arrow-circle-left:after,.fa-duotone.fa-circle-arrow-left:after,.fad.fa-arrow-circle-left:after,.fad.fa-circle-arrow-left:after{content:"\f0a8\f0a8"}.fa-duotone.fa-flashlight:after,.fad.fa-flashlight:after{content:"\f8b8\f8b8"}.fa-duotone.fa-group-arrows-rotate:after,.fad.fa-group-arrows-rotate:after{content:"\e4f6\e4f6"}.fa-duotone.fa-bowl-food:after,.fad.fa-bowl-food:after{content:"\e4c6\e4c6"}.fa-duotone.fa-square-9:after,.fad.fa-square-9:after{content:"\e25e\e25e"}.fa-duotone.fa-candy-cane:after,.fad.fa-candy-cane:after{content:"\f786\f786"}.fa-duotone.fa-arrow-down-wide-short:after,.fa-duotone.fa-sort-amount-asc:after,.fa-duotone.fa-sort-amount-down:after,.fad.fa-arrow-down-wide-short:after,.fad.fa-sort-amount-asc:after,.fad.fa-sort-amount-down:after{content:"\f160\f160"}.fa-duotone.fa-dollar-square:after,.fa-duotone.fa-square-dollar:after,.fa-duotone.fa-usd-square:after,.fad.fa-dollar-square:after,.fad.fa-square-dollar:after,.fad.fa-usd-square:after{content:"\f2e9\f2e9"}.fa-duotone.fa-phone-arrow-right:after,.fad.fa-phone-arrow-right:after{content:"\e5be\e5be"}.fa-duotone.fa-hand-holding-seedling:after,.fad.fa-hand-holding-seedling:after{content:"\f4bf\f4bf"}.fa-duotone.fa-comment-alt-check:after,.fa-duotone.fa-message-check:after,.fad.fa-comment-alt-check:after,.fad.fa-message-check:after{content:"\f4a2\f4a2"}.fa-duotone.fa-cloud-bolt:after,.fa-duotone.fa-thunderstorm:after,.fad.fa-cloud-bolt:after,.fad.fa-thunderstorm:after{content:"\f76c\f76c"}.fa-duotone.fa-chart-line-up-down:after,.fad.fa-chart-line-up-down:after{content:"\e5d7\e5d7"}.fa-duotone.fa-remove-format:after,.fa-duotone.fa-text-slash:after,.fad.fa-remove-format:after,.fad.fa-text-slash:after{content:"\f87d\f87d"}.fa-duotone.fa-watch:after,.fad.fa-watch:after{content:"\f2e1\f2e1"}.fa-duotone.fa-circle-down-left:after,.fad.fa-circle-down-left:after{content:"\e107\e107"}.fa-duotone.fa-text:after,.fad.fa-text:after{content:"\f893\f893"}.fa-duotone.fa-projector:after,.fad.fa-projector:after{content:"\f8d6\f8d6"}.fa-duotone.fa-face-smile-wink:after,.fa-duotone.fa-smile-wink:after,.fad.fa-face-smile-wink:after,.fad.fa-smile-wink:after{content:"\f4da\f4da"}.fa-duotone.fa-tombstone-alt:after,.fa-duotone.fa-tombstone-blank:after,.fad.fa-tombstone-alt:after,.fad.fa-tombstone-blank:after{content:"\f721\f721"}.fa-duotone.fa-chess-king-alt:after,.fa-duotone.fa-chess-king-piece:after,.fad.fa-chess-king-alt:after,.fad.fa-chess-king-piece:after{content:"\f440\f440"}.fa-duotone.fa-circle-6:after,.fad.fa-circle-6:after{content:"\e0f3\e0f3"}.fa-duotone.fa-arrow-alt-left:after,.fa-duotone.fa-left:after,.fad.fa-arrow-alt-left:after,.fad.fa-left:after{content:"\f355\f355"}.fa-duotone.fa-file-word:after,.fad.fa-file-word:after{content:"\f1c2\f1c2"}.fa-duotone.fa-file-powerpoint:after,.fad.fa-file-powerpoint:after{content:"\f1c4\f1c4"}.fa-duotone.fa-arrow-alt-square-down:after,.fa-duotone.fa-square-down:after,.fad.fa-arrow-alt-square-down:after,.fad.fa-square-down:after{content:"\f350\f350"}.fa-duotone.fa-objects-align-center-vertical:after,.fad.fa-objects-align-center-vertical:after{content:"\e3bd\e3bd"}.fa-duotone.fa-arrows-h:after,.fa-duotone.fa-arrows-left-right:after,.fad.fa-arrows-h:after,.fad.fa-arrows-left-right:after{content:"\f07e\f07e"}.fa-duotone.fa-house-lock:after,.fad.fa-house-lock:after{content:"\e510\e510"}.fa-duotone.fa-cloud-arrow-down:after,.fa-duotone.fa-cloud-download-alt:after,.fa-duotone.fa-cloud-download:after,.fad.fa-cloud-arrow-down:after,.fad.fa-cloud-download-alt:after,.fad.fa-cloud-download:after{content:"\f0ed\f0ed"}.fa-duotone.fa-wreath:after,.fad.fa-wreath:after{content:"\f7e2\f7e2"}.fa-duotone.fa-children:after,.fad.fa-children:after{content:"\e4e1\e4e1"}.fa-duotone.fa-meter-droplet:after,.fad.fa-meter-droplet:after{content:"\e1ea\e1ea"}.fa-duotone.fa-blackboard:after,.fa-duotone.fa-chalkboard:after,.fad.fa-blackboard:after,.fad.fa-chalkboard:after{content:"\f51b\f51b"}.fa-duotone.fa-user-alt-slash:after,.fa-duotone.fa-user-large-slash:after,.fad.fa-user-alt-slash:after,.fad.fa-user-large-slash:after{content:"\f4fa\f4fa"}.fa-duotone.fa-signal-4:after,.fa-duotone.fa-signal-strong:after,.fad.fa-signal-4:after,.fad.fa-signal-strong:after{content:"\f68f\f68f"}.fa-duotone.fa-lollipop:after,.fa-duotone.fa-lollypop:after,.fad.fa-lollipop:after,.fad.fa-lollypop:after{content:"\e424\e424"}.fa-duotone.fa-list-tree:after,.fad.fa-list-tree:after{content:"\e1d2\e1d2"}.fa-duotone.fa-envelope-open:after,.fad.fa-envelope-open:after{content:"\f2b6\f2b6"}.fa-duotone.fa-draw-circle:after,.fad.fa-draw-circle:after{content:"\f5ed\f5ed"}.fa-duotone.fa-cat-space:after,.fad.fa-cat-space:after{content:"\e001\e001"}.fa-duotone.fa-handshake-alt-slash:after,.fa-duotone.fa-handshake-simple-slash:after,.fad.fa-handshake-alt-slash:after,.fad.fa-handshake-simple-slash:after{content:"\e05f\e05f"}.fa-duotone.fa-rabbit-fast:after,.fa-duotone.fa-rabbit-running:after,.fad.fa-rabbit-fast:after,.fad.fa-rabbit-running:after{content:"\f709\f709"}.fa-duotone.fa-memo-pad:after,.fad.fa-memo-pad:after{content:"\e1da\e1da"}.fa-duotone.fa-mattress-pillow:after,.fad.fa-mattress-pillow:after{content:"\e525\e525"}.fa-duotone.fa-alarm-plus:after,.fad.fa-alarm-plus:after{content:"\f844\f844"}.fa-duotone.fa-alicorn:after,.fad.fa-alicorn:after{content:"\f6b0\f6b0"}.fa-duotone.fa-comment-question:after,.fad.fa-comment-question:after{content:"\e14b\e14b"}.fa-duotone.fa-gingerbread-man:after,.fad.fa-gingerbread-man:after{content:"\f79d\f79d"}.fa-duotone.fa-guarani-sign:after,.fad.fa-guarani-sign:after{content:"\e19a\e19a"}.fa-duotone.fa-burger-fries:after,.fad.fa-burger-fries:after{content:"\e0cd\e0cd"}.fa-duotone.fa-mug-tea:after,.fad.fa-mug-tea:after{content:"\f875\f875"}.fa-duotone.fa-border-top:after,.fad.fa-border-top:after{content:"\f855\f855"}.fa-duotone.fa-arrows-rotate:after,.fa-duotone.fa-refresh:after,.fa-duotone.fa-sync:after,.fad.fa-arrows-rotate:after,.fad.fa-refresh:after,.fad.fa-sync:after{content:"\f021\f021"}.fa-duotone.fa-book-circle:after,.fa-duotone.fa-circle-book-open:after,.fad.fa-book-circle:after,.fad.fa-circle-book-open:after{content:"\e0ff\e0ff"}.fa-duotone.fa-arrows-to-dotted-line:after,.fad.fa-arrows-to-dotted-line:after{content:"\e0a6\e0a6"}.fa-duotone.fa-fire-extinguisher:after,.fad.fa-fire-extinguisher:after{content:"\f134\f134"}.fa-duotone.fa-garage-open:after,.fad.fa-garage-open:after{content:"\e00b\e00b"}.fa-duotone.fa-shelves-empty:after,.fad.fa-shelves-empty:after{content:"\e246\e246"}.fa-duotone.fa-cruzeiro-sign:after,.fad.fa-cruzeiro-sign:after{content:"\e152\e152"}.fa-duotone.fa-watch-apple:after,.fad.fa-watch-apple:after{content:"\e2cb\e2cb"}.fa-duotone.fa-watch-calculator:after,.fad.fa-watch-calculator:after{content:"\f8f0\f8f0"}.fa-duotone.fa-list-dropdown:after,.fad.fa-list-dropdown:after{content:"\e1cf\e1cf"}.fa-duotone.fa-cabinet-filing:after,.fad.fa-cabinet-filing:after{content:"\f64b\f64b"}.fa-duotone.fa-burger-soda:after,.fad.fa-burger-soda:after{content:"\f858\f858"}.fa-duotone.fa-arrow-square-up:after,.fa-duotone.fa-square-arrow-up:after,.fad.fa-arrow-square-up:after,.fad.fa-square-arrow-up:after{content:"\f33c\f33c"}.fa-duotone.fa-greater-than-equal:after,.fad.fa-greater-than-equal:after{content:"\f532\f532"}.fa-duotone.fa-pallet-box:after,.fad.fa-pallet-box:after{content:"\e208\e208"}.fa-duotone.fa-face-confounded:after,.fad.fa-face-confounded:after{content:"\e36c\e36c"}.fa-duotone.fa-shield-alt:after,.fa-duotone.fa-shield-halved:after,.fad.fa-shield-alt:after,.fad.fa-shield-halved:after{content:"\f3ed\f3ed"}.fa-duotone.fa-truck-plow:after,.fad.fa-truck-plow:after{content:"\f7de\f7de"}.fa-duotone.fa-atlas:after,.fa-duotone.fa-book-atlas:after,.fad.fa-atlas:after,.fad.fa-book-atlas:after{content:"\f558\f558"}.fa-duotone.fa-virus:after,.fad.fa-virus:after{content:"\e074\e074"}.fa-duotone.fa-grid-round-2:after,.fad.fa-grid-round-2:after{content:"\e5db\e5db"}.fa-duotone.fa-comment-middle-top:after,.fad.fa-comment-middle-top:after{content:"\e14a\e14a"}.fa-duotone.fa-envelope-circle-check:after,.fad.fa-envelope-circle-check:after{content:"\e4e8\e4e8"}.fa-duotone.fa-layer-group:after,.fad.fa-layer-group:after{content:"\f5fd\f5fd"}.fa-duotone.fa-restroom-simple:after,.fad.fa-restroom-simple:after{content:"\e23a\e23a"}.fa-duotone.fa-arrows-to-dot:after,.fad.fa-arrows-to-dot:after{content:"\e4be\e4be"}.fa-duotone.fa-border-outer:after,.fad.fa-border-outer:after{content:"\f851\f851"}.fa-duotone.fa-hashtag-lock:after,.fad.fa-hashtag-lock:after{content:"\e415\e415"}.fa-duotone.fa-clock-two-thirty:after,.fad.fa-clock-two-thirty:after{content:"\e35b\e35b"}.fa-duotone.fa-archway:after,.fad.fa-archway:after{content:"\f557\f557"}.fa-duotone.fa-heart-circle-check:after,.fad.fa-heart-circle-check:after{content:"\e4fd\e4fd"}.fa-duotone.fa-house-chimney-crack:after,.fa-duotone.fa-house-damage:after,.fad.fa-house-chimney-crack:after,.fad.fa-house-damage:after{content:"\f6f1\f6f1"}.fa-duotone.fa-file-archive:after,.fa-duotone.fa-file-zipper:after,.fad.fa-file-archive:after,.fad.fa-file-zipper:after{content:"\f1c6\f1c6"}.fa-duotone.fa-heart-half:after,.fad.fa-heart-half:after{content:"\e1ab\e1ab"}.fa-duotone.fa-comment-check:after,.fad.fa-comment-check:after{content:"\f4ac\f4ac"}.fa-duotone.fa-square:after,.fad.fa-square:after{content:"\f0c8\f0c8"}.fa-duotone.fa-memo:after,.fad.fa-memo:after{content:"\e1d8\e1d8"}.fa-duotone.fa-glass-martini:after,.fa-duotone.fa-martini-glass-empty:after,.fad.fa-glass-martini:after,.fad.fa-martini-glass-empty:after{content:"\f000\f000"}.fa-duotone.fa-couch:after,.fad.fa-couch:after{content:"\f4b8\f4b8"}.fa-duotone.fa-cedi-sign:after,.fad.fa-cedi-sign:after{content:"\e0df\e0df"}.fa-duotone.fa-italic:after,.fad.fa-italic:after{content:"\f033\f033"}.fa-duotone.fa-glass-citrus:after,.fad.fa-glass-citrus:after{content:"\f869\f869"}.fa-duotone.fa-calendar-lines-pen:after,.fad.fa-calendar-lines-pen:after{content:"\e472\e472"}.fa-duotone.fa-church:after,.fad.fa-church:after{content:"\f51d\f51d"}.fa-duotone.fa-person-snowmobiling:after,.fa-duotone.fa-snowmobile:after,.fad.fa-person-snowmobiling:after,.fad.fa-snowmobile:after{content:"\f7d1\f7d1"}.fa-duotone.fa-face-hushed:after,.fad.fa-face-hushed:after{content:"\e37b\e37b"}.fa-duotone.fa-comments-dollar:after,.fad.fa-comments-dollar:after{content:"\f653\f653"}.fa-duotone.fa-pickaxe:after,.fad.fa-pickaxe:after{content:"\e5bf\e5bf"}.fa-duotone.fa-link-simple-slash:after,.fad.fa-link-simple-slash:after{content:"\e1ce\e1ce"}.fa-duotone.fa-democrat:after,.fad.fa-democrat:after{content:"\f747\f747"}.fa-duotone.fa-face-confused:after,.fad.fa-face-confused:after{content:"\e36d\e36d"}.fa-duotone.fa-pinball:after,.fad.fa-pinball:after{content:"\e229\e229"}.fa-duotone.fa-z:after,.fad.fa-z:after{content:"\5a\5a"}.fa-duotone.fa-person-skiing:after,.fa-duotone.fa-skiing:after,.fad.fa-person-skiing:after,.fad.fa-skiing:after{content:"\f7c9\f7c9"}.fa-duotone.fa-deer:after,.fad.fa-deer:after{content:"\f78e\f78e"}.fa-duotone.fa-input-pipe:after,.fad.fa-input-pipe:after{content:"\e1be\e1be"}.fa-duotone.fa-road-lock:after,.fad.fa-road-lock:after{content:"\e567\e567"}.fa-duotone.fa-a:after,.fad.fa-a:after{content:"\41\41"}.fa-duotone.fa-bookmark-slash:after,.fad.fa-bookmark-slash:after{content:"\e0c2\e0c2"}.fa-duotone.fa-temperature-arrow-down:after,.fa-duotone.fa-temperature-down:after,.fad.fa-temperature-arrow-down:after,.fad.fa-temperature-down:after{content:"\e03f\e03f"}.fa-duotone.fa-mace:after,.fad.fa-mace:after{content:"\f6f8\f6f8"}.fa-duotone.fa-feather-alt:after,.fa-duotone.fa-feather-pointed:after,.fad.fa-feather-alt:after,.fad.fa-feather-pointed:after{content:"\f56b\f56b"}.fa-duotone.fa-sausage:after,.fad.fa-sausage:after{content:"\f820\f820"}.fa-duotone.fa-trash-can-clock:after,.fad.fa-trash-can-clock:after{content:"\e2aa\e2aa"}.fa-duotone.fa-p:after,.fad.fa-p:after{content:"\50\50"}.fa-duotone.fa-broom-wide:after,.fad.fa-broom-wide:after{content:"\e5d1\e5d1"}.fa-duotone.fa-snowflake:after,.fad.fa-snowflake:after{content:"\f2dc\f2dc"}.fa-duotone.fa-stomach:after,.fad.fa-stomach:after{content:"\f623\f623"}.fa-duotone.fa-newspaper:after,.fad.fa-newspaper:after{content:"\f1ea\f1ea"}.fa-duotone.fa-ad:after,.fa-duotone.fa-rectangle-ad:after,.fad.fa-ad:after,.fad.fa-rectangle-ad:after{content:"\f641\f641"}.fa-duotone.fa-guitar-electric:after,.fad.fa-guitar-electric:after{content:"\f8be\f8be"}.fa-duotone.fa-arrow-turn-down-right:after,.fad.fa-arrow-turn-down-right:after{content:"\e3d6\e3d6"}.fa-duotone.fa-moon-cloud:after,.fad.fa-moon-cloud:after{content:"\f754\f754"}.fa-duotone.fa-bread-slice-butter:after,.fad.fa-bread-slice-butter:after{content:"\e3e1\e3e1"}.fa-duotone.fa-arrow-circle-right:after,.fa-duotone.fa-circle-arrow-right:after,.fad.fa-arrow-circle-right:after,.fad.fa-circle-arrow-right:after{content:"\f0a9\f0a9"}.fa-duotone.fa-user-group-crown:after,.fa-duotone.fa-users-crown:after,.fad.fa-user-group-crown:after,.fad.fa-users-crown:after{content:"\f6a5\f6a5"}.fa-duotone.fa-circle-i:after,.fad.fa-circle-i:after{content:"\e111\e111"}.fa-duotone.fa-toilet-paper-check:after,.fad.fa-toilet-paper-check:after{content:"\e5b2\e5b2"}.fa-duotone.fa-filter-circle-xmark:after,.fad.fa-filter-circle-xmark:after{content:"\e17b\e17b"}.fa-duotone.fa-locust:after,.fad.fa-locust:after{content:"\e520\e520"}.fa-duotone.fa-sort:after,.fa-duotone.fa-unsorted:after,.fad.fa-sort:after,.fad.fa-unsorted:after{content:"\f0dc\f0dc"}.fa-duotone.fa-list-1-2:after,.fa-duotone.fa-list-numeric:after,.fa-duotone.fa-list-ol:after,.fad.fa-list-1-2:after,.fad.fa-list-numeric:after,.fad.fa-list-ol:after{content:"\f0cb\f0cb"}.fa-duotone.fa-chart-waterfall:after,.fad.fa-chart-waterfall:after{content:"\e0eb\e0eb"}.fa-duotone.fa-sparkle:after,.fad.fa-sparkle:after{content:"\e5d6\e5d6"}.fa-duotone.fa-face-party:after,.fad.fa-face-party:after{content:"\e383\e383"}.fa-duotone.fa-kidneys:after,.fad.fa-kidneys:after{content:"\f5fb\f5fb"}.fa-duotone.fa-wifi-exclamation:after,.fad.fa-wifi-exclamation:after{content:"\e2cf\e2cf"}.fa-duotone.fa-chart-network:after,.fad.fa-chart-network:after{content:"\f78a\f78a"}.fa-duotone.fa-person-dress-burst:after,.fad.fa-person-dress-burst:after{content:"\e544\e544"}.fa-duotone.fa-dice-d4:after,.fad.fa-dice-d4:after{content:"\f6d0\f6d0"}.fa-duotone.fa-money-check-alt:after,.fa-duotone.fa-money-check-dollar:after,.fad.fa-money-check-alt:after,.fad.fa-money-check-dollar:after{content:"\f53d\f53d"}.fa-duotone.fa-vector-square:after,.fad.fa-vector-square:after{content:"\f5cb\f5cb"}.fa-duotone.fa-bread-slice:after,.fad.fa-bread-slice:after{content:"\f7ec\f7ec"}.fa-duotone.fa-language:after,.fad.fa-language:after{content:"\f1ab\f1ab"}.fa-duotone.fa-wheat-awn-slash:after,.fad.fa-wheat-awn-slash:after{content:"\e338\e338"}.fa-duotone.fa-face-kiss-wink-heart:after,.fa-duotone.fa-kiss-wink-heart:after,.fad.fa-face-kiss-wink-heart:after,.fad.fa-kiss-wink-heart:after{content:"\f598\f598"}.fa-duotone.fa-dagger:after,.fad.fa-dagger:after{content:"\f6cb\f6cb"}.fa-duotone.fa-podium:after,.fad.fa-podium:after{content:"\f680\f680"}.fa-duotone.fa-memo-circle-check:after,.fad.fa-memo-circle-check:after{content:"\e1d9\e1d9"}.fa-duotone.fa-route-highway:after,.fad.fa-route-highway:after{content:"\f61a\f61a"}.fa-duotone.fa-arrow-alt-to-bottom:after,.fa-duotone.fa-down-to-line:after,.fad.fa-arrow-alt-to-bottom:after,.fad.fa-down-to-line:after{content:"\f34a\f34a"}.fa-duotone.fa-filter:after,.fad.fa-filter:after{content:"\f0b0\f0b0"}.fa-duotone.fa-square-g:after,.fad.fa-square-g:after{content:"\e271\e271"}.fa-duotone.fa-circle-phone:after,.fa-duotone.fa-phone-circle:after,.fad.fa-circle-phone:after,.fad.fa-phone-circle:after{content:"\e11b\e11b"}.fa-duotone.fa-clipboard-prescription:after,.fad.fa-clipboard-prescription:after{content:"\f5e8\f5e8"}.fa-duotone.fa-user-nurse-hair:after,.fad.fa-user-nurse-hair:after{content:"\e45d\e45d"}.fa-duotone.fa-question:after,.fad.fa-question:after{content:"\3f\3f"}.fa-duotone.fa-file-signature:after,.fad.fa-file-signature:after{content:"\f573\f573"}.fa-duotone.fa-toggle-large-on:after,.fad.fa-toggle-large-on:after{content:"\e5b1\e5b1"}.fa-duotone.fa-arrows-alt:after,.fa-duotone.fa-up-down-left-right:after,.fad.fa-arrows-alt:after,.fad.fa-up-down-left-right:after{content:"\f0b2\f0b2"}.fa-duotone.fa-dryer-alt:after,.fa-duotone.fa-dryer-heat:after,.fad.fa-dryer-alt:after,.fad.fa-dryer-heat:after{content:"\f862\f862"}.fa-duotone.fa-house-chimney-user:after,.fad.fa-house-chimney-user:after{content:"\e065\e065"}.fa-duotone.fa-hand-holding-heart:after,.fad.fa-hand-holding-heart:after{content:"\f4be\f4be"}.fa-duotone.fa-arrow-up-small-big:after,.fa-duotone.fa-sort-size-up-alt:after,.fad.fa-arrow-up-small-big:after,.fad.fa-sort-size-up-alt:after{content:"\f88f\f88f"}.fa-duotone.fa-train-track:after,.fad.fa-train-track:after{content:"\e453\e453"}.fa-duotone.fa-puzzle-piece:after,.fad.fa-puzzle-piece:after{content:"\f12e\f12e"}.fa-duotone.fa-money-check:after,.fad.fa-money-check:after{content:"\f53c\f53c"}.fa-duotone.fa-star-half-alt:after,.fa-duotone.fa-star-half-stroke:after,.fad.fa-star-half-alt:after,.fad.fa-star-half-stroke:after{content:"\f5c0\f5c0"}.fa-duotone.fa-file-exclamation:after,.fad.fa-file-exclamation:after{content:"\f31a\f31a"}.fa-duotone.fa-code:after,.fad.fa-code:after{content:"\f121\f121"}.fa-duotone.fa-glass-whiskey:after,.fa-duotone.fa-whiskey-glass:after,.fad.fa-glass-whiskey:after,.fad.fa-whiskey-glass:after{content:"\f7a0\f7a0"}.fa-duotone.fa-moon-stars:after,.fad.fa-moon-stars:after{content:"\f755\f755"}.fa-duotone.fa-building-circle-exclamation:after,.fad.fa-building-circle-exclamation:after{content:"\e4d3\e4d3"}.fa-duotone.fa-clothes-hanger:after,.fad.fa-clothes-hanger:after{content:"\e136\e136"}.fa-duotone.fa-mobile-iphone:after,.fa-duotone.fa-mobile-notch:after,.fad.fa-mobile-iphone:after,.fad.fa-mobile-notch:after{content:"\e1ee\e1ee"}.fa-duotone.fa-magnifying-glass-chart:after,.fad.fa-magnifying-glass-chart:after{content:"\e522\e522"}.fa-duotone.fa-arrow-up-right-from-square:after,.fa-duotone.fa-external-link:after,.fad.fa-arrow-up-right-from-square:after,.fad.fa-external-link:after{content:"\f08e\f08e"}.fa-duotone.fa-cubes-stacked:after,.fad.fa-cubes-stacked:after{content:"\e4e6\e4e6"}.fa-duotone.fa-images-user:after,.fad.fa-images-user:after{content:"\e1b9\e1b9"}.fa-duotone.fa-krw:after,.fa-duotone.fa-won-sign:after,.fa-duotone.fa-won:after,.fad.fa-krw:after,.fad.fa-won-sign:after,.fad.fa-won:after{content:"\f159\f159"}.fa-duotone.fa-image-polaroid-user:after,.fad.fa-image-polaroid-user:after{content:"\e1b6\e1b6"}.fa-duotone.fa-virus-covid:after,.fad.fa-virus-covid:after{content:"\e4a8\e4a8"}.fa-duotone.fa-square-ellipsis:after,.fad.fa-square-ellipsis:after{content:"\e26e\e26e"}.fa-duotone.fa-pie:after,.fad.fa-pie:after{content:"\f705\f705"}.fa-duotone.fa-chess-knight-alt:after,.fa-duotone.fa-chess-knight-piece:after,.fad.fa-chess-knight-alt:after,.fad.fa-chess-knight-piece:after{content:"\f442\f442"}.fa-duotone.fa-austral-sign:after,.fad.fa-austral-sign:after{content:"\e0a9\e0a9"}.fa-duotone.fa-cloud-plus:after,.fad.fa-cloud-plus:after{content:"\e35e\e35e"}.fa-duotone.fa-f:after,.fad.fa-f:after{content:"\46\46"}.fa-duotone.fa-leaf:after,.fad.fa-leaf:after{content:"\f06c\f06c"}.fa-duotone.fa-bed-bunk:after,.fad.fa-bed-bunk:after{content:"\f8f8\f8f8"}.fa-duotone.fa-road:after,.fad.fa-road:after{content:"\f018\f018"}.fa-duotone.fa-cab:after,.fa-duotone.fa-taxi:after,.fad.fa-cab:after,.fad.fa-taxi:after{content:"\f1ba\f1ba"}.fa-duotone.fa-person-circle-plus:after,.fad.fa-person-circle-plus:after{content:"\e541\e541"}.fa-duotone.fa-chart-pie:after,.fa-duotone.fa-pie-chart:after,.fad.fa-chart-pie:after,.fad.fa-pie-chart:after{content:"\f200\f200"}.fa-duotone.fa-bolt-lightning:after,.fad.fa-bolt-lightning:after{content:"\e0b7\e0b7"}.fa-duotone.fa-clock-eight:after,.fad.fa-clock-eight:after{content:"\e345\e345"}.fa-duotone.fa-sack-xmark:after,.fad.fa-sack-xmark:after{content:"\e56a\e56a"}.fa-duotone.fa-file-excel:after,.fad.fa-file-excel:after{content:"\f1c3\f1c3"}.fa-duotone.fa-file-contract:after,.fad.fa-file-contract:after{content:"\f56c\f56c"}.fa-duotone.fa-fish-fins:after,.fad.fa-fish-fins:after{content:"\e4f2\e4f2"}.fa-duotone.fa-circle-q:after,.fad.fa-circle-q:after{content:"\e11e\e11e"}.fa-duotone.fa-building-flag:after,.fad.fa-building-flag:after{content:"\e4d5\e4d5"}.fa-duotone.fa-face-grin-beam:after,.fa-duotone.fa-grin-beam:after,.fad.fa-face-grin-beam:after,.fad.fa-grin-beam:after{content:"\f582\f582"}.fa-duotone.fa-object-ungroup:after,.fad.fa-object-ungroup:after{content:"\f248\f248"}.fa-duotone.fa-face-disguise:after,.fad.fa-face-disguise:after{content:"\e370\e370"}.fa-duotone.fa-circle-arrow-down-right:after,.fad.fa-circle-arrow-down-right:after{content:"\e0fa\e0fa"}.fa-duotone.fa-alien-8bit:after,.fa-duotone.fa-alien-monster:after,.fad.fa-alien-8bit:after,.fad.fa-alien-monster:after{content:"\f8f6\f8f6"}.fa-duotone.fa-hand-point-ribbon:after,.fad.fa-hand-point-ribbon:after{content:"\e1a6\e1a6"}.fa-duotone.fa-poop:after,.fad.fa-poop:after{content:"\f619\f619"}.fa-duotone.fa-object-exclude:after,.fad.fa-object-exclude:after{content:"\e49c\e49c"}.fa-duotone.fa-telescope:after,.fad.fa-telescope:after{content:"\e03e\e03e"}.fa-duotone.fa-location-pin:after,.fa-duotone.fa-map-marker:after,.fad.fa-location-pin:after,.fad.fa-map-marker:after{content:"\f041\f041"}.fa-duotone.fa-square-list:after,.fad.fa-square-list:after{content:"\e489\e489"}.fa-duotone.fa-kaaba:after,.fad.fa-kaaba:after{content:"\f66b\f66b"}.fa-duotone.fa-toilet-paper:after,.fad.fa-toilet-paper:after{content:"\f71e\f71e"}.fa-duotone.fa-hard-hat:after,.fa-duotone.fa-hat-hard:after,.fa-duotone.fa-helmet-safety:after,.fad.fa-hard-hat:after,.fad.fa-hat-hard:after,.fad.fa-helmet-safety:after{content:"\f807\f807"}.fa-duotone.fa-comment-code:after,.fad.fa-comment-code:after{content:"\e147\e147"}.fa-duotone.fa-sim-cards:after,.fad.fa-sim-cards:after{content:"\e251\e251"}.fa-duotone.fa-starship:after,.fad.fa-starship:after{content:"\e039\e039"}.fa-duotone.fa-eject:after,.fad.fa-eject:after{content:"\f052\f052"}.fa-duotone.fa-arrow-alt-circle-right:after,.fa-duotone.fa-circle-right:after,.fad.fa-arrow-alt-circle-right:after,.fad.fa-circle-right:after{content:"\f35a\f35a"}.fa-duotone.fa-plane-circle-check:after,.fad.fa-plane-circle-check:after{content:"\e555\e555"}.fa-duotone.fa-seal:after,.fad.fa-seal:after{content:"\e241\e241"}.fa-duotone.fa-user-cowboy:after,.fad.fa-user-cowboy:after{content:"\f8ea\f8ea"}.fa-duotone.fa-hexagon-vertical-nft:after,.fad.fa-hexagon-vertical-nft:after{content:"\e505\e505"}.fa-duotone.fa-face-rolling-eyes:after,.fa-duotone.fa-meh-rolling-eyes:after,.fad.fa-face-rolling-eyes:after,.fad.fa-meh-rolling-eyes:after{content:"\f5a5\f5a5"}.fa-duotone.fa-bread-loaf:after,.fad.fa-bread-loaf:after{content:"\f7eb\f7eb"}.fa-duotone.fa-rings-wedding:after,.fad.fa-rings-wedding:after{content:"\f81b\f81b"}.fa-duotone.fa-object-group:after,.fad.fa-object-group:after{content:"\f247\f247"}.fa-duotone.fa-french-fries:after,.fad.fa-french-fries:after{content:"\f803\f803"}.fa-duotone.fa-chart-line:after,.fa-duotone.fa-line-chart:after,.fad.fa-chart-line:after,.fad.fa-line-chart:after{content:"\f201\f201"}.fa-duotone.fa-calendar-arrow-down:after,.fa-duotone.fa-calendar-download:after,.fad.fa-calendar-arrow-down:after,.fad.fa-calendar-download:after{content:"\e0d0\e0d0"}.fa-duotone.fa-send-back:after,.fad.fa-send-back:after{content:"\f87e\f87e"}.fa-duotone.fa-mask-ventilator:after,.fad.fa-mask-ventilator:after{content:"\e524\e524"}.fa-duotone.fa-signature-lock:after,.fad.fa-signature-lock:after{content:"\e3ca\e3ca"}.fa-duotone.fa-arrow-right:after,.fad.fa-arrow-right:after{content:"\f061\f061"}.fa-duotone.fa-map-signs:after,.fa-duotone.fa-signs-post:after,.fad.fa-map-signs:after,.fad.fa-signs-post:after{content:"\f277\f277"}.fa-duotone.fa-octagon-plus:after,.fa-duotone.fa-plus-octagon:after,.fad.fa-octagon-plus:after,.fad.fa-plus-octagon:after{content:"\f301\f301"}.fa-duotone.fa-cash-register:after,.fad.fa-cash-register:after{content:"\f788\f788"}.fa-duotone.fa-person-circle-question:after,.fad.fa-person-circle-question:after{content:"\e542\e542"}.fa-duotone.fa-melon-slice:after,.fad.fa-melon-slice:after{content:"\e311\e311"}.fa-duotone.fa-space-station-moon:after,.fad.fa-space-station-moon:after{content:"\e033\e033"}.fa-duotone.fa-comment-alt-smile:after,.fa-duotone.fa-message-smile:after,.fad.fa-comment-alt-smile:after,.fad.fa-message-smile:after{content:"\f4aa\f4aa"}.fa-duotone.fa-cup-straw:after,.fad.fa-cup-straw:after{content:"\e363\e363"}.fa-duotone.fa-arrow-alt-from-right:after,.fa-duotone.fa-left-from-line:after,.fad.fa-arrow-alt-from-right:after,.fad.fa-left-from-line:after{content:"\f348\f348"}.fa-duotone.fa-h:after,.fad.fa-h:after{content:"\48\48"}.fa-duotone.fa-basket-shopping-simple:after,.fa-duotone.fa-shopping-basket-alt:after,.fad.fa-basket-shopping-simple:after,.fad.fa-shopping-basket-alt:after{content:"\e0af\e0af"}.fa-duotone.fa-hands-heart:after,.fa-duotone.fa-hands-holding-heart:after,.fad.fa-hands-heart:after,.fad.fa-hands-holding-heart:after{content:"\f4c3\f4c3"}.fa-duotone.fa-clock-nine:after,.fad.fa-clock-nine:after{content:"\e34c\e34c"}.fa-duotone.fa-tarp:after,.fad.fa-tarp:after{content:"\e57b\e57b"}.fa-duotone.fa-face-sleepy:after,.fad.fa-face-sleepy:after{content:"\e38e\e38e"}.fa-duotone.fa-hand-horns:after,.fad.fa-hand-horns:after{content:"\e1a9\e1a9"}.fa-duotone.fa-screwdriver-wrench:after,.fa-duotone.fa-tools:after,.fad.fa-screwdriver-wrench:after,.fad.fa-tools:after{content:"\f7d9\f7d9"}.fa-duotone.fa-arrows-to-eye:after,.fad.fa-arrows-to-eye:after{content:"\e4bf\e4bf"}.fa-duotone.fa-circle-three-quarters:after,.fad.fa-circle-three-quarters:after{content:"\e125\e125"}.fa-duotone.fa-trophy-alt:after,.fa-duotone.fa-trophy-star:after,.fad.fa-trophy-alt:after,.fad.fa-trophy-star:after{content:"\f2eb\f2eb"}.fa-duotone.fa-plug-circle-bolt:after,.fad.fa-plug-circle-bolt:after{content:"\e55b\e55b"}.fa-duotone.fa-face-thermometer:after,.fad.fa-face-thermometer:after{content:"\e39a\e39a"}.fa-duotone.fa-grid-round-4:after,.fad.fa-grid-round-4:after{content:"\e5dd\e5dd"}.fa-duotone.fa-shirt-running:after,.fad.fa-shirt-running:after{content:"\e3c8\e3c8"}.fa-duotone.fa-book-circle-arrow-up:after,.fad.fa-book-circle-arrow-up:after{content:"\e0bd\e0bd"}.fa-duotone.fa-face-nauseated:after,.fad.fa-face-nauseated:after{content:"\e381\e381"}.fa-duotone.fa-heart:after,.fad.fa-heart:after{content:"\f004\f004"}.fa-duotone.fa-file-chart-pie:after,.fad.fa-file-chart-pie:after{content:"\f65a\f65a"}.fa-duotone.fa-mars-and-venus:after,.fad.fa-mars-and-venus:after{content:"\f224\f224"}.fa-duotone.fa-home-user:after,.fa-duotone.fa-house-user:after,.fad.fa-home-user:after,.fad.fa-house-user:after{content:"\e1b0\e1b0"}.fa-duotone.fa-circle-arrow-down-left:after,.fad.fa-circle-arrow-down-left:after{content:"\e0f9\e0f9"}.fa-duotone.fa-dumpster-fire:after,.fad.fa-dumpster-fire:after{content:"\f794\f794"}.fa-duotone.fa-hexagon-minus:after,.fa-duotone.fa-minus-hexagon:after,.fad.fa-hexagon-minus:after,.fad.fa-minus-hexagon:after{content:"\f307\f307"}.fa-duotone.fa-arrow-alt-to-left:after,.fa-duotone.fa-left-to-line:after,.fad.fa-arrow-alt-to-left:after,.fad.fa-left-to-line:after{content:"\f34b\f34b"}.fa-duotone.fa-house-crack:after,.fad.fa-house-crack:after{content:"\e3b1\e3b1"}.fa-duotone.fa-paw-alt:after,.fa-duotone.fa-paw-simple:after,.fad.fa-paw-alt:after,.fad.fa-paw-simple:after{content:"\f701\f701"}.fa-duotone.fa-arrow-left-long-to-line:after,.fad.fa-arrow-left-long-to-line:after{content:"\e3d4\e3d4"}.fa-duotone.fa-brackets-round:after,.fa-duotone.fa-parentheses:after,.fad.fa-brackets-round:after,.fad.fa-parentheses:after{content:"\e0c5\e0c5"}.fa-duotone.fa-cocktail:after,.fa-duotone.fa-martini-glass-citrus:after,.fad.fa-cocktail:after,.fad.fa-martini-glass-citrus:after{content:"\f561\f561"}.fa-duotone.fa-user-shakespeare:after,.fad.fa-user-shakespeare:after{content:"\e2c2\e2c2"}.fa-duotone.fa-arrow-right-to-arc:after,.fad.fa-arrow-right-to-arc:after{content:"\e4b2\e4b2"}.fa-duotone.fa-face-surprise:after,.fa-duotone.fa-surprise:after,.fad.fa-face-surprise:after,.fad.fa-surprise:after{content:"\f5c2\f5c2"}.fa-duotone.fa-bottle-water:after,.fad.fa-bottle-water:after{content:"\e4c5\e4c5"}.fa-duotone.fa-circle-pause:after,.fa-duotone.fa-pause-circle:after,.fad.fa-circle-pause:after,.fad.fa-pause-circle:after{content:"\f28b\f28b"}.fa-duotone.fa-gauge-circle-plus:after,.fad.fa-gauge-circle-plus:after{content:"\e498\e498"}.fa-duotone.fa-folders:after,.fad.fa-folders:after{content:"\f660\f660"}.fa-duotone.fa-angel:after,.fad.fa-angel:after{content:"\f779\f779"}.fa-duotone.fa-value-absolute:after,.fad.fa-value-absolute:after{content:"\f6a6\f6a6"}.fa-duotone.fa-rabbit:after,.fad.fa-rabbit:after{content:"\f708\f708"}.fa-duotone.fa-toilet-paper-slash:after,.fad.fa-toilet-paper-slash:after{content:"\e072\e072"}.fa-duotone.fa-circle-euro:after,.fad.fa-circle-euro:after{content:"\e5ce\e5ce"}.fa-duotone.fa-apple-alt:after,.fa-duotone.fa-apple-whole:after,.fad.fa-apple-alt:after,.fad.fa-apple-whole:after{content:"\f5d1\f5d1"}.fa-duotone.fa-kitchen-set:after,.fad.fa-kitchen-set:after{content:"\e51a\e51a"}.fa-duotone.fa-diamond-half:after,.fad.fa-diamond-half:after{content:"\e5b7\e5b7"}.fa-duotone.fa-lock-alt:after,.fa-duotone.fa-lock-keyhole:after,.fad.fa-lock-alt:after,.fad.fa-lock-keyhole:after{content:"\f30d\f30d"}.fa-duotone.fa-r:after,.fad.fa-r:after{content:"\52\52"}.fa-duotone.fa-temperature-1:after,.fa-duotone.fa-temperature-quarter:after,.fa-duotone.fa-thermometer-1:after,.fa-duotone.fa-thermometer-quarter:after,.fad.fa-temperature-1:after,.fad.fa-temperature-quarter:after,.fad.fa-thermometer-1:after,.fad.fa-thermometer-quarter:after{content:"\f2ca\f2ca"}.fa-duotone.fa-info-square:after,.fa-duotone.fa-square-info:after,.fad.fa-info-square:after,.fad.fa-square-info:after{content:"\f30f\f30f"}.fa-duotone.fa-wifi-slash:after,.fad.fa-wifi-slash:after{content:"\f6ac\f6ac"}.fa-duotone.fa-toilet-paper-xmark:after,.fad.fa-toilet-paper-xmark:after{content:"\e5b3\e5b3"}.fa-duotone.fa-hands-holding-dollar:after,.fa-duotone.fa-hands-usd:after,.fad.fa-hands-holding-dollar:after,.fad.fa-hands-usd:after{content:"\f4c5\f4c5"}.fa-duotone.fa-cube:after,.fad.fa-cube:after{content:"\f1b2\f1b2"}.fa-duotone.fa-arrow-down-triangle-square:after,.fa-duotone.fa-sort-shapes-down:after,.fad.fa-arrow-down-triangle-square:after,.fad.fa-sort-shapes-down:after{content:"\f888\f888"}.fa-duotone.fa-bitcoin-sign:after,.fad.fa-bitcoin-sign:after{content:"\e0b4\e0b4"}.fa-duotone.fa-shutters:after,.fad.fa-shutters:after{content:"\e449\e449"}.fa-duotone.fa-shield-dog:after,.fad.fa-shield-dog:after{content:"\e573\e573"}.fa-duotone.fa-solar-panel:after,.fad.fa-solar-panel:after{content:"\f5ba\f5ba"}.fa-duotone.fa-lock-open:after,.fad.fa-lock-open:after{content:"\f3c1\f3c1"}.fa-duotone.fa-table-tree:after,.fad.fa-table-tree:after{content:"\e293\e293"}.fa-duotone.fa-house-chimney-heart:after,.fad.fa-house-chimney-heart:after{content:"\e1b2\e1b2"}.fa-duotone.fa-tally-3:after,.fad.fa-tally-3:after{content:"\e296\e296"}.fa-duotone.fa-elevator:after,.fad.fa-elevator:after{content:"\e16d\e16d"}.fa-duotone.fa-money-bill-transfer:after,.fad.fa-money-bill-transfer:after{content:"\e528\e528"}.fa-duotone.fa-money-bill-trend-up:after,.fad.fa-money-bill-trend-up:after{content:"\e529\e529"}.fa-duotone.fa-house-flood-water-circle-arrow-right:after,.fad.fa-house-flood-water-circle-arrow-right:after{content:"\e50f\e50f"}.fa-duotone.fa-poll-h:after,.fa-duotone.fa-square-poll-horizontal:after,.fad.fa-poll-h:after,.fad.fa-square-poll-horizontal:after{content:"\f682\f682"}.fa-duotone.fa-circle:after,.fad.fa-circle:after{content:"\f111\f111"}.fa-duotone.fa-cart-circle-exclamation:after,.fad.fa-cart-circle-exclamation:after{content:"\e3f2\e3f2"}.fa-duotone.fa-sword:after,.fad.fa-sword:after{content:"\f71c\f71c"}.fa-duotone.fa-backward-fast:after,.fa-duotone.fa-fast-backward:after,.fad.fa-backward-fast:after,.fad.fa-fast-backward:after{content:"\f049\f049"}.fa-duotone.fa-recycle:after,.fad.fa-recycle:after{content:"\f1b8\f1b8"}.fa-duotone.fa-user-astronaut:after,.fad.fa-user-astronaut:after{content:"\f4fb\f4fb"}.fa-duotone.fa-interrobang:after,.fad.fa-interrobang:after{content:"\e5ba\e5ba"}.fa-duotone.fa-plane-slash:after,.fad.fa-plane-slash:after{content:"\e069\e069"}.fa-duotone.fa-circle-dashed:after,.fad.fa-circle-dashed:after{content:"\e105\e105"}.fa-duotone.fa-trademark:after,.fad.fa-trademark:after{content:"\f25c\f25c"}.fa-duotone.fa-basketball-ball:after,.fa-duotone.fa-basketball:after,.fad.fa-basketball-ball:after,.fad.fa-basketball:after{content:"\f434\f434"}.fa-duotone.fa-fork-knife:after,.fa-duotone.fa-utensils-alt:after,.fad.fa-fork-knife:after,.fad.fa-utensils-alt:after{content:"\f2e6\f2e6"}.fa-duotone.fa-satellite-dish:after,.fad.fa-satellite-dish:after{content:"\f7c0\f7c0"}.fa-duotone.fa-badge-check:after,.fad.fa-badge-check:after{content:"\f336\f336"}.fa-duotone.fa-arrow-alt-circle-up:after,.fa-duotone.fa-circle-up:after,.fad.fa-arrow-alt-circle-up:after,.fad.fa-circle-up:after{content:"\f35b\f35b"}.fa-duotone.fa-slider:after,.fad.fa-slider:after{content:"\e252\e252"}.fa-duotone.fa-mobile-alt:after,.fa-duotone.fa-mobile-screen-button:after,.fad.fa-mobile-alt:after,.fad.fa-mobile-screen-button:after{content:"\f3cd\f3cd"}.fa-duotone.fa-clock-one-thirty:after,.fad.fa-clock-one-thirty:after{content:"\e34f\e34f"}.fa-duotone.fa-inbox-arrow-up:after,.fa-duotone.fa-inbox-out:after,.fad.fa-inbox-arrow-up:after,.fad.fa-inbox-out:after{content:"\f311\f311"}.fa-duotone.fa-cloud-slash:after,.fad.fa-cloud-slash:after{content:"\e137\e137"}.fa-duotone.fa-volume-high:after,.fa-duotone.fa-volume-up:after,.fad.fa-volume-high:after,.fad.fa-volume-up:after{content:"\f028\f028"}.fa-duotone.fa-users-rays:after,.fad.fa-users-rays:after{content:"\e593\e593"}.fa-duotone.fa-wallet:after,.fad.fa-wallet:after{content:"\f555\f555"}.fa-duotone.fa-octagon-check:after,.fad.fa-octagon-check:after{content:"\e426\e426"}.fa-duotone.fa-flatbread-stuffed:after,.fad.fa-flatbread-stuffed:after{content:"\e40c\e40c"}.fa-duotone.fa-clipboard-check:after,.fad.fa-clipboard-check:after{content:"\f46c\f46c"}.fa-duotone.fa-cart-circle-plus:after,.fad.fa-cart-circle-plus:after{content:"\e3f3\e3f3"}.fa-duotone.fa-shipping-timed:after,.fa-duotone.fa-truck-clock:after,.fad.fa-shipping-timed:after,.fad.fa-truck-clock:after{content:"\f48c\f48c"}.fa-duotone.fa-pool-8-ball:after,.fad.fa-pool-8-ball:after{content:"\e3c5\e3c5"}.fa-duotone.fa-file-audio:after,.fad.fa-file-audio:after{content:"\f1c7\f1c7"}.fa-duotone.fa-turn-down-left:after,.fad.fa-turn-down-left:after{content:"\e331\e331"}.fa-duotone.fa-lock-hashtag:after,.fad.fa-lock-hashtag:after{content:"\e423\e423"}.fa-duotone.fa-chart-radar:after,.fad.fa-chart-radar:after{content:"\e0e7\e0e7"}.fa-duotone.fa-staff:after,.fad.fa-staff:after{content:"\f71b\f71b"}.fa-duotone.fa-burger:after,.fa-duotone.fa-hamburger:after,.fad.fa-burger:after,.fad.fa-hamburger:after{content:"\f805\f805"}.fa-duotone.fa-utility-pole:after,.fad.fa-utility-pole:after{content:"\e2c3\e2c3"}.fa-duotone.fa-transporter-6:after,.fad.fa-transporter-6:after{content:"\e2a7\e2a7"}.fa-duotone.fa-wrench:after,.fad.fa-wrench:after{content:"\f0ad\f0ad"}.fa-duotone.fa-bugs:after,.fad.fa-bugs:after{content:"\e4d0\e4d0"}.fa-duotone.fa-vector-polygon:after,.fad.fa-vector-polygon:after{content:"\e2c7\e2c7"}.fa-duotone.fa-diagram-nested:after,.fad.fa-diagram-nested:after{content:"\e157\e157"}.fa-duotone.fa-rupee-sign:after,.fa-duotone.fa-rupee:after,.fad.fa-rupee-sign:after,.fad.fa-rupee:after{content:"\f156\f156"}.fa-duotone.fa-file-image:after,.fad.fa-file-image:after{content:"\f1c5\f1c5"}.fa-duotone.fa-circle-question:after,.fa-duotone.fa-question-circle:after,.fad.fa-circle-question:after,.fad.fa-question-circle:after{content:"\f059\f059"}.fa-duotone.fa-image-user:after,.fad.fa-image-user:after{content:"\e1b8\e1b8"}.fa-duotone.fa-buoy:after,.fad.fa-buoy:after{content:"\e5b5\e5b5"}.fa-duotone.fa-plane-departure:after,.fad.fa-plane-departure:after{content:"\f5b0\f5b0"}.fa-duotone.fa-handshake-slash:after,.fad.fa-handshake-slash:after{content:"\e060\e060"}.fa-duotone.fa-book-bookmark:after,.fad.fa-book-bookmark:after{content:"\e0bb\e0bb"}.fa-duotone.fa-border-center-h:after,.fad.fa-border-center-h:after{content:"\f89c\f89c"}.fa-duotone.fa-can-food:after,.fad.fa-can-food:after{content:"\e3e6\e3e6"}.fa-duotone.fa-typewriter:after,.fad.fa-typewriter:after{content:"\f8e7\f8e7"}.fa-duotone.fa-arrow-right-from-arc:after,.fad.fa-arrow-right-from-arc:after{content:"\e4b1\e4b1"}.fa-duotone.fa-circle-k:after,.fad.fa-circle-k:after{content:"\e113\e113"}.fa-duotone.fa-face-hand-over-mouth:after,.fad.fa-face-hand-over-mouth:after{content:"\e378\e378"}.fa-duotone.fa-popcorn:after,.fad.fa-popcorn:after{content:"\f819\f819"}.fa-duotone.fa-house-flood:after,.fa-duotone.fa-house-water:after,.fad.fa-house-flood:after,.fad.fa-house-water:after{content:"\f74f\f74f"}.fa-duotone.fa-object-subtract:after,.fad.fa-object-subtract:after{content:"\e49e\e49e"}.fa-duotone.fa-code-branch:after,.fad.fa-code-branch:after{content:"\f126\f126"}.fa-duotone.fa-warehouse-alt:after,.fa-duotone.fa-warehouse-full:after,.fad.fa-warehouse-alt:after,.fad.fa-warehouse-full:after{content:"\f495\f495"}.fa-duotone.fa-hat-cowboy:after,.fad.fa-hat-cowboy:after{content:"\f8c0\f8c0"}.fa-duotone.fa-bridge:after,.fad.fa-bridge:after{content:"\e4c8\e4c8"}.fa-duotone.fa-phone-alt:after,.fa-duotone.fa-phone-flip:after,.fad.fa-phone-alt:after,.fad.fa-phone-flip:after{content:"\f879\f879"}.fa-duotone.fa-arrow-down-from-dotted-line:after,.fad.fa-arrow-down-from-dotted-line:after{content:"\e090\e090"}.fa-duotone.fa-file-doc:after,.fad.fa-file-doc:after{content:"\e5ed\e5ed"}.fa-duotone.fa-square-quarters:after,.fad.fa-square-quarters:after{content:"\e44e\e44e"}.fa-duotone.fa-truck-front:after,.fad.fa-truck-front:after{content:"\e2b7\e2b7"}.fa-duotone.fa-cat:after,.fad.fa-cat:after{content:"\f6be\f6be"}.fa-duotone.fa-trash-xmark:after,.fad.fa-trash-xmark:after{content:"\e2b4\e2b4"}.fa-duotone.fa-caret-circle-left:after,.fa-duotone.fa-circle-caret-left:after,.fad.fa-caret-circle-left:after,.fad.fa-circle-caret-left:after{content:"\f32e\f32e"}.fa-duotone.fa-files:after,.fad.fa-files:after{content:"\e178\e178"}.fa-duotone.fa-anchor-circle-exclamation:after,.fad.fa-anchor-circle-exclamation:after{content:"\e4ab\e4ab"}.fa-duotone.fa-face-clouds:after,.fad.fa-face-clouds:after{content:"\e47d\e47d"}.fa-duotone.fa-user-crown:after,.fad.fa-user-crown:after{content:"\f6a4\f6a4"}.fa-duotone.fa-truck-field:after,.fad.fa-truck-field:after{content:"\e58d\e58d"}.fa-duotone.fa-route:after,.fad.fa-route:after{content:"\f4d7\f4d7"}.fa-duotone.fa-cart-circle-check:after,.fad.fa-cart-circle-check:after{content:"\e3f1\e3f1"}.fa-duotone.fa-clipboard-question:after,.fad.fa-clipboard-question:after{content:"\e4e3\e4e3"}.fa-duotone.fa-panorama:after,.fad.fa-panorama:after{content:"\e209\e209"}.fa-duotone.fa-comment-medical:after,.fad.fa-comment-medical:after{content:"\f7f5\f7f5"}.fa-duotone.fa-teeth-open:after,.fad.fa-teeth-open:after{content:"\f62f\f62f"}.fa-duotone.fa-user-tie-hair-long:after,.fad.fa-user-tie-hair-long:after{content:"\e460\e460"}.fa-duotone.fa-file-circle-minus:after,.fad.fa-file-circle-minus:after{content:"\e4ed\e4ed"}.fa-duotone.fa-head-side-medical:after,.fad.fa-head-side-medical:after{content:"\f809\f809"}.fa-duotone.fa-tags:after,.fad.fa-tags:after{content:"\f02c\f02c"}.fa-duotone.fa-wine-glass:after,.fad.fa-wine-glass:after{content:"\f4e3\f4e3"}.fa-duotone.fa-fast-forward:after,.fa-duotone.fa-forward-fast:after,.fad.fa-fast-forward:after,.fad.fa-forward-fast:after{content:"\f050\f050"}.fa-duotone.fa-face-meh-blank:after,.fa-duotone.fa-meh-blank:after,.fad.fa-face-meh-blank:after,.fad.fa-meh-blank:after{content:"\f5a4\f5a4"}.fa-duotone.fa-user-robot:after,.fad.fa-user-robot:after{content:"\e04b\e04b"}.fa-duotone.fa-parking:after,.fa-duotone.fa-square-parking:after,.fad.fa-parking:after,.fad.fa-square-parking:after{content:"\f540\f540"}.fa-duotone.fa-card-diamond:after,.fad.fa-card-diamond:after{content:"\e3ea\e3ea"}.fa-duotone.fa-face-zipper:after,.fad.fa-face-zipper:after{content:"\e3a5\e3a5"}.fa-duotone.fa-face-raised-eyebrow:after,.fad.fa-face-raised-eyebrow:after{content:"\e388\e388"}.fa-duotone.fa-house-signal:after,.fad.fa-house-signal:after{content:"\e012\e012"}.fa-duotone.fa-chevron-square-up:after,.fa-duotone.fa-square-chevron-up:after,.fad.fa-chevron-square-up:after,.fad.fa-square-chevron-up:after{content:"\f32c\f32c"}.fa-duotone.fa-bars-progress:after,.fa-duotone.fa-tasks-alt:after,.fad.fa-bars-progress:after,.fad.fa-tasks-alt:after{content:"\f828\f828"}.fa-duotone.fa-faucet-drip:after,.fad.fa-faucet-drip:after{content:"\e006\e006"}.fa-duotone.fa-arrows-to-line:after,.fad.fa-arrows-to-line:after{content:"\e0a7\e0a7"}.fa-duotone.fa-dolphin:after,.fad.fa-dolphin:after{content:"\e168\e168"}.fa-duotone.fa-arrow-up-right:after,.fad.fa-arrow-up-right:after{content:"\e09f\e09f"}.fa-duotone.fa-circle-r:after,.fad.fa-circle-r:after{content:"\e120\e120"}.fa-duotone.fa-cart-flatbed:after,.fa-duotone.fa-dolly-flatbed:after,.fad.fa-cart-flatbed:after,.fad.fa-dolly-flatbed:after{content:"\f474\f474"}.fa-duotone.fa-ban-smoking:after,.fa-duotone.fa-smoking-ban:after,.fad.fa-ban-smoking:after,.fad.fa-smoking-ban:after{content:"\f54d\f54d"}.fa-duotone.fa-circle-sort-up:after,.fa-duotone.fa-sort-circle-up:after,.fad.fa-circle-sort-up:after,.fad.fa-sort-circle-up:after{content:"\e032\e032"}.fa-duotone.fa-terminal:after,.fad.fa-terminal:after{content:"\f120\f120"}.fa-duotone.fa-mobile-button:after,.fad.fa-mobile-button:after{content:"\f10b\f10b"}.fa-duotone.fa-house-medical-flag:after,.fad.fa-house-medical-flag:after{content:"\e514\e514"}.fa-duotone.fa-basket-shopping:after,.fa-duotone.fa-shopping-basket:after,.fad.fa-basket-shopping:after,.fad.fa-shopping-basket:after{content:"\f291\f291"}.fa-duotone.fa-tape:after,.fad.fa-tape:after{content:"\f4db\f4db"}.fa-duotone.fa-chestnut:after,.fad.fa-chestnut:after{content:"\e3f6\e3f6"}.fa-duotone.fa-bus-alt:after,.fa-duotone.fa-bus-simple:after,.fad.fa-bus-alt:after,.fad.fa-bus-simple:after{content:"\f55e\f55e"}.fa-duotone.fa-eye:after,.fad.fa-eye:after{content:"\f06e\f06e"}.fa-duotone.fa-face-sad-cry:after,.fa-duotone.fa-sad-cry:after,.fad.fa-face-sad-cry:after,.fad.fa-sad-cry:after{content:"\f5b3\f5b3"}.fa-duotone.fa-heat:after,.fad.fa-heat:after{content:"\e00c\e00c"}.fa-duotone.fa-ticket-airline:after,.fad.fa-ticket-airline:after{content:"\e29a\e29a"}.fa-duotone.fa-boot-heeled:after,.fad.fa-boot-heeled:after{content:"\e33f\e33f"}.fa-duotone.fa-arrows-minimize:after,.fa-duotone.fa-compress-arrows:after,.fad.fa-arrows-minimize:after,.fad.fa-compress-arrows:after{content:"\e0a5\e0a5"}.fa-duotone.fa-audio-description:after,.fad.fa-audio-description:after{content:"\f29e\f29e"}.fa-duotone.fa-person-military-to-person:after,.fad.fa-person-military-to-person:after{content:"\e54c\e54c"}.fa-duotone.fa-file-shield:after,.fad.fa-file-shield:after{content:"\e4f0\e4f0"}.fa-duotone.fa-hexagon:after,.fad.fa-hexagon:after{content:"\f312\f312"}.fa-duotone.fa-manhole:after,.fad.fa-manhole:after{content:"\e1d6\e1d6"}.fa-duotone.fa-user-slash:after,.fad.fa-user-slash:after{content:"\f506\f506"}.fa-duotone.fa-pen:after,.fad.fa-pen:after{content:"\f304\f304"}.fa-duotone.fa-tower-observation:after,.fad.fa-tower-observation:after{content:"\e586\e586"}.fa-duotone.fa-floppy-disks:after,.fad.fa-floppy-disks:after{content:"\e183\e183"}.fa-duotone.fa-toilet-paper-blank-under:after,.fa-duotone.fa-toilet-paper-reverse-alt:after,.fad.fa-toilet-paper-blank-under:after,.fad.fa-toilet-paper-reverse-alt:after{content:"\e29f\e29f"}.fa-duotone.fa-file-code:after,.fad.fa-file-code:after{content:"\f1c9\f1c9"}.fa-duotone.fa-signal-5:after,.fa-duotone.fa-signal-perfect:after,.fa-duotone.fa-signal:after,.fad.fa-signal-5:after,.fad.fa-signal-perfect:after,.fad.fa-signal:after{content:"\f012\f012"}.fa-duotone.fa-pump:after,.fad.fa-pump:after{content:"\e442\e442"}.fa-duotone.fa-bus:after,.fad.fa-bus:after{content:"\f207\f207"}.fa-duotone.fa-heart-circle-xmark:after,.fad.fa-heart-circle-xmark:after{content:"\e501\e501"}.fa-duotone.fa-arrow-up-left-from-circle:after,.fad.fa-arrow-up-left-from-circle:after{content:"\e09e\e09e"}.fa-duotone.fa-home-lg:after,.fa-duotone.fa-house-chimney:after,.fad.fa-home-lg:after,.fad.fa-house-chimney:after{content:"\e3af\e3af"}.fa-duotone.fa-window-maximize:after,.fad.fa-window-maximize:after{content:"\f2d0\f2d0"}.fa-duotone.fa-dryer:after,.fad.fa-dryer:after{content:"\f861\f861"}.fa-duotone.fa-face-frown:after,.fa-duotone.fa-frown:after,.fad.fa-face-frown:after,.fad.fa-frown:after{content:"\f119\f119"}.fa-duotone.fa-chess-bishop-alt:after,.fa-duotone.fa-chess-bishop-piece:after,.fad.fa-chess-bishop-alt:after,.fad.fa-chess-bishop-piece:after{content:"\f43b\f43b"}.fa-duotone.fa-shirt-tank-top:after,.fad.fa-shirt-tank-top:after{content:"\e3c9\e3c9"}.fa-duotone.fa-diploma:after,.fa-duotone.fa-scroll-ribbon:after,.fad.fa-diploma:after,.fad.fa-scroll-ribbon:after{content:"\f5ea\f5ea"}.fa-duotone.fa-screencast:after,.fad.fa-screencast:after{content:"\e23e\e23e"}.fa-duotone.fa-walker:after,.fad.fa-walker:after{content:"\f831\f831"}.fa-duotone.fa-prescription:after,.fad.fa-prescription:after{content:"\f5b1\f5b1"}.fa-duotone.fa-shop:after,.fa-duotone.fa-store-alt:after,.fad.fa-shop:after,.fad.fa-store-alt:after{content:"\f54f\f54f"}.fa-duotone.fa-floppy-disk:after,.fa-duotone.fa-save:after,.fad.fa-floppy-disk:after,.fad.fa-save:after{content:"\f0c7\f0c7"}.fa-duotone.fa-vihara:after,.fad.fa-vihara:after{content:"\f6a7\f6a7"}.fa-duotone.fa-face-kiss-closed-eyes:after,.fad.fa-face-kiss-closed-eyes:after{content:"\e37d\e37d"}.fa-duotone.fa-balance-scale-left:after,.fa-duotone.fa-scale-unbalanced:after,.fad.fa-balance-scale-left:after,.fad.fa-scale-unbalanced:after{content:"\f515\f515"}.fa-duotone.fa-file-user:after,.fad.fa-file-user:after{content:"\f65c\f65c"}.fa-duotone.fa-user-police-tie:after,.fad.fa-user-police-tie:after{content:"\e334\e334"}.fa-duotone.fa-face-tongue-money:after,.fad.fa-face-tongue-money:after{content:"\e39d\e39d"}.fa-duotone.fa-tennis-ball:after,.fad.fa-tennis-ball:after{content:"\f45e\f45e"}.fa-duotone.fa-square-l:after,.fad.fa-square-l:after{content:"\e275\e275"}.fa-duotone.fa-sort-asc:after,.fa-duotone.fa-sort-up:after,.fad.fa-sort-asc:after,.fad.fa-sort-up:after{content:"\f0de\f0de"}.fa-duotone.fa-calendar-arrow-up:after,.fa-duotone.fa-calendar-upload:after,.fad.fa-calendar-arrow-up:after,.fad.fa-calendar-upload:after{content:"\e0d1\e0d1"}.fa-duotone.fa-comment-dots:after,.fa-duotone.fa-commenting:after,.fad.fa-comment-dots:after,.fad.fa-commenting:after{content:"\f4ad\f4ad"}.fa-duotone.fa-plant-wilt:after,.fad.fa-plant-wilt:after{content:"\e5aa\e5aa"}.fa-duotone.fa-scarf:after,.fad.fa-scarf:after{content:"\f7c1\f7c1"}.fa-duotone.fa-album-circle-plus:after,.fad.fa-album-circle-plus:after{content:"\e48c\e48c"}.fa-duotone.fa-user-nurse-hair-long:after,.fad.fa-user-nurse-hair-long:after{content:"\e45e\e45e"}.fa-duotone.fa-diamond:after,.fad.fa-diamond:after{content:"\f219\f219"}.fa-duotone.fa-arrow-alt-square-left:after,.fa-duotone.fa-square-left:after,.fad.fa-arrow-alt-square-left:after,.fad.fa-square-left:after{content:"\f351\f351"}.fa-duotone.fa-face-grin-squint:after,.fa-duotone.fa-grin-squint:after,.fad.fa-face-grin-squint:after,.fad.fa-grin-squint:after{content:"\f585\f585"}.fa-duotone.fa-circle-ellipsis-vertical:after,.fad.fa-circle-ellipsis-vertical:after{content:"\e10b\e10b"}.fa-duotone.fa-hand-holding-dollar:after,.fa-duotone.fa-hand-holding-usd:after,.fad.fa-hand-holding-dollar:after,.fad.fa-hand-holding-usd:after{content:"\f4c0\f4c0"}.fa-duotone.fa-grid-dividers:after,.fad.fa-grid-dividers:after{content:"\e3ad\e3ad"}.fa-duotone.fa-bacterium:after,.fad.fa-bacterium:after{content:"\e05a\e05a"}.fa-duotone.fa-hand-pointer:after,.fad.fa-hand-pointer:after{content:"\f25a\f25a"}.fa-duotone.fa-drum-steelpan:after,.fad.fa-drum-steelpan:after{content:"\f56a\f56a"}.fa-duotone.fa-hand-scissors:after,.fad.fa-hand-scissors:after{content:"\f257\f257"}.fa-duotone.fa-hands-praying:after,.fa-duotone.fa-praying-hands:after,.fad.fa-hands-praying:after,.fad.fa-praying-hands:after{content:"\f684\f684"}.fa-duotone.fa-face-pensive:after,.fad.fa-face-pensive:after{content:"\e384\e384"}.fa-duotone.fa-user-music:after,.fad.fa-user-music:after{content:"\f8eb\f8eb"}.fa-duotone.fa-arrow-right-rotate:after,.fa-duotone.fa-arrow-rotate-forward:after,.fa-duotone.fa-arrow-rotate-right:after,.fa-duotone.fa-redo:after,.fad.fa-arrow-right-rotate:after,.fad.fa-arrow-rotate-forward:after,.fad.fa-arrow-rotate-right:after,.fad.fa-redo:after{content:"\f01e\f01e"}.fa-duotone.fa-comments-alt-dollar:after,.fa-duotone.fa-messages-dollar:after,.fad.fa-comments-alt-dollar:after,.fad.fa-messages-dollar:after{content:"\f652\f652"}.fa-duotone.fa-sensor-on:after,.fad.fa-sensor-on:after{content:"\e02b\e02b"}.fa-duotone.fa-balloon:after,.fad.fa-balloon:after{content:"\e2e3\e2e3"}.fa-duotone.fa-biohazard:after,.fad.fa-biohazard:after{content:"\f780\f780"}.fa-duotone.fa-chess-queen-alt:after,.fa-duotone.fa-chess-queen-piece:after,.fad.fa-chess-queen-alt:after,.fad.fa-chess-queen-piece:after{content:"\f446\f446"}.fa-duotone.fa-location-crosshairs:after,.fa-duotone.fa-location:after,.fad.fa-location-crosshairs:after,.fad.fa-location:after{content:"\f601\f601"}.fa-duotone.fa-mars-double:after,.fad.fa-mars-double:after{content:"\f227\f227"}.fa-duotone.fa-house-leave:after,.fa-duotone.fa-house-person-depart:after,.fa-duotone.fa-house-person-leave:after,.fad.fa-house-leave:after,.fad.fa-house-person-depart:after,.fad.fa-house-person-leave:after{content:"\e00f\e00f"}.fa-duotone.fa-ruler-triangle:after,.fad.fa-ruler-triangle:after{content:"\f61c\f61c"}.fa-duotone.fa-card-club:after,.fad.fa-card-club:after{content:"\e3e9\e3e9"}.fa-duotone.fa-child-dress:after,.fad.fa-child-dress:after{content:"\e59c\e59c"}.fa-duotone.fa-users-between-lines:after,.fad.fa-users-between-lines:after{content:"\e591\e591"}.fa-duotone.fa-lungs-virus:after,.fad.fa-lungs-virus:after{content:"\e067\e067"}.fa-duotone.fa-spinner-third:after,.fad.fa-spinner-third:after{content:"\f3f4\f3f4"}.fa-duotone.fa-face-grin-tears:after,.fa-duotone.fa-grin-tears:after,.fad.fa-face-grin-tears:after,.fad.fa-grin-tears:after{content:"\f588\f588"}.fa-duotone.fa-phone:after,.fad.fa-phone:after{content:"\f095\f095"}.fa-duotone.fa-computer-mouse-scrollwheel:after,.fa-duotone.fa-mouse-alt:after,.fad.fa-computer-mouse-scrollwheel:after,.fad.fa-mouse-alt:after{content:"\f8cd\f8cd"}.fa-duotone.fa-calendar-times:after,.fa-duotone.fa-calendar-xmark:after,.fad.fa-calendar-times:after,.fad.fa-calendar-xmark:after{content:"\f273\f273"}.fa-duotone.fa-child-reaching:after,.fad.fa-child-reaching:after{content:"\e59d\e59d"}.fa-duotone.fa-table-layout:after,.fad.fa-table-layout:after{content:"\e290\e290"}.fa-duotone.fa-narwhal:after,.fad.fa-narwhal:after{content:"\f6fe\f6fe"}.fa-duotone.fa-ramp-loading:after,.fad.fa-ramp-loading:after{content:"\f4d4\f4d4"}.fa-duotone.fa-calendar-circle-plus:after,.fad.fa-calendar-circle-plus:after{content:"\e470\e470"}.fa-duotone.fa-toothbrush:after,.fad.fa-toothbrush:after{content:"\f635\f635"}.fa-duotone.fa-border-inner:after,.fad.fa-border-inner:after{content:"\f84e\f84e"}.fa-duotone.fa-paw-claws:after,.fad.fa-paw-claws:after{content:"\f702\f702"}.fa-duotone.fa-kiwi-fruit:after,.fad.fa-kiwi-fruit:after{content:"\e30c\e30c"}.fa-duotone.fa-traffic-light-slow:after,.fad.fa-traffic-light-slow:after{content:"\f639\f639"}.fa-duotone.fa-rectangle-code:after,.fad.fa-rectangle-code:after{content:"\e322\e322"}.fa-duotone.fa-head-side-virus:after,.fad.fa-head-side-virus:after{content:"\e064\e064"}.fa-duotone.fa-keyboard-brightness:after,.fad.fa-keyboard-brightness:after{content:"\e1c0\e1c0"}.fa-duotone.fa-books-medical:after,.fad.fa-books-medical:after{content:"\f7e8\f7e8"}.fa-duotone.fa-lightbulb-slash:after,.fad.fa-lightbulb-slash:after{content:"\f673\f673"}.fa-duotone.fa-home-blank:after,.fa-duotone.fa-house-blank:after,.fad.fa-home-blank:after,.fad.fa-house-blank:after{content:"\e487\e487"}.fa-duotone.fa-square-5:after,.fad.fa-square-5:after{content:"\e25a\e25a"}.fa-duotone.fa-heart-square:after,.fa-duotone.fa-square-heart:after,.fad.fa-heart-square:after,.fad.fa-square-heart:after{content:"\f4c8\f4c8"}.fa-duotone.fa-puzzle:after,.fad.fa-puzzle:after{content:"\e443\e443"}.fa-duotone.fa-user-cog:after,.fa-duotone.fa-user-gear:after,.fad.fa-user-cog:after,.fad.fa-user-gear:after{content:"\f4fe\f4fe"}.fa-duotone.fa-pipe-circle-check:after,.fad.fa-pipe-circle-check:after{content:"\e436\e436"}.fa-duotone.fa-arrow-up-1-9:after,.fa-duotone.fa-sort-numeric-up:after,.fad.fa-arrow-up-1-9:after,.fad.fa-sort-numeric-up:after{content:"\f163\f163"}.fa-duotone.fa-octagon-exclamation:after,.fad.fa-octagon-exclamation:after{content:"\e204\e204"}.fa-duotone.fa-dial-low:after,.fad.fa-dial-low:after{content:"\e15d\e15d"}.fa-duotone.fa-door-closed:after,.fad.fa-door-closed:after{content:"\f52a\f52a"}.fa-duotone.fa-laptop-mobile:after,.fa-duotone.fa-phone-laptop:after,.fad.fa-laptop-mobile:after,.fad.fa-phone-laptop:after{content:"\f87a\f87a"}.fa-duotone.fa-conveyor-belt-alt:after,.fa-duotone.fa-conveyor-belt-boxes:after,.fad.fa-conveyor-belt-alt:after,.fad.fa-conveyor-belt-boxes:after{content:"\f46f\f46f"}.fa-duotone.fa-shield-virus:after,.fad.fa-shield-virus:after{content:"\e06c\e06c"}.fa-duotone.fa-starfighter-alt-advanced:after,.fa-duotone.fa-starfighter-twin-ion-engine-advanced:after,.fad.fa-starfighter-alt-advanced:after,.fad.fa-starfighter-twin-ion-engine-advanced:after{content:"\e28e\e28e"}.fa-duotone.fa-dice-six:after,.fad.fa-dice-six:after{content:"\f526\f526"}.fa-duotone.fa-starfighter-alt:after,.fa-duotone.fa-starfighter-twin-ion-engine:after,.fad.fa-starfighter-alt:after,.fad.fa-starfighter-twin-ion-engine:after{content:"\e038\e038"}.fa-duotone.fa-rocket-launch:after,.fad.fa-rocket-launch:after{content:"\e027\e027"}.fa-duotone.fa-mosquito-net:after,.fad.fa-mosquito-net:after{content:"\e52c\e52c"}.fa-duotone.fa-vent-damper:after,.fad.fa-vent-damper:after{content:"\e465\e465"}.fa-duotone.fa-bridge-water:after,.fad.fa-bridge-water:after{content:"\e4ce\e4ce"}.fa-duotone.fa-ban-bug:after,.fa-duotone.fa-debug:after,.fad.fa-ban-bug:after,.fad.fa-debug:after{content:"\f7f9\f7f9"}.fa-duotone.fa-person-booth:after,.fad.fa-person-booth:after{content:"\f756\f756"}.fa-duotone.fa-text-width:after,.fad.fa-text-width:after{content:"\f035\f035"}.fa-duotone.fa-garage-car:after,.fad.fa-garage-car:after{content:"\e00a\e00a"}.fa-duotone.fa-square-kanban:after,.fad.fa-square-kanban:after{content:"\e488\e488"}.fa-duotone.fa-hat-wizard:after,.fad.fa-hat-wizard:after{content:"\f6e8\f6e8"}.fa-duotone.fa-pen-fancy:after,.fad.fa-pen-fancy:after{content:"\f5ac\f5ac"}.fa-duotone.fa-coffee-pot:after,.fad.fa-coffee-pot:after{content:"\e002\e002"}.fa-duotone.fa-mouse-field:after,.fad.fa-mouse-field:after{content:"\e5a8\e5a8"}.fa-duotone.fa-digging:after,.fa-duotone.fa-person-digging:after,.fad.fa-digging:after,.fad.fa-person-digging:after{content:"\f85e\f85e"}.fa-duotone.fa-shower-alt:after,.fa-duotone.fa-shower-down:after,.fad.fa-shower-alt:after,.fad.fa-shower-down:after{content:"\e24d\e24d"}.fa-duotone.fa-box-circle-check:after,.fad.fa-box-circle-check:after{content:"\e0c4\e0c4"}.fa-duotone.fa-brightness:after,.fad.fa-brightness:after{content:"\e0c9\e0c9"}.fa-duotone.fa-car-side-bolt:after,.fad.fa-car-side-bolt:after{content:"\e344\e344"}.fa-duotone.fa-ornament:after,.fad.fa-ornament:after{content:"\f7b8\f7b8"}.fa-duotone.fa-phone-arrow-down-left:after,.fa-duotone.fa-phone-arrow-down:after,.fa-duotone.fa-phone-incoming:after,.fad.fa-phone-arrow-down-left:after,.fad.fa-phone-arrow-down:after,.fad.fa-phone-incoming:after{content:"\e223\e223"}.fa-duotone.fa-cloud-word:after,.fad.fa-cloud-word:after{content:"\e138\e138"}.fa-duotone.fa-hand-fingers-crossed:after,.fad.fa-hand-fingers-crossed:after{content:"\e1a3\e1a3"}.fa-duotone.fa-trash:after,.fad.fa-trash:after{content:"\f1f8\f1f8"}.fa-duotone.fa-gauge-simple-med:after,.fa-duotone.fa-gauge-simple:after,.fa-duotone.fa-tachometer-average:after,.fad.fa-gauge-simple-med:after,.fad.fa-gauge-simple:after,.fad.fa-tachometer-average:after{content:"\f629\f629"}.fa-duotone.fa-arrow-down-small-big:after,.fa-duotone.fa-sort-size-down-alt:after,.fad.fa-arrow-down-small-big:after,.fad.fa-sort-size-down-alt:after{content:"\f88d\f88d"}.fa-duotone.fa-book-medical:after,.fad.fa-book-medical:after{content:"\f7e6\f7e6"}.fa-duotone.fa-face-melting:after,.fad.fa-face-melting:after{content:"\e483\e483"}.fa-duotone.fa-poo:after,.fad.fa-poo:after{content:"\f2fe\f2fe"}.fa-duotone.fa-pen-alt-slash:after,.fa-duotone.fa-pen-clip-slash:after,.fad.fa-pen-alt-slash:after,.fad.fa-pen-clip-slash:after{content:"\e20f\e20f"}.fa-duotone.fa-quote-right-alt:after,.fa-duotone.fa-quote-right:after,.fad.fa-quote-right-alt:after,.fad.fa-quote-right:after{content:"\f10e\f10e"}.fa-duotone.fa-scroll-old:after,.fad.fa-scroll-old:after{content:"\f70f\f70f"}.fa-duotone.fa-guitars:after,.fad.fa-guitars:after{content:"\f8bf\f8bf"}.fa-duotone.fa-phone-xmark:after,.fad.fa-phone-xmark:after{content:"\e227\e227"}.fa-duotone.fa-hose:after,.fad.fa-hose:after{content:"\e419\e419"}.fa-duotone.fa-clock-six:after,.fad.fa-clock-six:after{content:"\e352\e352"}.fa-duotone.fa-shirt:after,.fa-duotone.fa-t-shirt:after,.fa-duotone.fa-tshirt:after,.fad.fa-shirt:after,.fad.fa-t-shirt:after,.fad.fa-tshirt:after{content:"\f553\f553"}.fa-duotone.fa-billboard:after,.fad.fa-billboard:after{content:"\e5cd\e5cd"}.fa-duotone.fa-square-r:after,.fad.fa-square-r:after{content:"\e27c\e27c"}.fa-duotone.fa-cubes:after,.fad.fa-cubes:after{content:"\f1b3\f1b3"}.fa-duotone.fa-envelope-open-dollar:after,.fad.fa-envelope-open-dollar:after{content:"\f657\f657"}.fa-duotone.fa-divide:after,.fad.fa-divide:after{content:"\f529\f529"}.fa-duotone.fa-sun-cloud:after,.fad.fa-sun-cloud:after{content:"\f763\f763"}.fa-duotone.fa-lamp-floor:after,.fad.fa-lamp-floor:after{content:"\e015\e015"}.fa-duotone.fa-square-7:after,.fad.fa-square-7:after{content:"\e25c\e25c"}.fa-duotone.fa-tenge-sign:after,.fa-duotone.fa-tenge:after,.fad.fa-tenge-sign:after,.fad.fa-tenge:after{content:"\f7d7\f7d7"}.fa-duotone.fa-headphones:after,.fad.fa-headphones:after{content:"\f025\f025"}.fa-duotone.fa-hands-holding:after,.fad.fa-hands-holding:after{content:"\f4c2\f4c2"}.fa-duotone.fa-campfire:after,.fad.fa-campfire:after{content:"\f6ba\f6ba"}.fa-duotone.fa-circle-ampersand:after,.fad.fa-circle-ampersand:after{content:"\e0f8\e0f8"}.fa-duotone.fa-snowflakes:after,.fad.fa-snowflakes:after{content:"\f7cf\f7cf"}.fa-duotone.fa-hands-clapping:after,.fad.fa-hands-clapping:after{content:"\e1a8\e1a8"}.fa-duotone.fa-republican:after,.fad.fa-republican:after{content:"\f75e\f75e"}.fa-duotone.fa-leaf-maple:after,.fad.fa-leaf-maple:after{content:"\f6f6\f6f6"}.fa-duotone.fa-arrow-left:after,.fad.fa-arrow-left:after{content:"\f060\f060"}.fa-duotone.fa-person-circle-xmark:after,.fad.fa-person-circle-xmark:after{content:"\e543\e543"}.fa-duotone.fa-ruler:after,.fad.fa-ruler:after{content:"\f545\f545"}.fa-duotone.fa-cup-straw-swoosh:after,.fad.fa-cup-straw-swoosh:after{content:"\e364\e364"}.fa-duotone.fa-temperature-hot:after,.fa-duotone.fa-temperature-sun:after,.fad.fa-temperature-hot:after,.fad.fa-temperature-sun:after{content:"\f76a\f76a"}.fa-duotone.fa-align-left:after,.fad.fa-align-left:after{content:"\f036\f036"}.fa-duotone.fa-dice-d6:after,.fad.fa-dice-d6:after{content:"\f6d1\f6d1"}.fa-duotone.fa-restroom:after,.fad.fa-restroom:after{content:"\f7bd\f7bd"}.fa-duotone.fa-high-definition:after,.fa-duotone.fa-rectangle-hd:after,.fad.fa-high-definition:after,.fad.fa-rectangle-hd:after{content:"\e1ae\e1ae"}.fa-duotone.fa-j:after,.fad.fa-j:after{content:"\4a\4a"}.fa-duotone.fa-galaxy:after,.fad.fa-galaxy:after{content:"\e008\e008"}.fa-duotone.fa-users-viewfinder:after,.fad.fa-users-viewfinder:after{content:"\e595\e595"}.fa-duotone.fa-file-video:after,.fad.fa-file-video:after{content:"\f1c8\f1c8"}.fa-duotone.fa-cherries:after,.fad.fa-cherries:after{content:"\e0ec\e0ec"}.fa-duotone.fa-external-link-alt:after,.fa-duotone.fa-up-right-from-square:after,.fad.fa-external-link-alt:after,.fad.fa-up-right-from-square:after{content:"\f35d\f35d"}.fa-duotone.fa-circle-sort:after,.fa-duotone.fa-sort-circle:after,.fad.fa-circle-sort:after,.fad.fa-sort-circle:after{content:"\e030\e030"}.fa-duotone.fa-table-cells:after,.fa-duotone.fa-th:after,.fad.fa-table-cells:after,.fad.fa-th:after{content:"\f00a\f00a"}.fa-duotone.fa-file-pdf:after,.fad.fa-file-pdf:after{content:"\f1c1\f1c1"}.fa-duotone.fa-siren:after,.fad.fa-siren:after{content:"\e02d\e02d"}.fa-duotone.fa-arrow-up-to-dotted-line:after,.fad.fa-arrow-up-to-dotted-line:after{content:"\e0a1\e0a1"}.fa-duotone.fa-image-landscape:after,.fa-duotone.fa-landscape:after,.fad.fa-image-landscape:after,.fad.fa-landscape:after{content:"\e1b5\e1b5"}.fa-duotone.fa-tank-water:after,.fad.fa-tank-water:after{content:"\e452\e452"}.fa-duotone.fa-curling-stone:after,.fa-duotone.fa-curling:after,.fad.fa-curling-stone:after,.fad.fa-curling:after{content:"\f44a\f44a"}.fa-duotone.fa-gamepad-alt:after,.fa-duotone.fa-gamepad-modern:after,.fad.fa-gamepad-alt:after,.fad.fa-gamepad-modern:after{content:"\e5a2\e5a2"}.fa-duotone.fa-messages-question:after,.fad.fa-messages-question:after{content:"\e1e7\e1e7"}.fa-duotone.fa-bible:after,.fa-duotone.fa-book-bible:after,.fad.fa-bible:after,.fad.fa-book-bible:after{content:"\f647\f647"}.fa-duotone.fa-o:after,.fad.fa-o:after{content:"\4f\4f"}.fa-duotone.fa-medkit:after,.fa-duotone.fa-suitcase-medical:after,.fad.fa-medkit:after,.fad.fa-suitcase-medical:after{content:"\f0fa\f0fa"}.fa-duotone.fa-briefcase-arrow-right:after,.fad.fa-briefcase-arrow-right:after{content:"\e2f2\e2f2"}.fa-duotone.fa-expand-wide:after,.fad.fa-expand-wide:after{content:"\f320\f320"}.fa-duotone.fa-clock-eleven-thirty:after,.fad.fa-clock-eleven-thirty:after{content:"\e348\e348"}.fa-duotone.fa-rv:after,.fad.fa-rv:after{content:"\f7be\f7be"}.fa-duotone.fa-user-secret:after,.fad.fa-user-secret:after{content:"\f21b\f21b"}.fa-duotone.fa-otter:after,.fad.fa-otter:after{content:"\f700\f700"}.fa-duotone.fa-dreidel:after,.fad.fa-dreidel:after{content:"\f792\f792"}.fa-duotone.fa-female:after,.fa-duotone.fa-person-dress:after,.fad.fa-female:after,.fad.fa-person-dress:after{content:"\f182\f182"}.fa-duotone.fa-comment-dollar:after,.fad.fa-comment-dollar:after{content:"\f651\f651"}.fa-duotone.fa-briefcase-clock:after,.fa-duotone.fa-business-time:after,.fad.fa-briefcase-clock:after,.fad.fa-business-time:after{content:"\f64a\f64a"}.fa-duotone.fa-flower-tulip:after,.fad.fa-flower-tulip:after{content:"\f801\f801"}.fa-duotone.fa-people-pants-simple:after,.fad.fa-people-pants-simple:after{content:"\e21a\e21a"}.fa-duotone.fa-cloud-drizzle:after,.fad.fa-cloud-drizzle:after{content:"\f738\f738"}.fa-duotone.fa-table-cells-large:after,.fa-duotone.fa-th-large:after,.fad.fa-table-cells-large:after,.fad.fa-th-large:after{content:"\f009\f009"}.fa-duotone.fa-book-tanakh:after,.fa-duotone.fa-tanakh:after,.fad.fa-book-tanakh:after,.fad.fa-tanakh:after{content:"\f827\f827"}.fa-duotone.fa-solar-system:after,.fad.fa-solar-system:after{content:"\e02f\e02f"}.fa-duotone.fa-seal-question:after,.fad.fa-seal-question:after{content:"\e243\e243"}.fa-duotone.fa-phone-volume:after,.fa-duotone.fa-volume-control-phone:after,.fad.fa-phone-volume:after,.fad.fa-volume-control-phone:after{content:"\f2a0\f2a0"}.fa-duotone.fa-disc-drive:after,.fad.fa-disc-drive:after{content:"\f8b5\f8b5"}.fa-duotone.fa-hat-cowboy-side:after,.fad.fa-hat-cowboy-side:after{content:"\f8c1\f8c1"}.fa-duotone.fa-rows:after,.fa-duotone.fa-table-rows:after,.fad.fa-rows:after,.fad.fa-table-rows:after{content:"\e292\e292"}.fa-duotone.fa-location-exclamation:after,.fa-duotone.fa-map-marker-exclamation:after,.fad.fa-location-exclamation:after,.fad.fa-map-marker-exclamation:after{content:"\f608\f608"}.fa-duotone.fa-face-fearful:after,.fad.fa-face-fearful:after{content:"\e375\e375"}.fa-duotone.fa-clipboard-user:after,.fad.fa-clipboard-user:after{content:"\f7f3\f7f3"}.fa-duotone.fa-bus-school:after,.fad.fa-bus-school:after{content:"\f5dd\f5dd"}.fa-duotone.fa-film-slash:after,.fad.fa-film-slash:after{content:"\e179\e179"}.fa-duotone.fa-square-arrow-down-right:after,.fad.fa-square-arrow-down-right:after{content:"\e262\e262"}.fa-duotone.fa-book-sparkles:after,.fa-duotone.fa-book-spells:after,.fad.fa-book-sparkles:after,.fad.fa-book-spells:after{content:"\f6b8\f6b8"}.fa-duotone.fa-washer:after,.fa-duotone.fa-washing-machine:after,.fad.fa-washer:after,.fad.fa-washing-machine:after{content:"\f898\f898"}.fa-duotone.fa-child:after,.fad.fa-child:after{content:"\f1ae\f1ae"}.fa-duotone.fa-lira-sign:after,.fad.fa-lira-sign:after{content:"\f195\f195"}.fa-duotone.fa-user-visor:after,.fad.fa-user-visor:after{content:"\e04c\e04c"}.fa-duotone.fa-file-plus-minus:after,.fad.fa-file-plus-minus:after{content:"\e177\e177"}.fa-duotone.fa-chess-clock-alt:after,.fa-duotone.fa-chess-clock-flip:after,.fad.fa-chess-clock-alt:after,.fad.fa-chess-clock-flip:after{content:"\f43e\f43e"}.fa-duotone.fa-satellite:after,.fad.fa-satellite:after{content:"\f7bf\f7bf"}.fa-duotone.fa-plane-lock:after,.fad.fa-plane-lock:after{content:"\e558\e558"}.fa-duotone.fa-steering-wheel:after,.fad.fa-steering-wheel:after{content:"\f622\f622"}.fa-duotone.fa-tag:after,.fad.fa-tag:after{content:"\f02b\f02b"}.fa-duotone.fa-stretcher:after,.fad.fa-stretcher:after{content:"\f825\f825"}.fa-duotone.fa-book-law:after,.fa-duotone.fa-book-section:after,.fad.fa-book-law:after,.fad.fa-book-section:after{content:"\e0c1\e0c1"}.fa-duotone.fa-inboxes:after,.fad.fa-inboxes:after{content:"\e1bb\e1bb"}.fa-duotone.fa-coffee-bean:after,.fad.fa-coffee-bean:after{content:"\e13e\e13e"}.fa-duotone.fa-circle-yen:after,.fad.fa-circle-yen:after{content:"\e5d0\e5d0"}.fa-duotone.fa-brackets-curly:after,.fad.fa-brackets-curly:after{content:"\f7ea\f7ea"}.fa-duotone.fa-ellipsis-stroke-vertical:after,.fa-duotone.fa-ellipsis-v-alt:after,.fad.fa-ellipsis-stroke-vertical:after,.fad.fa-ellipsis-v-alt:after{content:"\f39c\f39c"}.fa-duotone.fa-comment:after,.fad.fa-comment:after{content:"\f075\f075"}.fa-duotone.fa-square-1:after,.fad.fa-square-1:after{content:"\e256\e256"}.fa-duotone.fa-birthday-cake:after,.fa-duotone.fa-cake-candles:after,.fa-duotone.fa-cake:after,.fad.fa-birthday-cake:after,.fad.fa-cake-candles:after,.fad.fa-cake:after{content:"\f1fd\f1fd"}.fa-duotone.fa-head-side:after,.fad.fa-head-side:after{content:"\f6e9\f6e9"}.fa-duotone.fa-envelope:after,.fad.fa-envelope:after{content:"\f0e0\f0e0"}.fa-duotone.fa-dolly-empty:after,.fad.fa-dolly-empty:after{content:"\f473\f473"}.fa-duotone.fa-face-tissue:after,.fad.fa-face-tissue:after{content:"\e39c\e39c"}.fa-duotone.fa-angle-double-up:after,.fa-duotone.fa-angles-up:after,.fad.fa-angle-double-up:after,.fad.fa-angles-up:after{content:"\f102\f102"}.fa-duotone.fa-bin-recycle:after,.fad.fa-bin-recycle:after{content:"\e5f7\e5f7"}.fa-duotone.fa-paperclip:after,.fad.fa-paperclip:after{content:"\f0c6\f0c6"}.fa-duotone.fa-chart-line-down:after,.fad.fa-chart-line-down:after{content:"\f64d\f64d"}.fa-duotone.fa-arrow-right-to-city:after,.fad.fa-arrow-right-to-city:after{content:"\e4b3\e4b3"}.fa-duotone.fa-lock-a:after,.fad.fa-lock-a:after{content:"\e422\e422"}.fa-duotone.fa-ribbon:after,.fad.fa-ribbon:after{content:"\f4d6\f4d6"}.fa-duotone.fa-lungs:after,.fad.fa-lungs:after{content:"\f604\f604"}.fa-duotone.fa-person-pinball:after,.fad.fa-person-pinball:after{content:"\e21d\e21d"}.fa-duotone.fa-arrow-up-9-1:after,.fa-duotone.fa-sort-numeric-up-alt:after,.fad.fa-arrow-up-9-1:after,.fad.fa-sort-numeric-up-alt:after{content:"\f887\f887"}.fa-duotone.fa-apple-core:after,.fad.fa-apple-core:after{content:"\e08f\e08f"}.fa-duotone.fa-circle-y:after,.fad.fa-circle-y:after{content:"\e12f\e12f"}.fa-duotone.fa-h6:after,.fad.fa-h6:after{content:"\e413\e413"}.fa-duotone.fa-litecoin-sign:after,.fad.fa-litecoin-sign:after{content:"\e1d3\e1d3"}.fa-duotone.fa-circle-small:after,.fad.fa-circle-small:after{content:"\e122\e122"}.fa-duotone.fa-border-none:after,.fad.fa-border-none:after{content:"\f850\f850"}.fa-duotone.fa-arrow-turn-down-left:after,.fad.fa-arrow-turn-down-left:after{content:"\e2e1\e2e1"}.fa-duotone.fa-circle-nodes:after,.fad.fa-circle-nodes:after{content:"\e4e2\e4e2"}.fa-duotone.fa-parachute-box:after,.fad.fa-parachute-box:after{content:"\f4cd\f4cd"}.fa-duotone.fa-comment-alt-medical:after,.fa-duotone.fa-message-medical:after,.fad.fa-comment-alt-medical:after,.fad.fa-message-medical:after{content:"\f7f4\f7f4"}.fa-duotone.fa-rugby-ball:after,.fad.fa-rugby-ball:after{content:"\e3c6\e3c6"}.fa-duotone.fa-comment-music:after,.fad.fa-comment-music:after{content:"\f8b0\f8b0"}.fa-duotone.fa-indent:after,.fad.fa-indent:after{content:"\f03c\f03c"}.fa-duotone.fa-tree-alt:after,.fa-duotone.fa-tree-deciduous:after,.fad.fa-tree-alt:after,.fad.fa-tree-deciduous:after{content:"\f400\f400"}.fa-duotone.fa-puzzle-piece-alt:after,.fa-duotone.fa-puzzle-piece-simple:after,.fad.fa-puzzle-piece-alt:after,.fad.fa-puzzle-piece-simple:after{content:"\e231\e231"}.fa-duotone.fa-truck-field-un:after,.fad.fa-truck-field-un:after{content:"\e58e\e58e"}.fa-duotone.fa-nfc-trash:after,.fad.fa-nfc-trash:after{content:"\e1fd\e1fd"}.fa-duotone.fa-hourglass-empty:after,.fa-duotone.fa-hourglass:after,.fad.fa-hourglass-empty:after,.fad.fa-hourglass:after{content:"\f254\f254"}.fa-duotone.fa-mountain:after,.fad.fa-mountain:after{content:"\f6fc\f6fc"}.fa-duotone.fa-file-times:after,.fa-duotone.fa-file-xmark:after,.fad.fa-file-times:after,.fad.fa-file-xmark:after{content:"\f317\f317"}.fa-duotone.fa-home-heart:after,.fa-duotone.fa-house-heart:after,.fad.fa-home-heart:after,.fad.fa-house-heart:after{content:"\f4c9\f4c9"}.fa-duotone.fa-house-chimney-blank:after,.fad.fa-house-chimney-blank:after{content:"\e3b0\e3b0"}.fa-duotone.fa-meter-bolt:after,.fad.fa-meter-bolt:after{content:"\e1e9\e1e9"}.fa-duotone.fa-user-doctor:after,.fa-duotone.fa-user-md:after,.fad.fa-user-doctor:after,.fad.fa-user-md:after{content:"\f0f0\f0f0"}.fa-duotone.fa-slash-back:after,.fad.fa-slash-back:after{content:"\5c\5c"}.fa-duotone.fa-circle-info:after,.fa-duotone.fa-info-circle:after,.fad.fa-circle-info:after,.fad.fa-info-circle:after{content:"\f05a\f05a"}.fa-duotone.fa-fishing-rod:after,.fad.fa-fishing-rod:after{content:"\e3a8\e3a8"}.fa-duotone.fa-hammer-crash:after,.fad.fa-hammer-crash:after{content:"\e414\e414"}.fa-duotone.fa-message-heart:after,.fad.fa-message-heart:after{content:"\e5c9\e5c9"}.fa-duotone.fa-cloud-meatball:after,.fad.fa-cloud-meatball:after{content:"\f73b\f73b"}.fa-duotone.fa-camera-polaroid:after,.fad.fa-camera-polaroid:after{content:"\f8aa\f8aa"}.fa-duotone.fa-camera-alt:after,.fa-duotone.fa-camera:after,.fad.fa-camera-alt:after,.fad.fa-camera:after{content:"\f030\f030"}.fa-duotone.fa-square-virus:after,.fad.fa-square-virus:after{content:"\e578\e578"}.fa-duotone.fa-cart-arrow-up:after,.fad.fa-cart-arrow-up:after{content:"\e3ee\e3ee"}.fa-duotone.fa-meteor:after,.fad.fa-meteor:after{content:"\f753\f753"}.fa-duotone.fa-car-on:after,.fad.fa-car-on:after{content:"\e4dd\e4dd"}.fa-duotone.fa-sleigh:after,.fad.fa-sleigh:after{content:"\f7cc\f7cc"}.fa-duotone.fa-arrow-down-1-9:after,.fa-duotone.fa-sort-numeric-asc:after,.fa-duotone.fa-sort-numeric-down:after,.fad.fa-arrow-down-1-9:after,.fad.fa-sort-numeric-asc:after,.fad.fa-sort-numeric-down:after{content:"\f162\f162"}.fa-duotone.fa-buoy-mooring:after,.fad.fa-buoy-mooring:after{content:"\e5b6\e5b6"}.fa-duotone.fa-square-4:after,.fad.fa-square-4:after{content:"\e259\e259"}.fa-duotone.fa-hand-holding-droplet:after,.fa-duotone.fa-hand-holding-water:after,.fad.fa-hand-holding-droplet:after,.fad.fa-hand-holding-water:after{content:"\f4c1\f4c1"}.fa-duotone.fa-tricycle-adult:after,.fad.fa-tricycle-adult:after{content:"\e5c4\e5c4"}.fa-duotone.fa-waveform:after,.fad.fa-waveform:after{content:"\f8f1\f8f1"}.fa-duotone.fa-water:after,.fad.fa-water:after{content:"\f773\f773"}.fa-duotone.fa-star-sharp-half-alt:after,.fa-duotone.fa-star-sharp-half-stroke:after,.fad.fa-star-sharp-half-alt:after,.fad.fa-star-sharp-half-stroke:after{content:"\e28d\e28d"}.fa-duotone.fa-nfc-signal:after,.fad.fa-nfc-signal:after{content:"\e1fb\e1fb"}.fa-duotone.fa-plane-prop:after,.fad.fa-plane-prop:after{content:"\e22b\e22b"}.fa-duotone.fa-calendar-check:after,.fad.fa-calendar-check:after{content:"\f274\f274"}.fa-duotone.fa-clock-desk:after,.fad.fa-clock-desk:after{content:"\e134\e134"}.fa-duotone.fa-calendar-clock:after,.fa-duotone.fa-calendar-time:after,.fad.fa-calendar-clock:after,.fad.fa-calendar-time:after{content:"\e0d2\e0d2"}.fa-duotone.fa-braille:after,.fad.fa-braille:after{content:"\f2a1\f2a1"}.fa-duotone.fa-prescription-bottle-alt:after,.fa-duotone.fa-prescription-bottle-medical:after,.fad.fa-prescription-bottle-alt:after,.fad.fa-prescription-bottle-medical:after{content:"\f486\f486"}.fa-duotone.fa-plate-utensils:after,.fad.fa-plate-utensils:after{content:"\e43b\e43b"}.fa-duotone.fa-family-pants:after,.fad.fa-family-pants:after{content:"\e302\e302"}.fa-duotone.fa-hose-reel:after,.fad.fa-hose-reel:after{content:"\e41a\e41a"}.fa-duotone.fa-house-window:after,.fad.fa-house-window:after{content:"\e3b3\e3b3"}.fa-duotone.fa-landmark:after,.fad.fa-landmark:after{content:"\f66f\f66f"}.fa-duotone.fa-truck:after,.fad.fa-truck:after{content:"\f0d1\f0d1"}.fa-duotone.fa-crosshairs:after,.fad.fa-crosshairs:after{content:"\f05b\f05b"}.fa-duotone.fa-cloud-rainbow:after,.fad.fa-cloud-rainbow:after{content:"\f73e\f73e"}.fa-duotone.fa-person-cane:after,.fad.fa-person-cane:after{content:"\e53c\e53c"}.fa-duotone.fa-alien:after,.fad.fa-alien:after{content:"\f8f5\f8f5"}.fa-duotone.fa-tent:after,.fad.fa-tent:after{content:"\e57d\e57d"}.fa-duotone.fa-laptop-binary:after,.fad.fa-laptop-binary:after{content:"\e5e7\e5e7"}.fa-duotone.fa-vest-patches:after,.fad.fa-vest-patches:after{content:"\e086\e086"}.fa-duotone.fa-people-dress-simple:after,.fad.fa-people-dress-simple:after{content:"\e218\e218"}.fa-duotone.fa-check-double:after,.fad.fa-check-double:after{content:"\f560\f560"}.fa-duotone.fa-arrow-down-a-z:after,.fa-duotone.fa-sort-alpha-asc:after,.fa-duotone.fa-sort-alpha-down:after,.fad.fa-arrow-down-a-z:after,.fad.fa-sort-alpha-asc:after,.fad.fa-sort-alpha-down:after{content:"\f15d\f15d"}.fa-duotone.fa-bowling-ball-pin:after,.fad.fa-bowling-ball-pin:after{content:"\e0c3\e0c3"}.fa-duotone.fa-bell-school-slash:after,.fad.fa-bell-school-slash:after{content:"\f5d6\f5d6"}.fa-duotone.fa-plus-large:after,.fad.fa-plus-large:after{content:"\e59e\e59e"}.fa-duotone.fa-money-bill-wheat:after,.fad.fa-money-bill-wheat:after{content:"\e52a\e52a"}.fa-duotone.fa-camera-viewfinder:after,.fa-duotone.fa-screenshot:after,.fad.fa-camera-viewfinder:after,.fad.fa-screenshot:after{content:"\e0da\e0da"}.fa-duotone.fa-comment-alt-music:after,.fa-duotone.fa-message-music:after,.fad.fa-comment-alt-music:after,.fad.fa-message-music:after{content:"\f8af\f8af"}.fa-duotone.fa-car-building:after,.fad.fa-car-building:after{content:"\f859\f859"}.fa-duotone.fa-border-bottom-right:after,.fa-duotone.fa-border-style-alt:after,.fad.fa-border-bottom-right:after,.fad.fa-border-style-alt:after{content:"\f854\f854"}.fa-duotone.fa-octagon:after,.fad.fa-octagon:after{content:"\f306\f306"}.fa-duotone.fa-comment-arrow-up-right:after,.fad.fa-comment-arrow-up-right:after{content:"\e145\e145"}.fa-duotone.fa-octagon-divide:after,.fad.fa-octagon-divide:after{content:"\e203\e203"}.fa-duotone.fa-cookie:after,.fad.fa-cookie:after{content:"\f563\f563"}.fa-duotone.fa-arrow-left-rotate:after,.fa-duotone.fa-arrow-rotate-back:after,.fa-duotone.fa-arrow-rotate-backward:after,.fa-duotone.fa-arrow-rotate-left:after,.fa-duotone.fa-undo:after,.fad.fa-arrow-left-rotate:after,.fad.fa-arrow-rotate-back:after,.fad.fa-arrow-rotate-backward:after,.fad.fa-arrow-rotate-left:after,.fad.fa-undo:after{content:"\f0e2\f0e2"}.fa-duotone.fa-tv-music:after,.fad.fa-tv-music:after{content:"\f8e6\f8e6"}.fa-duotone.fa-hard-drive:after,.fa-duotone.fa-hdd:after,.fad.fa-hard-drive:after,.fad.fa-hdd:after{content:"\f0a0\f0a0"}.fa-duotone.fa-reel:after,.fad.fa-reel:after{content:"\e238\e238"}.fa-duotone.fa-face-grin-squint-tears:after,.fa-duotone.fa-grin-squint-tears:after,.fad.fa-face-grin-squint-tears:after,.fad.fa-grin-squint-tears:after{content:"\f586\f586"}.fa-duotone.fa-dumbbell:after,.fad.fa-dumbbell:after{content:"\f44b\f44b"}.fa-duotone.fa-list-alt:after,.fa-duotone.fa-rectangle-list:after,.fad.fa-list-alt:after,.fad.fa-rectangle-list:after{content:"\f022\f022"}.fa-duotone.fa-tarp-droplet:after,.fad.fa-tarp-droplet:after{content:"\e57c\e57c"}.fa-duotone.fa-alarm-exclamation:after,.fad.fa-alarm-exclamation:after{content:"\f843\f843"}.fa-duotone.fa-house-medical-circle-check:after,.fad.fa-house-medical-circle-check:after{content:"\e511\e511"}.fa-duotone.fa-traffic-cone:after,.fad.fa-traffic-cone:after{content:"\f636\f636"}.fa-duotone.fa-grate:after,.fad.fa-grate:after{content:"\e193\e193"}.fa-duotone.fa-arrow-down-right:after,.fad.fa-arrow-down-right:after{content:"\e093\e093"}.fa-duotone.fa-person-skiing-nordic:after,.fa-duotone.fa-skiing-nordic:after,.fad.fa-person-skiing-nordic:after,.fad.fa-skiing-nordic:after{content:"\f7ca\f7ca"}.fa-duotone.fa-calendar-plus:after,.fad.fa-calendar-plus:after{content:"\f271\f271"}.fa-duotone.fa-person-from-portal:after,.fa-duotone.fa-portal-exit:after,.fad.fa-person-from-portal:after,.fad.fa-portal-exit:after{content:"\e023\e023"}.fa-duotone.fa-plane-arrival:after,.fad.fa-plane-arrival:after{content:"\f5af\f5af"}.fa-duotone.fa-cowbell-circle-plus:after,.fa-duotone.fa-cowbell-more:after,.fad.fa-cowbell-circle-plus:after,.fad.fa-cowbell-more:after{content:"\f8b4\f8b4"}.fa-duotone.fa-arrow-alt-circle-left:after,.fa-duotone.fa-circle-left:after,.fad.fa-arrow-alt-circle-left:after,.fad.fa-circle-left:after{content:"\f359\f359"}.fa-duotone.fa-distribute-spacing-vertical:after,.fad.fa-distribute-spacing-vertical:after{content:"\e366\e366"}.fa-duotone.fa-signal-alt-2:after,.fa-duotone.fa-signal-bars-fair:after,.fad.fa-signal-alt-2:after,.fad.fa-signal-bars-fair:after{content:"\f692\f692"}.fa-duotone.fa-sportsball:after,.fad.fa-sportsball:after{content:"\e44b\e44b"}.fa-duotone.fa-game-console-handheld-crank:after,.fad.fa-game-console-handheld-crank:after{content:"\e5b9\e5b9"}.fa-duotone.fa-subway:after,.fa-duotone.fa-train-subway:after,.fad.fa-subway:after,.fad.fa-train-subway:after{content:"\f239\f239"}.fa-duotone.fa-chart-gantt:after,.fad.fa-chart-gantt:after{content:"\e0e4\e0e4"}.fa-duotone.fa-face-smile-upside-down:after,.fad.fa-face-smile-upside-down:after{content:"\e395\e395"}.fa-duotone.fa-ball-pile:after,.fad.fa-ball-pile:after{content:"\f77e\f77e"}.fa-duotone.fa-badge-dollar:after,.fad.fa-badge-dollar:after{content:"\f645\f645"}.fa-duotone.fa-money-bills-alt:after,.fa-duotone.fa-money-bills-simple:after,.fad.fa-money-bills-alt:after,.fad.fa-money-bills-simple:after{content:"\e1f4\e1f4"}.fa-duotone.fa-list-timeline:after,.fad.fa-list-timeline:after{content:"\e1d1\e1d1"}.fa-duotone.fa-indian-rupee-sign:after,.fa-duotone.fa-indian-rupee:after,.fa-duotone.fa-inr:after,.fad.fa-indian-rupee-sign:after,.fad.fa-indian-rupee:after,.fad.fa-inr:after{content:"\e1bc\e1bc"}.fa-duotone.fa-crop-alt:after,.fa-duotone.fa-crop-simple:after,.fad.fa-crop-alt:after,.fad.fa-crop-simple:after{content:"\f565\f565"}.fa-duotone.fa-money-bill-1:after,.fa-duotone.fa-money-bill-alt:after,.fad.fa-money-bill-1:after,.fad.fa-money-bill-alt:after{content:"\f3d1\f3d1"}.fa-duotone.fa-left-long:after,.fa-duotone.fa-long-arrow-alt-left:after,.fad.fa-left-long:after,.fad.fa-long-arrow-alt-left:after{content:"\f30a\f30a"}.fa-duotone.fa-keyboard-down:after,.fad.fa-keyboard-down:after{content:"\e1c2\e1c2"}.fa-duotone.fa-circle-up-right:after,.fad.fa-circle-up-right:after{content:"\e129\e129"}.fa-duotone.fa-cloud-bolt-moon:after,.fa-duotone.fa-thunderstorm-moon:after,.fad.fa-cloud-bolt-moon:after,.fad.fa-thunderstorm-moon:after{content:"\f76d\f76d"}.fa-duotone.fa-dna:after,.fad.fa-dna:after{content:"\f471\f471"}.fa-duotone.fa-virus-slash:after,.fad.fa-virus-slash:after{content:"\e075\e075"}.fa-duotone.fa-bracket-round-right:after,.fad.fa-bracket-round-right:after{content:"\29\29"}.fa-duotone.fa-circle-sterling:after,.fad.fa-circle-sterling:after{content:"\e5cf\e5cf"}.fa-duotone.fa-circle-5:after,.fad.fa-circle-5:after{content:"\e0f2\e0f2"}.fa-duotone.fa-minus:after,.fa-duotone.fa-subtract:after,.fad.fa-minus:after,.fad.fa-subtract:after{content:"\f068\f068"}.fa-duotone.fa-fire-flame:after,.fa-duotone.fa-flame:after,.fad.fa-fire-flame:after,.fad.fa-flame:after{content:"\f6df\f6df"}.fa-duotone.fa-arrow-alt-to-right:after,.fa-duotone.fa-right-to-line:after,.fad.fa-arrow-alt-to-right:after,.fad.fa-right-to-line:after{content:"\f34c\f34c"}.fa-duotone.fa-gif:after,.fad.fa-gif:after{content:"\e190\e190"}.fa-duotone.fa-chess:after,.fad.fa-chess:after{content:"\f439\f439"}.fa-duotone.fa-trash-slash:after,.fad.fa-trash-slash:after{content:"\e2b3\e2b3"}.fa-duotone.fa-arrow-left-long:after,.fa-duotone.fa-long-arrow-left:after,.fad.fa-arrow-left-long:after,.fad.fa-long-arrow-left:after{content:"\f177\f177"}.fa-duotone.fa-plug-circle-check:after,.fad.fa-plug-circle-check:after{content:"\e55c\e55c"}.fa-duotone.fa-font-case:after,.fad.fa-font-case:after{content:"\f866\f866"}.fa-duotone.fa-street-view:after,.fad.fa-street-view:after{content:"\f21d\f21d"}.fa-duotone.fa-arrow-down-left:after,.fad.fa-arrow-down-left:after{content:"\e091\e091"}.fa-duotone.fa-franc-sign:after,.fad.fa-franc-sign:after{content:"\e18f\e18f"}.fa-duotone.fa-flask-poison:after,.fa-duotone.fa-flask-round-poison:after,.fad.fa-flask-poison:after,.fad.fa-flask-round-poison:after{content:"\f6e0\f6e0"}.fa-duotone.fa-volume-off:after,.fad.fa-volume-off:after{content:"\f026\f026"}.fa-duotone.fa-book-circle-arrow-right:after,.fad.fa-book-circle-arrow-right:after{content:"\e0bc\e0bc"}.fa-duotone.fa-chart-user:after,.fa-duotone.fa-user-chart:after,.fad.fa-chart-user:after,.fad.fa-user-chart:after{content:"\f6a3\f6a3"}.fa-duotone.fa-american-sign-language-interpreting:after,.fa-duotone.fa-asl-interpreting:after,.fa-duotone.fa-hands-american-sign-language-interpreting:after,.fa-duotone.fa-hands-asl-interpreting:after,.fad.fa-american-sign-language-interpreting:after,.fad.fa-asl-interpreting:after,.fad.fa-hands-american-sign-language-interpreting:after,.fad.fa-hands-asl-interpreting:after{content:"\f2a3\f2a3"}.fa-duotone.fa-presentation-screen:after,.fa-duotone.fa-presentation:after,.fad.fa-presentation-screen:after,.fad.fa-presentation:after{content:"\f685\f685"}.fa-duotone.fa-circle-bolt:after,.fad.fa-circle-bolt:after{content:"\e0fe\e0fe"}.fa-duotone.fa-face-smile-halo:after,.fad.fa-face-smile-halo:after{content:"\e38f\e38f"}.fa-duotone.fa-cart-circle-arrow-down:after,.fad.fa-cart-circle-arrow-down:after{content:"\e3ef\e3ef"}.fa-duotone.fa-house-person-arrive:after,.fa-duotone.fa-house-person-return:after,.fa-duotone.fa-house-return:after,.fad.fa-house-person-arrive:after,.fad.fa-house-person-return:after,.fad.fa-house-return:after{content:"\e011\e011"}.fa-duotone.fa-comment-alt-times:after,.fa-duotone.fa-message-times:after,.fa-duotone.fa-message-xmark:after,.fad.fa-comment-alt-times:after,.fad.fa-message-times:after,.fad.fa-message-xmark:after{content:"\f4ab\f4ab"}.fa-duotone.fa-file-award:after,.fa-duotone.fa-file-certificate:after,.fad.fa-file-award:after,.fad.fa-file-certificate:after{content:"\f5f3\f5f3"}.fa-duotone.fa-user-doctor-hair-long:after,.fad.fa-user-doctor-hair-long:after{content:"\e459\e459"}.fa-duotone.fa-camera-home:after,.fa-duotone.fa-camera-security:after,.fad.fa-camera-home:after,.fad.fa-camera-security:after{content:"\f8fe\f8fe"}.fa-duotone.fa-cog:after,.fa-duotone.fa-gear:after,.fad.fa-cog:after,.fad.fa-gear:after{content:"\f013\f013"}.fa-duotone.fa-droplet-slash:after,.fa-duotone.fa-tint-slash:after,.fad.fa-droplet-slash:after,.fad.fa-tint-slash:after{content:"\f5c7\f5c7"}.fa-duotone.fa-book-heart:after,.fad.fa-book-heart:after{content:"\f499\f499"}.fa-duotone.fa-mosque:after,.fad.fa-mosque:after{content:"\f678\f678"}.fa-duotone.fa-duck:after,.fad.fa-duck:after{content:"\f6d8\f6d8"}.fa-duotone.fa-mosquito:after,.fad.fa-mosquito:after{content:"\e52b\e52b"}.fa-duotone.fa-star-of-david:after,.fad.fa-star-of-david:after{content:"\f69a\f69a"}.fa-duotone.fa-flag-alt:after,.fa-duotone.fa-flag-swallowtail:after,.fad.fa-flag-alt:after,.fad.fa-flag-swallowtail:after{content:"\f74c\f74c"}.fa-duotone.fa-person-military-rifle:after,.fad.fa-person-military-rifle:after{content:"\e54b\e54b"}.fa-duotone.fa-car-garage:after,.fad.fa-car-garage:after{content:"\f5e2\f5e2"}.fa-duotone.fa-cart-shopping:after,.fa-duotone.fa-shopping-cart:after,.fad.fa-cart-shopping:after,.fad.fa-shopping-cart:after{content:"\f07a\f07a"}.fa-duotone.fa-book-font:after,.fad.fa-book-font:after{content:"\e0bf\e0bf"}.fa-duotone.fa-shield-plus:after,.fad.fa-shield-plus:after{content:"\e24a\e24a"}.fa-duotone.fa-vials:after,.fad.fa-vials:after{content:"\f493\f493"}.fa-duotone.fa-eye-dropper-full:after,.fad.fa-eye-dropper-full:after{content:"\e172\e172"}.fa-duotone.fa-distribute-spacing-horizontal:after,.fad.fa-distribute-spacing-horizontal:after{content:"\e365\e365"}.fa-duotone.fa-tablet-rugged:after,.fad.fa-tablet-rugged:after{content:"\f48f\f48f"}.fa-duotone.fa-temperature-frigid:after,.fa-duotone.fa-temperature-snow:after,.fad.fa-temperature-frigid:after,.fad.fa-temperature-snow:after{content:"\f768\f768"}.fa-duotone.fa-moped:after,.fad.fa-moped:after{content:"\e3b9\e3b9"}.fa-duotone.fa-face-smile-plus:after,.fa-duotone.fa-smile-plus:after,.fad.fa-face-smile-plus:after,.fad.fa-smile-plus:after{content:"\f5b9\f5b9"}.fa-duotone.fa-radio-alt:after,.fa-duotone.fa-radio-tuner:after,.fad.fa-radio-alt:after,.fad.fa-radio-tuner:after{content:"\f8d8\f8d8"}.fa-duotone.fa-face-swear:after,.fad.fa-face-swear:after{content:"\e399\e399"}.fa-duotone.fa-water-arrow-down:after,.fa-duotone.fa-water-lower:after,.fad.fa-water-arrow-down:after,.fad.fa-water-lower:after{content:"\f774\f774"}.fa-duotone.fa-scanner-touchscreen:after,.fad.fa-scanner-touchscreen:after{content:"\f48a\f48a"}.fa-duotone.fa-circle-7:after,.fad.fa-circle-7:after{content:"\e0f4\e0f4"}.fa-duotone.fa-plug-circle-plus:after,.fad.fa-plug-circle-plus:after{content:"\e55f\e55f"}.fa-duotone.fa-person-ski-jumping:after,.fa-duotone.fa-ski-jump:after,.fad.fa-person-ski-jumping:after,.fad.fa-ski-jump:after{content:"\f7c7\f7c7"}.fa-duotone.fa-place-of-worship:after,.fad.fa-place-of-worship:after{content:"\f67f\f67f"}.fa-duotone.fa-water-arrow-up:after,.fa-duotone.fa-water-rise:after,.fad.fa-water-arrow-up:after,.fad.fa-water-rise:after{content:"\f775\f775"}.fa-duotone.fa-waveform-lines:after,.fa-duotone.fa-waveform-path:after,.fad.fa-waveform-lines:after,.fad.fa-waveform-path:after{content:"\f8f2\f8f2"}.fa-duotone.fa-split:after,.fad.fa-split:after{content:"\e254\e254"}.fa-duotone.fa-film-canister:after,.fa-duotone.fa-film-cannister:after,.fad.fa-film-canister:after,.fad.fa-film-cannister:after{content:"\f8b7\f8b7"}.fa-duotone.fa-folder-times:after,.fa-duotone.fa-folder-xmark:after,.fad.fa-folder-times:after,.fad.fa-folder-xmark:after{content:"\f65f\f65f"}.fa-duotone.fa-toilet-paper-alt:after,.fa-duotone.fa-toilet-paper-blank:after,.fad.fa-toilet-paper-alt:after,.fad.fa-toilet-paper-blank:after{content:"\f71f\f71f"}.fa-duotone.fa-tablet-android-alt:after,.fa-duotone.fa-tablet-screen:after,.fad.fa-tablet-android-alt:after,.fad.fa-tablet-screen:after{content:"\f3fc\f3fc"}.fa-duotone.fa-hexagon-vertical-nft-slanted:after,.fad.fa-hexagon-vertical-nft-slanted:after{content:"\e506\e506"}.fa-duotone.fa-folder-music:after,.fad.fa-folder-music:after{content:"\e18d\e18d"}.fa-duotone.fa-desktop-medical:after,.fa-duotone.fa-display-medical:after,.fad.fa-desktop-medical:after,.fad.fa-display-medical:after{content:"\e166\e166"}.fa-duotone.fa-share-all:after,.fad.fa-share-all:after{content:"\f367\f367"}.fa-duotone.fa-peapod:after,.fad.fa-peapod:after{content:"\e31c\e31c"}.fa-duotone.fa-chess-clock:after,.fad.fa-chess-clock:after{content:"\f43d\f43d"}.fa-duotone.fa-axe:after,.fad.fa-axe:after{content:"\f6b2\f6b2"}.fa-duotone.fa-square-d:after,.fad.fa-square-d:after{content:"\e268\e268"}.fa-duotone.fa-grip-vertical:after,.fad.fa-grip-vertical:after{content:"\f58e\f58e"}.fa-duotone.fa-mobile-signal-out:after,.fad.fa-mobile-signal-out:after{content:"\e1f0\e1f0"}.fa-duotone.fa-arrow-turn-up:after,.fa-duotone.fa-level-up:after,.fad.fa-arrow-turn-up:after,.fad.fa-level-up:after{content:"\f148\f148"}.fa-duotone.fa-u:after,.fad.fa-u:after{content:"\55\55"}.fa-duotone.fa-arrow-up-from-dotted-line:after,.fad.fa-arrow-up-from-dotted-line:after{content:"\e09b\e09b"}.fa-duotone.fa-square-root-alt:after,.fa-duotone.fa-square-root-variable:after,.fad.fa-square-root-alt:after,.fad.fa-square-root-variable:after{content:"\f698\f698"}.fa-duotone.fa-light-switch-on:after,.fad.fa-light-switch-on:after{content:"\e019\e019"}.fa-duotone.fa-arrow-down-arrow-up:after,.fa-duotone.fa-sort-alt:after,.fad.fa-arrow-down-arrow-up:after,.fad.fa-sort-alt:after{content:"\f883\f883"}.fa-duotone.fa-raindrops:after,.fad.fa-raindrops:after{content:"\f75c\f75c"}.fa-duotone.fa-dash:after,.fa-duotone.fa-minus-large:after,.fad.fa-dash:after,.fad.fa-minus-large:after{content:"\e404\e404"}.fa-duotone.fa-clock-four:after,.fa-duotone.fa-clock:after,.fad.fa-clock-four:after,.fad.fa-clock:after{content:"\f017\f017"}.fa-duotone.fa-input-numeric:after,.fad.fa-input-numeric:after{content:"\e1bd\e1bd"}.fa-duotone.fa-truck-tow:after,.fad.fa-truck-tow:after{content:"\e2b8\e2b8"}.fa-duotone.fa-backward-step:after,.fa-duotone.fa-step-backward:after,.fad.fa-backward-step:after,.fad.fa-step-backward:after{content:"\f048\f048"}.fa-duotone.fa-pallet:after,.fad.fa-pallet:after{content:"\f482\f482"}.fa-duotone.fa-car-bolt:after,.fad.fa-car-bolt:after{content:"\e341\e341"}.fa-duotone.fa-arrows-maximize:after,.fa-duotone.fa-expand-arrows:after,.fad.fa-arrows-maximize:after,.fad.fa-expand-arrows:after{content:"\f31d\f31d"}.fa-duotone.fa-faucet:after,.fad.fa-faucet:after{content:"\e005\e005"}.fa-duotone.fa-cloud-sleet:after,.fad.fa-cloud-sleet:after{content:"\f741\f741"}.fa-duotone.fa-lamp-street:after,.fad.fa-lamp-street:after{content:"\e1c5\e1c5"}.fa-duotone.fa-list-radio:after,.fad.fa-list-radio:after{content:"\e1d0\e1d0"}.fa-duotone.fa-pen-nib-slash:after,.fad.fa-pen-nib-slash:after{content:"\e4a1\e4a1"}.fa-duotone.fa-baseball-bat-ball:after,.fad.fa-baseball-bat-ball:after{content:"\f432\f432"}.fa-duotone.fa-square-up-left:after,.fad.fa-square-up-left:after{content:"\e282\e282"}.fa-duotone.fa-overline:after,.fad.fa-overline:after{content:"\f876\f876"}.fa-duotone.fa-s:after,.fad.fa-s:after{content:"\53\53"}.fa-duotone.fa-timeline:after,.fad.fa-timeline:after{content:"\e29c\e29c"}.fa-duotone.fa-keyboard:after,.fad.fa-keyboard:after{content:"\f11c\f11c"}.fa-duotone.fa-arrows-from-dotted-line:after,.fad.fa-arrows-from-dotted-line:after{content:"\e0a3\e0a3"}.fa-duotone.fa-usb-drive:after,.fad.fa-usb-drive:after{content:"\f8e9\f8e9"}.fa-duotone.fa-ballot:after,.fad.fa-ballot:after{content:"\f732\f732"}.fa-duotone.fa-caret-down:after,.fad.fa-caret-down:after{content:"\f0d7\f0d7"}.fa-duotone.fa-location-dot-slash:after,.fa-duotone.fa-map-marker-alt-slash:after,.fad.fa-location-dot-slash:after,.fad.fa-map-marker-alt-slash:after{content:"\f605\f605"}.fa-duotone.fa-cards:after,.fad.fa-cards:after{content:"\e3ed\e3ed"}.fa-duotone.fa-clinic-medical:after,.fa-duotone.fa-house-chimney-medical:after,.fad.fa-clinic-medical:after,.fad.fa-house-chimney-medical:after{content:"\f7f2\f7f2"}.fa-duotone.fa-boxing-glove:after,.fa-duotone.fa-glove-boxing:after,.fad.fa-boxing-glove:after,.fad.fa-glove-boxing:after{content:"\f438\f438"}.fa-duotone.fa-temperature-3:after,.fa-duotone.fa-temperature-three-quarters:after,.fa-duotone.fa-thermometer-3:after,.fa-duotone.fa-thermometer-three-quarters:after,.fad.fa-temperature-3:after,.fad.fa-temperature-three-quarters:after,.fad.fa-thermometer-3:after,.fad.fa-thermometer-three-quarters:after{content:"\f2c8\f2c8"}.fa-duotone.fa-bell-school:after,.fad.fa-bell-school:after{content:"\f5d5\f5d5"}.fa-duotone.fa-mobile-android-alt:after,.fa-duotone.fa-mobile-screen:after,.fad.fa-mobile-android-alt:after,.fad.fa-mobile-screen:after{content:"\f3cf\f3cf"}.fa-duotone.fa-plane-up:after,.fad.fa-plane-up:after{content:"\e22d\e22d"}.fa-duotone.fa-folder-heart:after,.fad.fa-folder-heart:after{content:"\e189\e189"}.fa-duotone.fa-circle-location-arrow:after,.fa-duotone.fa-location-circle:after,.fad.fa-circle-location-arrow:after,.fad.fa-location-circle:after{content:"\f602\f602"}.fa-duotone.fa-face-head-bandage:after,.fad.fa-face-head-bandage:after{content:"\e37a\e37a"}.fa-duotone.fa-maki-roll:after,.fa-duotone.fa-makizushi:after,.fa-duotone.fa-sushi-roll:after,.fad.fa-maki-roll:after,.fad.fa-makizushi:after,.fad.fa-sushi-roll:after{content:"\e48b\e48b"}.fa-duotone.fa-car-bump:after,.fad.fa-car-bump:after{content:"\f5e0\f5e0"}.fa-duotone.fa-piggy-bank:after,.fad.fa-piggy-bank:after{content:"\f4d3\f4d3"}.fa-duotone.fa-racquet:after,.fad.fa-racquet:after{content:"\f45a\f45a"}.fa-duotone.fa-car-mirrors:after,.fad.fa-car-mirrors:after{content:"\e343\e343"}.fa-duotone.fa-industry-alt:after,.fa-duotone.fa-industry-windows:after,.fad.fa-industry-alt:after,.fad.fa-industry-windows:after{content:"\f3b3\f3b3"}.fa-duotone.fa-bolt-auto:after,.fad.fa-bolt-auto:after{content:"\e0b6\e0b6"}.fa-duotone.fa-battery-3:after,.fa-duotone.fa-battery-half:after,.fad.fa-battery-3:after,.fad.fa-battery-half:after{content:"\f242\f242"}.fa-duotone.fa-flux-capacitor:after,.fad.fa-flux-capacitor:after{content:"\f8ba\f8ba"}.fa-duotone.fa-mountain-city:after,.fad.fa-mountain-city:after{content:"\e52e\e52e"}.fa-duotone.fa-coins:after,.fad.fa-coins:after{content:"\f51e\f51e"}.fa-duotone.fa-honey-pot:after,.fad.fa-honey-pot:after{content:"\e418\e418"}.fa-duotone.fa-olive:after,.fad.fa-olive:after{content:"\e316\e316"}.fa-duotone.fa-khanda:after,.fad.fa-khanda:after{content:"\f66d\f66d"}.fa-duotone.fa-filter-list:after,.fad.fa-filter-list:after{content:"\e17c\e17c"}.fa-duotone.fa-outlet:after,.fad.fa-outlet:after{content:"\e01c\e01c"}.fa-duotone.fa-sliders-h:after,.fa-duotone.fa-sliders:after,.fad.fa-sliders-h:after,.fad.fa-sliders:after{content:"\f1de\f1de"}.fa-duotone.fa-cauldron:after,.fad.fa-cauldron:after{content:"\f6bf\f6bf"}.fa-duotone.fa-people:after,.fad.fa-people:after{content:"\e216\e216"}.fa-duotone.fa-folder-tree:after,.fad.fa-folder-tree:after{content:"\f802\f802"}.fa-duotone.fa-network-wired:after,.fad.fa-network-wired:after{content:"\f6ff\f6ff"}.fa-duotone.fa-croissant:after,.fad.fa-croissant:after{content:"\f7f6\f7f6"}.fa-duotone.fa-map-pin:after,.fad.fa-map-pin:after{content:"\f276\f276"}.fa-duotone.fa-hamsa:after,.fad.fa-hamsa:after{content:"\f665\f665"}.fa-duotone.fa-cent-sign:after,.fad.fa-cent-sign:after{content:"\e3f5\e3f5"}.fa-duotone.fa-swords-laser:after,.fad.fa-swords-laser:after{content:"\e03d\e03d"}.fa-duotone.fa-flask:after,.fad.fa-flask:after{content:"\f0c3\f0c3"}.fa-duotone.fa-person-pregnant:after,.fad.fa-person-pregnant:after{content:"\e31e\e31e"}.fa-duotone.fa-square-u:after,.fad.fa-square-u:after{content:"\e281\e281"}.fa-duotone.fa-wand-sparkles:after,.fad.fa-wand-sparkles:after{content:"\f72b\f72b"}.fa-duotone.fa-router:after,.fad.fa-router:after{content:"\f8da\f8da"}.fa-duotone.fa-ellipsis-v:after,.fa-duotone.fa-ellipsis-vertical:after,.fad.fa-ellipsis-v:after,.fad.fa-ellipsis-vertical:after{content:"\f142\f142"}.fa-duotone.fa-sword-laser-alt:after,.fad.fa-sword-laser-alt:after{content:"\e03c\e03c"}.fa-duotone.fa-ticket:after,.fad.fa-ticket:after{content:"\f145\f145"}.fa-duotone.fa-power-off:after,.fad.fa-power-off:after{content:"\f011\f011"}.fa-duotone.fa-coin:after,.fad.fa-coin:after{content:"\f85c\f85c"}.fa-duotone.fa-laptop-slash:after,.fad.fa-laptop-slash:after{content:"\e1c7\e1c7"}.fa-duotone.fa-long-arrow-alt-right:after,.fa-duotone.fa-right-long:after,.fad.fa-long-arrow-alt-right:after,.fad.fa-right-long:after{content:"\f30b\f30b"}.fa-duotone.fa-circle-b:after,.fad.fa-circle-b:after{content:"\e0fd\e0fd"}.fa-duotone.fa-person-dress-simple:after,.fad.fa-person-dress-simple:after{content:"\e21c\e21c"}.fa-duotone.fa-pipe-collar:after,.fad.fa-pipe-collar:after{content:"\e437\e437"}.fa-duotone.fa-lights-holiday:after,.fad.fa-lights-holiday:after{content:"\f7b2\f7b2"}.fa-duotone.fa-citrus:after,.fad.fa-citrus:after{content:"\e2f4\e2f4"}.fa-duotone.fa-flag-usa:after,.fad.fa-flag-usa:after{content:"\f74d\f74d"}.fa-duotone.fa-laptop-file:after,.fad.fa-laptop-file:after{content:"\e51d\e51d"}.fa-duotone.fa-teletype:after,.fa-duotone.fa-tty:after,.fad.fa-teletype:after,.fad.fa-tty:after{content:"\f1e4\f1e4"}.fa-duotone.fa-chart-tree-map:after,.fad.fa-chart-tree-map:after{content:"\e0ea\e0ea"}.fa-duotone.fa-diagram-next:after,.fad.fa-diagram-next:after{content:"\e476\e476"}.fa-duotone.fa-person-rifle:after,.fad.fa-person-rifle:after{content:"\e54e\e54e"}.fa-duotone.fa-clock-five-thirty:after,.fad.fa-clock-five-thirty:after{content:"\e34a\e34a"}.fa-duotone.fa-pipe-valve:after,.fad.fa-pipe-valve:after{content:"\e439\e439"}.fa-duotone.fa-arrow-up-from-arc:after,.fad.fa-arrow-up-from-arc:after{content:"\e4b4\e4b4"}.fa-duotone.fa-face-spiral-eyes:after,.fad.fa-face-spiral-eyes:after{content:"\e485\e485"}.fa-duotone.fa-compress-wide:after,.fad.fa-compress-wide:after{content:"\f326\f326"}.fa-duotone.fa-circle-phone-hangup:after,.fa-duotone.fa-phone-circle-down:after,.fad.fa-circle-phone-hangup:after,.fad.fa-phone-circle-down:after{content:"\e11d\e11d"}.fa-duotone.fa-gear-complex-code:after,.fad.fa-gear-complex-code:after{content:"\e5eb\e5eb"}.fa-duotone.fa-house-medical-circle-exclamation:after,.fad.fa-house-medical-circle-exclamation:after{content:"\e512\e512"}.fa-duotone.fa-badminton:after,.fad.fa-badminton:after{content:"\e33a\e33a"}.fa-duotone.fa-closed-captioning:after,.fad.fa-closed-captioning:after{content:"\f20a\f20a"}.fa-duotone.fa-hiking:after,.fa-duotone.fa-person-hiking:after,.fad.fa-hiking:after,.fad.fa-person-hiking:after{content:"\f6ec\f6ec"}.fa-duotone.fa-arrow-alt-from-left:after,.fa-duotone.fa-right-from-line:after,.fad.fa-arrow-alt-from-left:after,.fad.fa-right-from-line:after{content:"\f347\f347"}.fa-duotone.fa-venus-double:after,.fad.fa-venus-double:after{content:"\f226\f226"}.fa-duotone.fa-images:after,.fad.fa-images:after{content:"\f302\f302"}.fa-duotone.fa-calculator:after,.fad.fa-calculator:after{content:"\f1ec\f1ec"}.fa-duotone.fa-shuttlecock:after,.fad.fa-shuttlecock:after{content:"\f45b\f45b"}.fa-duotone.fa-user-hair:after,.fad.fa-user-hair:after{content:"\e45a\e45a"}.fa-duotone.fa-eye-evil:after,.fad.fa-eye-evil:after{content:"\f6db\f6db"}.fa-duotone.fa-people-pulling:after,.fad.fa-people-pulling:after{content:"\e535\e535"}.fa-duotone.fa-n:after,.fad.fa-n:after{content:"\4e\4e"}.fa-duotone.fa-swap:after,.fad.fa-swap:after{content:"\e609\e609"}.fa-duotone.fa-garage:after,.fad.fa-garage:after{content:"\e009\e009"}.fa-duotone.fa-cable-car:after,.fa-duotone.fa-tram:after,.fad.fa-cable-car:after,.fad.fa-tram:after{content:"\f7da\f7da"}.fa-duotone.fa-shovel-snow:after,.fad.fa-shovel-snow:after{content:"\f7c3\f7c3"}.fa-duotone.fa-cloud-rain:after,.fad.fa-cloud-rain:after{content:"\f73d\f73d"}.fa-duotone.fa-face-lying:after,.fad.fa-face-lying:after{content:"\e37e\e37e"}.fa-duotone.fa-sprinkler:after,.fad.fa-sprinkler:after{content:"\e035\e035"}.fa-duotone.fa-building-circle-xmark:after,.fad.fa-building-circle-xmark:after{content:"\e4d4\e4d4"}.fa-duotone.fa-person-sledding:after,.fa-duotone.fa-sledding:after,.fad.fa-person-sledding:after,.fad.fa-sledding:after{content:"\f7cb\f7cb"}.fa-duotone.fa-game-console-handheld:after,.fad.fa-game-console-handheld:after{content:"\f8bb\f8bb"}.fa-duotone.fa-ship:after,.fad.fa-ship:after{content:"\f21a\f21a"}.fa-duotone.fa-clock-six-thirty:after,.fad.fa-clock-six-thirty:after{content:"\e353\e353"}.fa-duotone.fa-battery-slash:after,.fad.fa-battery-slash:after{content:"\f377\f377"}.fa-duotone.fa-tugrik-sign:after,.fad.fa-tugrik-sign:after{content:"\e2ba\e2ba"}.fa-duotone.fa-arrows-down-to-line:after,.fad.fa-arrows-down-to-line:after{content:"\e4b8\e4b8"}.fa-duotone.fa-download:after,.fad.fa-download:after{content:"\f019\f019"}.fa-duotone.fa-angles-up-down:after,.fad.fa-angles-up-down:after{content:"\e60d\e60d"}.fa-duotone.fa-inventory:after,.fa-duotone.fa-shelves:after,.fad.fa-inventory:after,.fad.fa-shelves:after{content:"\f480\f480"}.fa-duotone.fa-cloud-snow:after,.fad.fa-cloud-snow:after{content:"\f742\f742"}.fa-duotone.fa-face-grin:after,.fa-duotone.fa-grin:after,.fad.fa-face-grin:after,.fad.fa-grin:after{content:"\f580\f580"}.fa-duotone.fa-backspace:after,.fa-duotone.fa-delete-left:after,.fad.fa-backspace:after,.fad.fa-delete-left:after{content:"\f55a\f55a"}.fa-duotone.fa-oven:after,.fad.fa-oven:after{content:"\e01d\e01d"}.fa-duotone.fa-cloud-binary:after,.fad.fa-cloud-binary:after{content:"\e601\e601"}.fa-duotone.fa-eye-dropper-empty:after,.fa-duotone.fa-eye-dropper:after,.fa-duotone.fa-eyedropper:after,.fad.fa-eye-dropper-empty:after,.fad.fa-eye-dropper:after,.fad.fa-eyedropper:after{content:"\f1fb\f1fb"}.fa-duotone.fa-comment-captions:after,.fad.fa-comment-captions:after{content:"\e146\e146"}.fa-duotone.fa-comments-question:after,.fad.fa-comments-question:after{content:"\e14e\e14e"}.fa-duotone.fa-scribble:after,.fad.fa-scribble:after{content:"\e23f\e23f"}.fa-duotone.fa-rotate-exclamation:after,.fad.fa-rotate-exclamation:after{content:"\e23c\e23c"}.fa-duotone.fa-file-circle-check:after,.fad.fa-file-circle-check:after{content:"\e5a0\e5a0"}.fa-duotone.fa-glass:after,.fad.fa-glass:after{content:"\f804\f804"}.fa-duotone.fa-loader:after,.fad.fa-loader:after{content:"\e1d4\e1d4"}.fa-duotone.fa-forward:after,.fad.fa-forward:after{content:"\f04e\f04e"}.fa-duotone.fa-user-pilot:after,.fad.fa-user-pilot:after{content:"\e2c0\e2c0"}.fa-duotone.fa-mobile-android:after,.fa-duotone.fa-mobile-phone:after,.fa-duotone.fa-mobile:after,.fad.fa-mobile-android:after,.fad.fa-mobile-phone:after,.fad.fa-mobile:after{content:"\f3ce\f3ce"}.fa-duotone.fa-code-pull-request-closed:after,.fad.fa-code-pull-request-closed:after{content:"\e3f9\e3f9"}.fa-duotone.fa-face-meh:after,.fa-duotone.fa-meh:after,.fad.fa-face-meh:after,.fad.fa-meh:after{content:"\f11a\f11a"}.fa-duotone.fa-align-center:after,.fad.fa-align-center:after{content:"\f037\f037"}.fa-duotone.fa-book-dead:after,.fa-duotone.fa-book-skull:after,.fad.fa-book-dead:after,.fad.fa-book-skull:after{content:"\f6b7\f6b7"}.fa-duotone.fa-drivers-license:after,.fa-duotone.fa-id-card:after,.fad.fa-drivers-license:after,.fad.fa-id-card:after{content:"\f2c2\f2c2"}.fa-duotone.fa-face-dotted:after,.fad.fa-face-dotted:after{content:"\e47f\e47f"}.fa-duotone.fa-face-worried:after,.fad.fa-face-worried:after{content:"\e3a3\e3a3"}.fa-duotone.fa-dedent:after,.fa-duotone.fa-outdent:after,.fad.fa-dedent:after,.fad.fa-outdent:after{content:"\f03b\f03b"}.fa-duotone.fa-heart-circle-exclamation:after,.fad.fa-heart-circle-exclamation:after{content:"\e4fe\e4fe"}.fa-duotone.fa-home-alt:after,.fa-duotone.fa-home-lg-alt:after,.fa-duotone.fa-home:after,.fa-duotone.fa-house:after,.fad.fa-home-alt:after,.fad.fa-home-lg-alt:after,.fad.fa-home:after,.fad.fa-house:after{content:"\f015\f015"}.fa-duotone.fa-vector-circle:after,.fad.fa-vector-circle:after{content:"\e2c6\e2c6"}.fa-duotone.fa-car-circle-bolt:after,.fad.fa-car-circle-bolt:after{content:"\e342\e342"}.fa-duotone.fa-calendar-week:after,.fad.fa-calendar-week:after{content:"\f784\f784"}.fa-duotone.fa-flying-disc:after,.fad.fa-flying-disc:after{content:"\e3a9\e3a9"}.fa-duotone.fa-laptop-medical:after,.fad.fa-laptop-medical:after{content:"\f812\f812"}.fa-duotone.fa-square-down-right:after,.fad.fa-square-down-right:after{content:"\e26c\e26c"}.fa-duotone.fa-b:after,.fad.fa-b:after{content:"\42\42"}.fa-duotone.fa-seat-airline:after,.fad.fa-seat-airline:after{content:"\e244\e244"}.fa-duotone.fa-eclipse-alt:after,.fa-duotone.fa-moon-over-sun:after,.fad.fa-eclipse-alt:after,.fad.fa-moon-over-sun:after{content:"\f74a\f74a"}.fa-duotone.fa-pipe:after,.fad.fa-pipe:after{content:"\7c\7c"}.fa-duotone.fa-file-medical:after,.fad.fa-file-medical:after{content:"\f477\f477"}.fa-duotone.fa-potato:after,.fad.fa-potato:after{content:"\e440\e440"}.fa-duotone.fa-dice-one:after,.fad.fa-dice-one:after{content:"\f525\f525"}.fa-duotone.fa-circle-a:after,.fad.fa-circle-a:after{content:"\e0f7\e0f7"}.fa-duotone.fa-helmet-battle:after,.fad.fa-helmet-battle:after{content:"\f6eb\f6eb"}.fa-duotone.fa-butter:after,.fad.fa-butter:after{content:"\e3e4\e3e4"}.fa-duotone.fa-blanket-fire:after,.fad.fa-blanket-fire:after{content:"\e3da\e3da"}.fa-duotone.fa-kiwi-bird:after,.fad.fa-kiwi-bird:after{content:"\f535\f535"}.fa-duotone.fa-castle:after,.fad.fa-castle:after{content:"\e0de\e0de"}.fa-duotone.fa-golf-club:after,.fad.fa-golf-club:after{content:"\f451\f451"}.fa-duotone.fa-arrow-right-arrow-left:after,.fa-duotone.fa-exchange:after,.fad.fa-arrow-right-arrow-left:after,.fad.fa-exchange:after{content:"\f0ec\f0ec"}.fa-duotone.fa-redo-alt:after,.fa-duotone.fa-rotate-forward:after,.fa-duotone.fa-rotate-right:after,.fad.fa-redo-alt:after,.fad.fa-rotate-forward:after,.fad.fa-rotate-right:after{content:"\f2f9\f2f9"}.fa-duotone.fa-cutlery:after,.fa-duotone.fa-utensils:after,.fad.fa-cutlery:after,.fad.fa-utensils:after{content:"\f2e7\f2e7"}.fa-duotone.fa-arrow-up-wide-short:after,.fa-duotone.fa-sort-amount-up:after,.fad.fa-arrow-up-wide-short:after,.fad.fa-sort-amount-up:after{content:"\f161\f161"}.fa-duotone.fa-chart-pie-simple-circle-dollar:after,.fad.fa-chart-pie-simple-circle-dollar:after{content:"\e605\e605"}.fa-duotone.fa-balloons:after,.fad.fa-balloons:after{content:"\e2e4\e2e4"}.fa-duotone.fa-mill-sign:after,.fad.fa-mill-sign:after{content:"\e1ed\e1ed"}.fa-duotone.fa-bowl-rice:after,.fad.fa-bowl-rice:after{content:"\e2eb\e2eb"}.fa-duotone.fa-timeline-arrow:after,.fad.fa-timeline-arrow:after{content:"\e29d\e29d"}.fa-duotone.fa-skull:after,.fad.fa-skull:after{content:"\f54c\f54c"}.fa-duotone.fa-game-board-alt:after,.fa-duotone.fa-game-board-simple:after,.fad.fa-game-board-alt:after,.fad.fa-game-board-simple:after{content:"\f868\f868"}.fa-duotone.fa-circle-video:after,.fa-duotone.fa-video-circle:after,.fad.fa-circle-video:after,.fad.fa-video-circle:after{content:"\e12b\e12b"}.fa-duotone.fa-chart-scatter-bubble:after,.fad.fa-chart-scatter-bubble:after{content:"\e0e9\e0e9"}.fa-duotone.fa-house-turret:after,.fad.fa-house-turret:after{content:"\e1b4\e1b4"}.fa-duotone.fa-banana:after,.fad.fa-banana:after{content:"\e2e5\e2e5"}.fa-duotone.fa-hand-holding-skull:after,.fad.fa-hand-holding-skull:after{content:"\e1a4\e1a4"}.fa-duotone.fa-people-dress:after,.fad.fa-people-dress:after{content:"\e217\e217"}.fa-duotone.fa-couch-small:after,.fa-duotone.fa-loveseat:after,.fad.fa-couch-small:after,.fad.fa-loveseat:after{content:"\f4cc\f4cc"}.fa-duotone.fa-broadcast-tower:after,.fa-duotone.fa-tower-broadcast:after,.fad.fa-broadcast-tower:after,.fad.fa-tower-broadcast:after{content:"\f519\f519"}.fa-duotone.fa-truck-pickup:after,.fad.fa-truck-pickup:after{content:"\f63c\f63c"}.fa-duotone.fa-block-quote:after,.fad.fa-block-quote:after{content:"\e0b5\e0b5"}.fa-duotone.fa-long-arrow-alt-up:after,.fa-duotone.fa-up-long:after,.fad.fa-long-arrow-alt-up:after,.fad.fa-up-long:after{content:"\f30c\f30c"}.fa-duotone.fa-stop:after,.fad.fa-stop:after{content:"\f04d\f04d"}.fa-duotone.fa-code-merge:after,.fad.fa-code-merge:after{content:"\f387\f387"}.fa-duotone.fa-money-check-dollar-pen:after,.fa-duotone.fa-money-check-edit-alt:after,.fad.fa-money-check-dollar-pen:after,.fad.fa-money-check-edit-alt:after{content:"\f873\f873"}.fa-duotone.fa-arrow-alt-from-bottom:after,.fa-duotone.fa-up-from-line:after,.fad.fa-arrow-alt-from-bottom:after,.fad.fa-up-from-line:after{content:"\f346\f346"}.fa-duotone.fa-upload:after,.fad.fa-upload:after{content:"\f093\f093"}.fa-duotone.fa-hurricane:after,.fad.fa-hurricane:after{content:"\f751\f751"}.fa-duotone.fa-grid-round-2-plus:after,.fad.fa-grid-round-2-plus:after{content:"\e5dc\e5dc"}.fa-duotone.fa-people-pants:after,.fad.fa-people-pants:after{content:"\e219\e219"}.fa-duotone.fa-mound:after,.fad.fa-mound:after{content:"\e52d\e52d"}.fa-duotone.fa-windsock:after,.fad.fa-windsock:after{content:"\f777\f777"}.fa-duotone.fa-circle-half:after,.fad.fa-circle-half:after{content:"\e110\e110"}.fa-duotone.fa-brake-warning:after,.fad.fa-brake-warning:after{content:"\e0c7\e0c7"}.fa-duotone.fa-toilet-portable:after,.fad.fa-toilet-portable:after{content:"\e583\e583"}.fa-duotone.fa-compact-disc:after,.fad.fa-compact-disc:after{content:"\f51f\f51f"}.fa-duotone.fa-file-arrow-down:after,.fa-duotone.fa-file-download:after,.fad.fa-file-arrow-down:after,.fad.fa-file-download:after{content:"\f56d\f56d"}.fa-duotone.fa-sax-hot:after,.fa-duotone.fa-saxophone-fire:after,.fad.fa-sax-hot:after,.fad.fa-saxophone-fire:after{content:"\f8db\f8db"}.fa-duotone.fa-camera-web-slash:after,.fa-duotone.fa-webcam-slash:after,.fad.fa-camera-web-slash:after,.fad.fa-webcam-slash:after{content:"\f833\f833"}.fa-duotone.fa-folder-medical:after,.fad.fa-folder-medical:after{content:"\e18c\e18c"}.fa-duotone.fa-folder-cog:after,.fa-duotone.fa-folder-gear:after,.fad.fa-folder-cog:after,.fad.fa-folder-gear:after{content:"\e187\e187"}.fa-duotone.fa-hand-wave:after,.fad.fa-hand-wave:after{content:"\e1a7\e1a7"}.fa-duotone.fa-arrow-up-arrow-down:after,.fa-duotone.fa-sort-up-down:after,.fad.fa-arrow-up-arrow-down:after,.fad.fa-sort-up-down:after{content:"\e099\e099"}.fa-duotone.fa-caravan:after,.fad.fa-caravan:after{content:"\f8ff\f8ff"}.fa-duotone.fa-shield-cat:after,.fad.fa-shield-cat:after{content:"\e572\e572"}.fa-duotone.fa-comment-alt-slash:after,.fa-duotone.fa-message-slash:after,.fad.fa-comment-alt-slash:after,.fad.fa-message-slash:after{content:"\f4a9\f4a9"}.fa-duotone.fa-bolt:after,.fa-duotone.fa-zap:after,.fad.fa-bolt:after,.fad.fa-zap:after{content:"\f0e7\f0e7"}.fa-duotone.fa-trash-can-check:after,.fad.fa-trash-can-check:after{content:"\e2a9\e2a9"}.fa-duotone.fa-glass-water:after,.fad.fa-glass-water:after{content:"\e4f4\e4f4"}.fa-duotone.fa-oil-well:after,.fad.fa-oil-well:after{content:"\e532\e532"}.fa-duotone.fa-person-simple:after,.fad.fa-person-simple:after{content:"\e220\e220"}.fa-duotone.fa-vault:after,.fad.fa-vault:after{content:"\e2c5\e2c5"}.fa-duotone.fa-mars:after,.fad.fa-mars:after{content:"\f222\f222"}.fa-duotone.fa-toilet:after,.fad.fa-toilet:after{content:"\f7d8\f7d8"}.fa-duotone.fa-plane-circle-xmark:after,.fad.fa-plane-circle-xmark:after{content:"\e557\e557"}.fa-duotone.fa-cny:after,.fa-duotone.fa-jpy:after,.fa-duotone.fa-rmb:after,.fa-duotone.fa-yen-sign:after,.fa-duotone.fa-yen:after,.fad.fa-cny:after,.fad.fa-jpy:after,.fad.fa-rmb:after,.fad.fa-yen-sign:after,.fad.fa-yen:after{content:"\f157\f157"}.fa-duotone.fa-gear-code:after,.fad.fa-gear-code:after{content:"\e5e8\e5e8"}.fa-duotone.fa-notes:after,.fad.fa-notes:after{content:"\e202\e202"}.fa-duotone.fa-rouble:after,.fa-duotone.fa-rub:after,.fa-duotone.fa-ruble-sign:after,.fa-duotone.fa-ruble:after,.fad.fa-rouble:after,.fad.fa-rub:after,.fad.fa-ruble-sign:after,.fad.fa-ruble:after{content:"\f158\f158"}.fa-duotone.fa-trash-arrow-turn-left:after,.fa-duotone.fa-trash-undo:after,.fad.fa-trash-arrow-turn-left:after,.fad.fa-trash-undo:after{content:"\f895\f895"}.fa-duotone.fa-champagne-glass:after,.fa-duotone.fa-glass-champagne:after,.fad.fa-champagne-glass:after,.fad.fa-glass-champagne:after{content:"\f79e\f79e"}.fa-duotone.fa-objects-align-center-horizontal:after,.fad.fa-objects-align-center-horizontal:after{content:"\e3bc\e3bc"}.fa-duotone.fa-sun:after,.fad.fa-sun:after{content:"\f185\f185"}.fa-duotone.fa-trash-alt-slash:after,.fa-duotone.fa-trash-can-slash:after,.fad.fa-trash-alt-slash:after,.fad.fa-trash-can-slash:after{content:"\e2ad\e2ad"}.fa-duotone.fa-screen-users:after,.fa-duotone.fa-users-class:after,.fad.fa-screen-users:after,.fad.fa-users-class:after{content:"\f63d\f63d"}.fa-duotone.fa-guitar:after,.fad.fa-guitar:after{content:"\f7a6\f7a6"}.fa-duotone.fa-arrow-square-left:after,.fa-duotone.fa-square-arrow-left:after,.fad.fa-arrow-square-left:after,.fad.fa-square-arrow-left:after{content:"\f33a\f33a"}.fa-duotone.fa-square-8:after,.fad.fa-square-8:after{content:"\e25d\e25d"}.fa-duotone.fa-face-smile-hearts:after,.fad.fa-face-smile-hearts:after{content:"\e390\e390"}.fa-duotone.fa-brackets-square:after,.fa-duotone.fa-brackets:after,.fad.fa-brackets-square:after,.fad.fa-brackets:after{content:"\f7e9\f7e9"}.fa-duotone.fa-laptop-arrow-down:after,.fad.fa-laptop-arrow-down:after{content:"\e1c6\e1c6"}.fa-duotone.fa-hockey-stick-puck:after,.fad.fa-hockey-stick-puck:after{content:"\e3ae\e3ae"}.fa-duotone.fa-house-tree:after,.fad.fa-house-tree:after{content:"\e1b3\e1b3"}.fa-duotone.fa-signal-2:after,.fa-duotone.fa-signal-fair:after,.fad.fa-signal-2:after,.fad.fa-signal-fair:after{content:"\f68d\f68d"}.fa-duotone.fa-face-laugh-wink:after,.fa-duotone.fa-laugh-wink:after,.fad.fa-face-laugh-wink:after,.fad.fa-laugh-wink:after{content:"\f59c\f59c"}.fa-duotone.fa-circle-dollar:after,.fa-duotone.fa-dollar-circle:after,.fa-duotone.fa-usd-circle:after,.fad.fa-circle-dollar:after,.fad.fa-dollar-circle:after,.fad.fa-usd-circle:after{content:"\f2e8\f2e8"}.fa-duotone.fa-horse-head:after,.fad.fa-horse-head:after{content:"\f7ab\f7ab"}.fa-duotone.fa-arrows-repeat:after,.fa-duotone.fa-repeat-alt:after,.fad.fa-arrows-repeat:after,.fad.fa-repeat-alt:after{content:"\f364\f364"}.fa-duotone.fa-bore-hole:after,.fad.fa-bore-hole:after{content:"\e4c3\e4c3"}.fa-duotone.fa-industry:after,.fad.fa-industry:after{content:"\f275\f275"}.fa-duotone.fa-image-polaroid:after,.fad.fa-image-polaroid:after{content:"\f8c4\f8c4"}.fa-duotone.fa-wave-triangle:after,.fad.fa-wave-triangle:after{content:"\f89a\f89a"}.fa-duotone.fa-person-running-fast:after,.fad.fa-person-running-fast:after{content:"\e5ff\e5ff"}.fa-duotone.fa-arrow-alt-circle-down:after,.fa-duotone.fa-circle-down:after,.fad.fa-arrow-alt-circle-down:after,.fad.fa-circle-down:after{content:"\f358\f358"}.fa-duotone.fa-grill:after,.fad.fa-grill:after{content:"\e5a3\e5a3"}.fa-duotone.fa-arrows-turn-to-dots:after,.fad.fa-arrows-turn-to-dots:after{content:"\e4c1\e4c1"}.fa-duotone.fa-analytics:after,.fa-duotone.fa-chart-mixed:after,.fad.fa-analytics:after,.fad.fa-chart-mixed:after{content:"\f643\f643"}.fa-duotone.fa-florin-sign:after,.fad.fa-florin-sign:after{content:"\e184\e184"}.fa-duotone.fa-arrow-down-short-wide:after,.fa-duotone.fa-sort-amount-desc:after,.fa-duotone.fa-sort-amount-down-alt:after,.fad.fa-arrow-down-short-wide:after,.fad.fa-sort-amount-desc:after,.fad.fa-sort-amount-down-alt:after{content:"\f884\f884"}.fa-duotone.fa-less-than:after,.fad.fa-less-than:after{content:"\3c\3c"}.fa-duotone.fa-desktop-code:after,.fa-duotone.fa-display-code:after,.fad.fa-desktop-code:after,.fad.fa-display-code:after{content:"\e165\e165"}.fa-duotone.fa-face-drooling:after,.fad.fa-face-drooling:after{content:"\e372\e372"}.fa-duotone.fa-oil-temp:after,.fa-duotone.fa-oil-temperature:after,.fad.fa-oil-temp:after,.fad.fa-oil-temperature:after{content:"\f614\f614"}.fa-duotone.fa-question-square:after,.fa-duotone.fa-square-question:after,.fad.fa-question-square:after,.fad.fa-square-question:after{content:"\f2fd\f2fd"}.fa-duotone.fa-air-conditioner:after,.fad.fa-air-conditioner:after{content:"\f8f4\f8f4"}.fa-duotone.fa-angle-down:after,.fad.fa-angle-down:after{content:"\f107\f107"}.fa-duotone.fa-mountains:after,.fad.fa-mountains:after{content:"\f6fd\f6fd"}.fa-duotone.fa-omega:after,.fad.fa-omega:after{content:"\f67a\f67a"}.fa-duotone.fa-car-tunnel:after,.fad.fa-car-tunnel:after{content:"\e4de\e4de"}.fa-duotone.fa-person-dolly-empty:after,.fad.fa-person-dolly-empty:after{content:"\f4d1\f4d1"}.fa-duotone.fa-pan-food:after,.fad.fa-pan-food:after{content:"\e42b\e42b"}.fa-duotone.fa-head-side-cough:after,.fad.fa-head-side-cough:after{content:"\e061\e061"}.fa-duotone.fa-grip-lines:after,.fad.fa-grip-lines:after{content:"\f7a4\f7a4"}.fa-duotone.fa-thumbs-down:after,.fad.fa-thumbs-down:after{content:"\f165\f165"}.fa-duotone.fa-user-lock:after,.fad.fa-user-lock:after{content:"\f502\f502"}.fa-duotone.fa-arrow-right-long:after,.fa-duotone.fa-long-arrow-right:after,.fad.fa-arrow-right-long:after,.fad.fa-long-arrow-right:after{content:"\f178\f178"}.fa-duotone.fa-tickets-airline:after,.fad.fa-tickets-airline:after{content:"\e29b\e29b"}.fa-duotone.fa-anchor-circle-xmark:after,.fad.fa-anchor-circle-xmark:after{content:"\e4ac\e4ac"}.fa-duotone.fa-ellipsis-h:after,.fa-duotone.fa-ellipsis:after,.fad.fa-ellipsis-h:after,.fad.fa-ellipsis:after{content:"\f141\f141"}.fa-duotone.fa-nfc-slash:after,.fad.fa-nfc-slash:after{content:"\e1fc\e1fc"}.fa-duotone.fa-chess-pawn:after,.fad.fa-chess-pawn:after{content:"\f443\f443"}.fa-duotone.fa-first-aid:after,.fa-duotone.fa-kit-medical:after,.fad.fa-first-aid:after,.fad.fa-kit-medical:after{content:"\f479\f479"}.fa-duotone.fa-grid-2-plus:after,.fad.fa-grid-2-plus:after{content:"\e197\e197"}.fa-duotone.fa-bells:after,.fad.fa-bells:after{content:"\f77f\f77f"}.fa-duotone.fa-person-through-window:after,.fad.fa-person-through-window:after{content:"\e5a9\e5a9"}.fa-duotone.fa-toolbox:after,.fad.fa-toolbox:after{content:"\f552\f552"}.fa-duotone.fa-envelope-badge:after,.fa-duotone.fa-envelope-dot:after,.fad.fa-envelope-badge:after,.fad.fa-envelope-dot:after{content:"\e16f\e16f"}.fa-duotone.fa-hands-holding-circle:after,.fad.fa-hands-holding-circle:after{content:"\e4fb\e4fb"}.fa-duotone.fa-bug:after,.fad.fa-bug:after{content:"\f188\f188"}.fa-duotone.fa-bowl-chopsticks:after,.fad.fa-bowl-chopsticks:after{content:"\e2e9\e2e9"}.fa-duotone.fa-credit-card-alt:after,.fa-duotone.fa-credit-card:after,.fad.fa-credit-card-alt:after,.fad.fa-credit-card:after{content:"\f09d\f09d"}.fa-duotone.fa-circle-s:after,.fad.fa-circle-s:after{content:"\e121\e121"}.fa-duotone.fa-box-ballot:after,.fad.fa-box-ballot:after{content:"\f735\f735"}.fa-duotone.fa-automobile:after,.fa-duotone.fa-car:after,.fad.fa-automobile:after,.fad.fa-car:after{content:"\f1b9\f1b9"}.fa-duotone.fa-hand-holding-hand:after,.fad.fa-hand-holding-hand:after{content:"\e4f7\e4f7"}.fa-duotone.fa-user-tie-hair:after,.fad.fa-user-tie-hair:after{content:"\e45f\e45f"}.fa-duotone.fa-podium-star:after,.fad.fa-podium-star:after{content:"\f758\f758"}.fa-duotone.fa-business-front:after,.fa-duotone.fa-party-back:after,.fa-duotone.fa-trian-balbot:after,.fa-duotone.fa-user-hair-mullet:after,.fad.fa-business-front:after,.fad.fa-party-back:after,.fad.fa-trian-balbot:after,.fad.fa-user-hair-mullet:after{content:"\e45c\e45c"}.fa-duotone.fa-microphone-stand:after,.fad.fa-microphone-stand:after{content:"\f8cb\f8cb"}.fa-duotone.fa-book-open-reader:after,.fa-duotone.fa-book-reader:after,.fad.fa-book-open-reader:after,.fad.fa-book-reader:after{content:"\f5da\f5da"}.fa-duotone.fa-family-dress:after,.fad.fa-family-dress:after{content:"\e301\e301"}.fa-duotone.fa-circle-x:after,.fad.fa-circle-x:after{content:"\e12e\e12e"}.fa-duotone.fa-cabin:after,.fad.fa-cabin:after{content:"\e46d\e46d"}.fa-duotone.fa-mountain-sun:after,.fad.fa-mountain-sun:after{content:"\e52f\e52f"}.fa-duotone.fa-chart-simple-horizontal:after,.fad.fa-chart-simple-horizontal:after{content:"\e474\e474"}.fa-duotone.fa-arrows-left-right-to-line:after,.fad.fa-arrows-left-right-to-line:after{content:"\e4ba\e4ba"}.fa-duotone.fa-hand-back-point-left:after,.fad.fa-hand-back-point-left:after{content:"\e19f\e19f"}.fa-duotone.fa-comment-alt-dots:after,.fa-duotone.fa-message-dots:after,.fa-duotone.fa-messaging:after,.fad.fa-comment-alt-dots:after,.fad.fa-message-dots:after,.fad.fa-messaging:after{content:"\f4a3\f4a3"}.fa-duotone.fa-file-heart:after,.fad.fa-file-heart:after{content:"\e176\e176"}.fa-duotone.fa-beer-foam:after,.fa-duotone.fa-beer-mug:after,.fad.fa-beer-foam:after,.fad.fa-beer-mug:after{content:"\e0b3\e0b3"}.fa-duotone.fa-dice-d20:after,.fad.fa-dice-d20:after{content:"\f6cf\f6cf"}.fa-duotone.fa-drone:after,.fad.fa-drone:after{content:"\f85f\f85f"}.fa-duotone.fa-truck-droplet:after,.fad.fa-truck-droplet:after{content:"\e58c\e58c"}.fa-duotone.fa-file-circle-xmark:after,.fad.fa-file-circle-xmark:after{content:"\e5a1\e5a1"}.fa-duotone.fa-temperature-arrow-up:after,.fa-duotone.fa-temperature-up:after,.fad.fa-temperature-arrow-up:after,.fad.fa-temperature-up:after{content:"\e040\e040"}.fa-duotone.fa-medal:after,.fad.fa-medal:after{content:"\f5a2\f5a2"}.fa-duotone.fa-person-fairy:after,.fad.fa-person-fairy:after{content:"\e608\e608"}.fa-duotone.fa-bed:after,.fad.fa-bed:after{content:"\f236\f236"}.fa-duotone.fa-book-copy:after,.fad.fa-book-copy:after{content:"\e0be\e0be"}.fa-duotone.fa-h-square:after,.fa-duotone.fa-square-h:after,.fad.fa-h-square:after,.fad.fa-square-h:after{content:"\f0fd\f0fd"}.fa-duotone.fa-square-c:after,.fad.fa-square-c:after{content:"\e266\e266"}.fa-duotone.fa-clock-two:after,.fad.fa-clock-two:after{content:"\e35a\e35a"}.fa-duotone.fa-square-ellipsis-vertical:after,.fad.fa-square-ellipsis-vertical:after{content:"\e26f\e26f"}.fa-duotone.fa-calendar-users:after,.fad.fa-calendar-users:after{content:"\e5e2\e5e2"}.fa-duotone.fa-podcast:after,.fad.fa-podcast:after{content:"\f2ce\f2ce"}.fa-duotone.fa-bee:after,.fad.fa-bee:after{content:"\e0b2\e0b2"}.fa-duotone.fa-temperature-4:after,.fa-duotone.fa-temperature-full:after,.fa-duotone.fa-thermometer-4:after,.fa-duotone.fa-thermometer-full:after,.fad.fa-temperature-4:after,.fad.fa-temperature-full:after,.fad.fa-thermometer-4:after,.fad.fa-thermometer-full:after{content:"\f2c7\f2c7"}.fa-duotone.fa-bell:after,.fad.fa-bell:after{content:"\f0f3\f0f3"}.fa-duotone.fa-candy-bar:after,.fa-duotone.fa-chocolate-bar:after,.fad.fa-candy-bar:after,.fad.fa-chocolate-bar:after{content:"\e3e8\e3e8"}.fa-duotone.fa-xmark-large:after,.fad.fa-xmark-large:after{content:"\e59b\e59b"}.fa-duotone.fa-pinata:after,.fad.fa-pinata:after{content:"\e3c3\e3c3"}.fa-duotone.fa-arrows-from-line:after,.fad.fa-arrows-from-line:after{content:"\e0a4\e0a4"}.fa-duotone.fa-superscript:after,.fad.fa-superscript:after{content:"\f12b\f12b"}.fa-duotone.fa-bowl-spoon:after,.fad.fa-bowl-spoon:after{content:"\e3e0\e3e0"}.fa-duotone.fa-hexagon-check:after,.fad.fa-hexagon-check:after{content:"\e416\e416"}.fa-duotone.fa-plug-circle-xmark:after,.fad.fa-plug-circle-xmark:after{content:"\e560\e560"}.fa-duotone.fa-star-of-life:after,.fad.fa-star-of-life:after{content:"\f621\f621"}.fa-duotone.fa-phone-slash:after,.fad.fa-phone-slash:after{content:"\f3dd\f3dd"}.fa-duotone.fa-traffic-light-stop:after,.fad.fa-traffic-light-stop:after{content:"\f63a\f63a"}.fa-duotone.fa-paint-roller:after,.fad.fa-paint-roller:after{content:"\f5aa\f5aa"}.fa-duotone.fa-accent-grave:after,.fad.fa-accent-grave:after{content:"\60\60"}.fa-duotone.fa-hands-helping:after,.fa-duotone.fa-handshake-angle:after,.fad.fa-hands-helping:after,.fad.fa-handshake-angle:after{content:"\f4c4\f4c4"}.fa-duotone.fa-circle-0:after,.fad.fa-circle-0:after{content:"\e0ed\e0ed"}.fa-duotone.fa-dial-med-low:after,.fad.fa-dial-med-low:after{content:"\e160\e160"}.fa-duotone.fa-location-dot:after,.fa-duotone.fa-map-marker-alt:after,.fad.fa-location-dot:after,.fad.fa-map-marker-alt:after{content:"\f3c5\f3c5"}.fa-duotone.fa-crab:after,.fad.fa-crab:after{content:"\e3ff\e3ff"}.fa-duotone.fa-box-full:after,.fa-duotone.fa-box-open-full:after,.fad.fa-box-full:after,.fad.fa-box-open-full:after{content:"\f49c\f49c"}.fa-duotone.fa-file:after,.fad.fa-file:after{content:"\f15b\f15b"}.fa-duotone.fa-greater-than:after,.fad.fa-greater-than:after{content:"\3e\3e"}.fa-duotone.fa-quotes:after,.fad.fa-quotes:after{content:"\e234\e234"}.fa-duotone.fa-pretzel:after,.fad.fa-pretzel:after{content:"\e441\e441"}.fa-duotone.fa-person-swimming:after,.fa-duotone.fa-swimmer:after,.fad.fa-person-swimming:after,.fad.fa-swimmer:after{content:"\f5c4\f5c4"}.fa-duotone.fa-arrow-down:after,.fad.fa-arrow-down:after{content:"\f063\f063"}.fa-duotone.fa-user-robot-xmarks:after,.fad.fa-user-robot-xmarks:after{content:"\e4a7\e4a7"}.fa-duotone.fa-comment-alt-quote:after,.fa-duotone.fa-message-quote:after,.fad.fa-comment-alt-quote:after,.fad.fa-message-quote:after{content:"\e1e4\e1e4"}.fa-duotone.fa-candy-corn:after,.fad.fa-candy-corn:after{content:"\f6bd\f6bd"}.fa-duotone.fa-folder-magnifying-glass:after,.fa-duotone.fa-folder-search:after,.fad.fa-folder-magnifying-glass:after,.fad.fa-folder-search:after{content:"\e18b\e18b"}.fa-duotone.fa-notebook:after,.fad.fa-notebook:after{content:"\e201\e201"}.fa-duotone.fa-droplet:after,.fa-duotone.fa-tint:after,.fad.fa-droplet:after,.fad.fa-tint:after{content:"\f043\f043"}.fa-duotone.fa-bullseye-pointer:after,.fad.fa-bullseye-pointer:after{content:"\f649\f649"}.fa-duotone.fa-eraser:after,.fad.fa-eraser:after{content:"\f12d\f12d"}.fa-duotone.fa-hexagon-image:after,.fad.fa-hexagon-image:after{content:"\e504\e504"}.fa-duotone.fa-earth-america:after,.fa-duotone.fa-earth-americas:after,.fa-duotone.fa-earth:after,.fa-duotone.fa-globe-americas:after,.fad.fa-earth-america:after,.fad.fa-earth-americas:after,.fad.fa-earth:after,.fad.fa-globe-americas:after{content:"\f57d\f57d"}.fa-duotone.fa-crate-apple:after,.fad.fa-crate-apple:after{content:"\f6b1\f6b1"}.fa-duotone.fa-apple-crate:after,.fad.fa-apple-crate:after{content:"\f6b1\f6b1"}.fa-duotone.fa-person-burst:after,.fad.fa-person-burst:after{content:"\e53b\e53b"}.fa-duotone.fa-game-board:after,.fad.fa-game-board:after{content:"\f867\f867"}.fa-duotone.fa-hat-chef:after,.fad.fa-hat-chef:after{content:"\f86b\f86b"}.fa-duotone.fa-hand-back-point-right:after,.fad.fa-hand-back-point-right:after{content:"\e1a1\e1a1"}.fa-duotone.fa-dove:after,.fad.fa-dove:after{content:"\f4ba\f4ba"}.fa-duotone.fa-snowflake-droplets:after,.fad.fa-snowflake-droplets:after{content:"\e5c1\e5c1"}.fa-duotone.fa-battery-0:after,.fa-duotone.fa-battery-empty:after,.fad.fa-battery-0:after,.fad.fa-battery-empty:after{content:"\f244\f244"}.fa-duotone.fa-grid-4:after,.fad.fa-grid-4:after{content:"\e198\e198"}.fa-duotone.fa-socks:after,.fad.fa-socks:after{content:"\f696\f696"}.fa-duotone.fa-face-sunglasses:after,.fad.fa-face-sunglasses:after{content:"\e398\e398"}.fa-duotone.fa-inbox:after,.fad.fa-inbox:after{content:"\f01c\f01c"}.fa-duotone.fa-square-0:after,.fad.fa-square-0:after{content:"\e255\e255"}.fa-duotone.fa-section:after,.fad.fa-section:after{content:"\e447\e447"}.fa-duotone.fa-box-up:after,.fa-duotone.fa-square-this-way-up:after,.fad.fa-box-up:after,.fad.fa-square-this-way-up:after{content:"\f49f\f49f"}.fa-duotone.fa-gauge-high:after,.fa-duotone.fa-tachometer-alt-fast:after,.fa-duotone.fa-tachometer-alt:after,.fad.fa-gauge-high:after,.fad.fa-tachometer-alt-fast:after,.fad.fa-tachometer-alt:after{content:"\f625\f625"}.fa-duotone.fa-square-ampersand:after,.fad.fa-square-ampersand:after{content:"\e260\e260"}.fa-duotone.fa-envelope-open-text:after,.fad.fa-envelope-open-text:after{content:"\f658\f658"}.fa-duotone.fa-lamp-desk:after,.fad.fa-lamp-desk:after{content:"\e014\e014"}.fa-duotone.fa-hospital-alt:after,.fa-duotone.fa-hospital-wide:after,.fa-duotone.fa-hospital:after,.fad.fa-hospital-alt:after,.fad.fa-hospital-wide:after,.fad.fa-hospital:after{content:"\f0f8\f0f8"}.fa-duotone.fa-poll-people:after,.fad.fa-poll-people:after{content:"\f759\f759"}.fa-duotone.fa-glass-whiskey-rocks:after,.fa-duotone.fa-whiskey-glass-ice:after,.fad.fa-glass-whiskey-rocks:after,.fad.fa-whiskey-glass-ice:after{content:"\f7a1\f7a1"}.fa-duotone.fa-wine-bottle:after,.fad.fa-wine-bottle:after{content:"\f72f\f72f"}.fa-duotone.fa-chess-rook:after,.fad.fa-chess-rook:after{content:"\f447\f447"}.fa-duotone.fa-user-bounty-hunter:after,.fad.fa-user-bounty-hunter:after{content:"\e2bf\e2bf"}.fa-duotone.fa-bars-staggered:after,.fa-duotone.fa-reorder:after,.fa-duotone.fa-stream:after,.fad.fa-bars-staggered:after,.fad.fa-reorder:after,.fad.fa-stream:after{content:"\f550\f550"}.fa-duotone.fa-diagram-sankey:after,.fad.fa-diagram-sankey:after{content:"\e158\e158"}.fa-duotone.fa-cloud-hail-mixed:after,.fad.fa-cloud-hail-mixed:after{content:"\f73a\f73a"}.fa-duotone.fa-circle-up-left:after,.fad.fa-circle-up-left:after{content:"\e128\e128"}.fa-duotone.fa-dharmachakra:after,.fad.fa-dharmachakra:after{content:"\f655\f655"}.fa-duotone.fa-objects-align-left:after,.fad.fa-objects-align-left:after{content:"\e3be\e3be"}.fa-duotone.fa-oil-can-drip:after,.fad.fa-oil-can-drip:after{content:"\e205\e205"}.fa-duotone.fa-face-smiling-hands:after,.fad.fa-face-smiling-hands:after{content:"\e396\e396"}.fa-duotone.fa-broccoli:after,.fad.fa-broccoli:after{content:"\e3e2\e3e2"}.fa-duotone.fa-route-interstate:after,.fad.fa-route-interstate:after{content:"\f61b\f61b"}.fa-duotone.fa-ear-muffs:after,.fad.fa-ear-muffs:after{content:"\f795\f795"}.fa-duotone.fa-hotdog:after,.fad.fa-hotdog:after{content:"\f80f\f80f"}.fa-duotone.fa-transporter-empty:after,.fad.fa-transporter-empty:after{content:"\e046\e046"}.fa-duotone.fa-blind:after,.fa-duotone.fa-person-walking-with-cane:after,.fad.fa-blind:after,.fad.fa-person-walking-with-cane:after{content:"\f29d\f29d"}.fa-duotone.fa-angle-90:after,.fad.fa-angle-90:after{content:"\e08d\e08d"}.fa-duotone.fa-rectangle-terminal:after,.fad.fa-rectangle-terminal:after{content:"\e236\e236"}.fa-duotone.fa-kite:after,.fad.fa-kite:after{content:"\f6f4\f6f4"}.fa-duotone.fa-drum:after,.fad.fa-drum:after{content:"\f569\f569"}.fa-duotone.fa-scrubber:after,.fad.fa-scrubber:after{content:"\f2f8\f2f8"}.fa-duotone.fa-ice-cream:after,.fad.fa-ice-cream:after{content:"\f810\f810"}.fa-duotone.fa-heart-circle-bolt:after,.fad.fa-heart-circle-bolt:after{content:"\e4fc\e4fc"}.fa-duotone.fa-fish-bones:after,.fad.fa-fish-bones:after{content:"\e304\e304"}.fa-duotone.fa-deer-rudolph:after,.fad.fa-deer-rudolph:after{content:"\f78f\f78f"}.fa-duotone.fa-fax:after,.fad.fa-fax:after{content:"\f1ac\f1ac"}.fa-duotone.fa-paragraph:after,.fad.fa-paragraph:after{content:"\f1dd\f1dd"}.fa-duotone.fa-head-side-heart:after,.fad.fa-head-side-heart:after{content:"\e1aa\e1aa"}.fa-duotone.fa-square-e:after,.fad.fa-square-e:after{content:"\e26d\e26d"}.fa-duotone.fa-meter-fire:after,.fad.fa-meter-fire:after{content:"\e1eb\e1eb"}.fa-duotone.fa-cloud-hail:after,.fad.fa-cloud-hail:after{content:"\f739\f739"}.fa-duotone.fa-check-to-slot:after,.fa-duotone.fa-vote-yea:after,.fad.fa-check-to-slot:after,.fad.fa-vote-yea:after{content:"\f772\f772"}.fa-duotone.fa-money-from-bracket:after,.fad.fa-money-from-bracket:after{content:"\e312\e312"}.fa-duotone.fa-star-half:after,.fad.fa-star-half:after{content:"\f089\f089"}.fa-duotone.fa-car-bus:after,.fad.fa-car-bus:after{content:"\f85a\f85a"}.fa-duotone.fa-speaker:after,.fad.fa-speaker:after{content:"\f8df\f8df"}.fa-duotone.fa-timer:after,.fad.fa-timer:after{content:"\e29e\e29e"}.fa-duotone.fa-boxes-alt:after,.fa-duotone.fa-boxes-stacked:after,.fa-duotone.fa-boxes:after,.fad.fa-boxes-alt:after,.fad.fa-boxes-stacked:after,.fad.fa-boxes:after{content:"\f468\f468"}.fa-duotone.fa-grill-hot:after,.fad.fa-grill-hot:after{content:"\e5a5\e5a5"}.fa-duotone.fa-ballot-check:after,.fad.fa-ballot-check:after{content:"\f733\f733"}.fa-duotone.fa-chain:after,.fa-duotone.fa-link:after,.fad.fa-chain:after,.fad.fa-link:after{content:"\f0c1\f0c1"}.fa-duotone.fa-assistive-listening-systems:after,.fa-duotone.fa-ear-listen:after,.fad.fa-assistive-listening-systems:after,.fad.fa-ear-listen:after{content:"\f2a2\f2a2"}.fa-duotone.fa-file-minus:after,.fad.fa-file-minus:after{content:"\f318\f318"}.fa-duotone.fa-tree-city:after,.fad.fa-tree-city:after{content:"\e587\e587"}.fa-duotone.fa-play:after,.fad.fa-play:after{content:"\f04b\f04b"}.fa-duotone.fa-font:after,.fad.fa-font:after{content:"\f031\f031"}.fa-duotone.fa-coffee-togo:after,.fa-duotone.fa-cup-togo:after,.fad.fa-coffee-togo:after,.fad.fa-cup-togo:after{content:"\f6c5\f6c5"}.fa-duotone.fa-square-down-left:after,.fad.fa-square-down-left:after{content:"\e26b\e26b"}.fa-duotone.fa-burger-lettuce:after,.fad.fa-burger-lettuce:after{content:"\e3e3\e3e3"}.fa-duotone.fa-rupiah-sign:after,.fad.fa-rupiah-sign:after{content:"\e23d\e23d"}.fa-duotone.fa-magnifying-glass:after,.fa-duotone.fa-search:after,.fad.fa-magnifying-glass:after,.fad.fa-search:after{content:"\f002\f002"}.fa-duotone.fa-ping-pong-paddle-ball:after,.fa-duotone.fa-table-tennis-paddle-ball:after,.fa-duotone.fa-table-tennis:after,.fad.fa-ping-pong-paddle-ball:after,.fad.fa-table-tennis-paddle-ball:after,.fad.fa-table-tennis:after{content:"\f45d\f45d"}.fa-duotone.fa-diagnoses:after,.fa-duotone.fa-person-dots-from-line:after,.fad.fa-diagnoses:after,.fad.fa-person-dots-from-line:after{content:"\f470\f470"}.fa-duotone.fa-chevron-double-down:after,.fa-duotone.fa-chevrons-down:after,.fad.fa-chevron-double-down:after,.fad.fa-chevrons-down:after{content:"\f322\f322"}.fa-duotone.fa-trash-can-arrow-up:after,.fa-duotone.fa-trash-restore-alt:after,.fad.fa-trash-can-arrow-up:after,.fad.fa-trash-restore-alt:after{content:"\f82a\f82a"}.fa-duotone.fa-signal-3:after,.fa-duotone.fa-signal-good:after,.fad.fa-signal-3:after,.fad.fa-signal-good:after{content:"\f68e\f68e"}.fa-duotone.fa-location-question:after,.fa-duotone.fa-map-marker-question:after,.fad.fa-location-question:after,.fad.fa-map-marker-question:after{content:"\f60b\f60b"}.fa-duotone.fa-floppy-disk-circle-xmark:after,.fa-duotone.fa-floppy-disk-times:after,.fa-duotone.fa-save-circle-xmark:after,.fa-duotone.fa-save-times:after,.fad.fa-floppy-disk-circle-xmark:after,.fad.fa-floppy-disk-times:after,.fad.fa-save-circle-xmark:after,.fad.fa-save-times:after{content:"\e181\e181"}.fa-duotone.fa-naira-sign:after,.fad.fa-naira-sign:after{content:"\e1f6\e1f6"}.fa-duotone.fa-peach:after,.fad.fa-peach:after{content:"\e20b\e20b"}.fa-duotone.fa-taxi-bus:after,.fad.fa-taxi-bus:after{content:"\e298\e298"}.fa-duotone.fa-bracket-curly-left:after,.fa-duotone.fa-bracket-curly:after,.fad.fa-bracket-curly-left:after,.fad.fa-bracket-curly:after{content:"\7b\7b"}.fa-duotone.fa-lobster:after,.fad.fa-lobster:after{content:"\e421\e421"}.fa-duotone.fa-cart-flatbed-empty:after,.fa-duotone.fa-dolly-flatbed-empty:after,.fad.fa-cart-flatbed-empty:after,.fad.fa-dolly-flatbed-empty:after{content:"\f476\f476"}.fa-duotone.fa-colon:after,.fad.fa-colon:after{content:"\3a\3a"}.fa-duotone.fa-cart-arrow-down:after,.fad.fa-cart-arrow-down:after{content:"\f218\f218"}.fa-duotone.fa-wand:after,.fad.fa-wand:after{content:"\f72a\f72a"}.fa-duotone.fa-walkie-talkie:after,.fad.fa-walkie-talkie:after{content:"\f8ef\f8ef"}.fa-duotone.fa-file-edit:after,.fa-duotone.fa-file-pen:after,.fad.fa-file-edit:after,.fad.fa-file-pen:after{content:"\f31c\f31c"}.fa-duotone.fa-receipt:after,.fad.fa-receipt:after{content:"\f543\f543"}.fa-duotone.fa-table-picnic:after,.fad.fa-table-picnic:after{content:"\e32d\e32d"}.fa-duotone.fa-pen-square:after,.fa-duotone.fa-pencil-square:after,.fa-duotone.fa-square-pen:after,.fad.fa-pen-square:after,.fad.fa-pencil-square:after,.fad.fa-square-pen:after{content:"\f14b\f14b"}.fa-duotone.fa-circle-microphone-lines:after,.fa-duotone.fa-microphone-circle-alt:after,.fad.fa-circle-microphone-lines:after,.fad.fa-microphone-circle-alt:after{content:"\e117\e117"}.fa-duotone.fa-desktop-slash:after,.fa-duotone.fa-display-slash:after,.fad.fa-desktop-slash:after,.fad.fa-display-slash:after{content:"\e2fa\e2fa"}.fa-duotone.fa-suitcase-rolling:after,.fad.fa-suitcase-rolling:after{content:"\f5c1\f5c1"}.fa-duotone.fa-person-circle-exclamation:after,.fad.fa-person-circle-exclamation:after{content:"\e53f\e53f"}.fa-duotone.fa-transporter-2:after,.fad.fa-transporter-2:after{content:"\e044\e044"}.fa-duotone.fa-hand-receiving:after,.fa-duotone.fa-hands-holding-diamond:after,.fad.fa-hand-receiving:after,.fad.fa-hands-holding-diamond:after{content:"\f47c\f47c"}.fa-duotone.fa-money-bill-simple-wave:after,.fad.fa-money-bill-simple-wave:after{content:"\e1f2\e1f2"}.fa-duotone.fa-chevron-down:after,.fad.fa-chevron-down:after{content:"\f078\f078"}.fa-duotone.fa-battery-5:after,.fa-duotone.fa-battery-full:after,.fa-duotone.fa-battery:after,.fad.fa-battery-5:after,.fad.fa-battery-full:after,.fad.fa-battery:after{content:"\f240\f240"}.fa-duotone.fa-bell-plus:after,.fad.fa-bell-plus:after{content:"\f849\f849"}.fa-duotone.fa-book-arrow-right:after,.fad.fa-book-arrow-right:after{content:"\e0b9\e0b9"}.fa-duotone.fa-hospitals:after,.fad.fa-hospitals:after{content:"\f80e\f80e"}.fa-duotone.fa-club:after,.fad.fa-club:after{content:"\f327\f327"}.fa-duotone.fa-skull-crossbones:after,.fad.fa-skull-crossbones:after{content:"\f714\f714"}.fa-duotone.fa-dewpoint:after,.fa-duotone.fa-droplet-degree:after,.fad.fa-dewpoint:after,.fad.fa-droplet-degree:after{content:"\f748\f748"}.fa-duotone.fa-code-compare:after,.fad.fa-code-compare:after{content:"\e13a\e13a"}.fa-duotone.fa-list-dots:after,.fa-duotone.fa-list-ul:after,.fad.fa-list-dots:after,.fad.fa-list-ul:after{content:"\f0ca\f0ca"}.fa-duotone.fa-hand-holding-magic:after,.fad.fa-hand-holding-magic:after{content:"\f6e5\f6e5"}.fa-duotone.fa-watermelon-slice:after,.fad.fa-watermelon-slice:after{content:"\e337\e337"}.fa-duotone.fa-circle-ellipsis:after,.fad.fa-circle-ellipsis:after{content:"\e10a\e10a"}.fa-duotone.fa-school-lock:after,.fad.fa-school-lock:after{content:"\e56f\e56f"}.fa-duotone.fa-tower-cell:after,.fad.fa-tower-cell:after{content:"\e585\e585"}.fa-duotone.fa-sd-cards:after,.fad.fa-sd-cards:after{content:"\e240\e240"}.fa-duotone.fa-jug-bottle:after,.fad.fa-jug-bottle:after{content:"\e5fb\e5fb"}.fa-duotone.fa-down-long:after,.fa-duotone.fa-long-arrow-alt-down:after,.fad.fa-down-long:after,.fad.fa-long-arrow-alt-down:after{content:"\f309\f309"}.fa-duotone.fa-envelopes:after,.fad.fa-envelopes:after{content:"\e170\e170"}.fa-duotone.fa-phone-office:after,.fad.fa-phone-office:after{content:"\f67d\f67d"}.fa-duotone.fa-ranking-star:after,.fad.fa-ranking-star:after{content:"\e561\e561"}.fa-duotone.fa-chess-king:after,.fad.fa-chess-king:after{content:"\f43f\f43f"}.fa-duotone.fa-nfc-pen:after,.fad.fa-nfc-pen:after{content:"\e1fa\e1fa"}.fa-duotone.fa-person-harassing:after,.fad.fa-person-harassing:after{content:"\e549\e549"}.fa-duotone.fa-hat-winter:after,.fad.fa-hat-winter:after{content:"\f7a8\f7a8"}.fa-duotone.fa-brazilian-real-sign:after,.fad.fa-brazilian-real-sign:after{content:"\e46c\e46c"}.fa-duotone.fa-landmark-alt:after,.fa-duotone.fa-landmark-dome:after,.fad.fa-landmark-alt:after,.fad.fa-landmark-dome:after{content:"\f752\f752"}.fa-duotone.fa-bone-break:after,.fad.fa-bone-break:after{content:"\f5d8\f5d8"}.fa-duotone.fa-arrow-up:after,.fad.fa-arrow-up:after{content:"\f062\f062"}.fa-duotone.fa-down-from-dotted-line:after,.fad.fa-down-from-dotted-line:after{content:"\e407\e407"}.fa-duotone.fa-television:after,.fa-duotone.fa-tv-alt:after,.fa-duotone.fa-tv:after,.fad.fa-television:after,.fad.fa-tv-alt:after,.fad.fa-tv:after{content:"\f26c\f26c"}.fa-duotone.fa-border-left:after,.fad.fa-border-left:after{content:"\f84f\f84f"}.fa-duotone.fa-circle-divide:after,.fad.fa-circle-divide:after{content:"\e106\e106"}.fa-duotone.fa-shrimp:after,.fad.fa-shrimp:after{content:"\e448\e448"}.fa-duotone.fa-list-check:after,.fa-duotone.fa-tasks:after,.fad.fa-list-check:after,.fad.fa-tasks:after{content:"\f0ae\f0ae"}.fa-duotone.fa-diagram-subtask:after,.fad.fa-diagram-subtask:after{content:"\e479\e479"}.fa-duotone.fa-jug-detergent:after,.fad.fa-jug-detergent:after{content:"\e519\e519"}.fa-duotone.fa-circle-user:after,.fa-duotone.fa-user-circle:after,.fad.fa-circle-user:after,.fad.fa-user-circle:after{content:"\f2bd\f2bd"}.fa-duotone.fa-square-y:after,.fad.fa-square-y:after{content:"\e287\e287"}.fa-duotone.fa-user-doctor-hair:after,.fad.fa-user-doctor-hair:after{content:"\e458\e458"}.fa-duotone.fa-planet-ringed:after,.fad.fa-planet-ringed:after{content:"\e020\e020"}.fa-duotone.fa-mushroom:after,.fad.fa-mushroom:after{content:"\e425\e425"}.fa-duotone.fa-user-shield:after,.fad.fa-user-shield:after{content:"\f505\f505"}.fa-duotone.fa-megaphone:after,.fad.fa-megaphone:after{content:"\f675\f675"}.fa-duotone.fa-wreath-laurel:after,.fad.fa-wreath-laurel:after{content:"\e5d2\e5d2"}.fa-duotone.fa-circle-exclamation-check:after,.fad.fa-circle-exclamation-check:after{content:"\e10d\e10d"}.fa-duotone.fa-wind:after,.fad.fa-wind:after{content:"\f72e\f72e"}.fa-duotone.fa-box-dollar:after,.fa-duotone.fa-box-usd:after,.fad.fa-box-dollar:after,.fad.fa-box-usd:after{content:"\f4a0\f4a0"}.fa-duotone.fa-car-burst:after,.fa-duotone.fa-car-crash:after,.fad.fa-car-burst:after,.fad.fa-car-crash:after{content:"\f5e1\f5e1"}.fa-duotone.fa-y:after,.fad.fa-y:after{content:"\59\59"}.fa-duotone.fa-user-headset:after,.fad.fa-user-headset:after{content:"\f82d\f82d"}.fa-duotone.fa-arrows-retweet:after,.fa-duotone.fa-retweet-alt:after,.fad.fa-arrows-retweet:after,.fad.fa-retweet-alt:after{content:"\f361\f361"}.fa-duotone.fa-person-snowboarding:after,.fa-duotone.fa-snowboarding:after,.fad.fa-person-snowboarding:after,.fad.fa-snowboarding:after{content:"\f7ce\f7ce"}.fa-duotone.fa-chevron-square-right:after,.fa-duotone.fa-square-chevron-right:after,.fad.fa-chevron-square-right:after,.fad.fa-square-chevron-right:after{content:"\f32b\f32b"}.fa-duotone.fa-lacrosse-stick-ball:after,.fad.fa-lacrosse-stick-ball:after{content:"\e3b6\e3b6"}.fa-duotone.fa-shipping-fast:after,.fa-duotone.fa-truck-fast:after,.fad.fa-shipping-fast:after,.fad.fa-truck-fast:after{content:"\f48b\f48b"}.fa-duotone.fa-user-magnifying-glass:after,.fad.fa-user-magnifying-glass:after{content:"\e5c5\e5c5"}.fa-duotone.fa-star-sharp:after,.fad.fa-star-sharp:after{content:"\e28b\e28b"}.fa-duotone.fa-comment-heart:after,.fad.fa-comment-heart:after{content:"\e5c8\e5c8"}.fa-duotone.fa-circle-1:after,.fad.fa-circle-1:after{content:"\e0ee\e0ee"}.fa-duotone.fa-circle-star:after,.fa-duotone.fa-star-circle:after,.fad.fa-circle-star:after,.fad.fa-star-circle:after{content:"\e123\e123"}.fa-duotone.fa-fish:after,.fad.fa-fish:after{content:"\f578\f578"}.fa-duotone.fa-cloud-fog:after,.fa-duotone.fa-fog:after,.fad.fa-cloud-fog:after,.fad.fa-fog:after{content:"\f74e\f74e"}.fa-duotone.fa-waffle:after,.fad.fa-waffle:after{content:"\e466\e466"}.fa-duotone.fa-music-alt:after,.fa-duotone.fa-music-note:after,.fad.fa-music-alt:after,.fad.fa-music-note:after{content:"\f8cf\f8cf"}.fa-duotone.fa-hexagon-exclamation:after,.fad.fa-hexagon-exclamation:after{content:"\e417\e417"}.fa-duotone.fa-cart-shopping-fast:after,.fad.fa-cart-shopping-fast:after{content:"\e0dc\e0dc"}.fa-duotone.fa-object-union:after,.fad.fa-object-union:after{content:"\e49f\e49f"}.fa-duotone.fa-user-graduate:after,.fad.fa-user-graduate:after{content:"\f501\f501"}.fa-duotone.fa-starfighter:after,.fad.fa-starfighter:after{content:"\e037\e037"}.fa-duotone.fa-adjust:after,.fa-duotone.fa-circle-half-stroke:after,.fad.fa-adjust:after,.fad.fa-circle-half-stroke:after{content:"\f042\f042"}.fa-duotone.fa-arrow-right-long-to-line:after,.fad.fa-arrow-right-long-to-line:after{content:"\e3d5\e3d5"}.fa-duotone.fa-arrow-square-down:after,.fa-duotone.fa-square-arrow-down:after,.fad.fa-arrow-square-down:after,.fad.fa-square-arrow-down:after{content:"\f339\f339"}.fa-duotone.fa-diamond-half-stroke:after,.fad.fa-diamond-half-stroke:after{content:"\e5b8\e5b8"}.fa-duotone.fa-clapperboard:after,.fad.fa-clapperboard:after{content:"\e131\e131"}.fa-duotone.fa-chevron-square-left:after,.fa-duotone.fa-square-chevron-left:after,.fad.fa-chevron-square-left:after,.fad.fa-square-chevron-left:after{content:"\f32a\f32a"}.fa-duotone.fa-phone-intercom:after,.fad.fa-phone-intercom:after{content:"\e434\e434"}.fa-duotone.fa-chain-horizontal:after,.fa-duotone.fa-link-horizontal:after,.fad.fa-chain-horizontal:after,.fad.fa-link-horizontal:after{content:"\e1cb\e1cb"}.fa-duotone.fa-mango:after,.fad.fa-mango:after{content:"\e30f\e30f"}.fa-duotone.fa-music-alt-slash:after,.fa-duotone.fa-music-note-slash:after,.fad.fa-music-alt-slash:after,.fad.fa-music-note-slash:after{content:"\f8d0\f8d0"}.fa-duotone.fa-circle-radiation:after,.fa-duotone.fa-radiation-alt:after,.fad.fa-circle-radiation:after,.fad.fa-radiation-alt:after{content:"\f7ba\f7ba"}.fa-duotone.fa-face-tongue-sweat:after,.fad.fa-face-tongue-sweat:after{content:"\e39e\e39e"}.fa-duotone.fa-globe-stand:after,.fad.fa-globe-stand:after{content:"\f5f6\f5f6"}.fa-duotone.fa-baseball-ball:after,.fa-duotone.fa-baseball:after,.fad.fa-baseball-ball:after,.fad.fa-baseball:after{content:"\f433\f433"}.fa-duotone.fa-circle-p:after,.fad.fa-circle-p:after{content:"\e11a\e11a"}.fa-duotone.fa-award-simple:after,.fad.fa-award-simple:after{content:"\e0ab\e0ab"}.fa-duotone.fa-jet-fighter-up:after,.fad.fa-jet-fighter-up:after{content:"\e518\e518"}.fa-duotone.fa-diagram-project:after,.fa-duotone.fa-project-diagram:after,.fad.fa-diagram-project:after,.fad.fa-project-diagram:after{content:"\f542\f542"}.fa-duotone.fa-pedestal:after,.fad.fa-pedestal:after{content:"\e20d\e20d"}.fa-duotone.fa-chart-pyramid:after,.fad.fa-chart-pyramid:after{content:"\e0e6\e0e6"}.fa-duotone.fa-sidebar:after,.fad.fa-sidebar:after{content:"\e24e\e24e"}.fa-duotone.fa-frosty-head:after,.fa-duotone.fa-snowman-head:after,.fad.fa-frosty-head:after,.fad.fa-snowman-head:after{content:"\f79b\f79b"}.fa-duotone.fa-copy:after,.fad.fa-copy:after{content:"\f0c5\f0c5"}.fa-duotone.fa-burger-glass:after,.fad.fa-burger-glass:after{content:"\e0ce\e0ce"}.fa-duotone.fa-volume-mute:after,.fa-duotone.fa-volume-times:after,.fa-duotone.fa-volume-xmark:after,.fad.fa-volume-mute:after,.fad.fa-volume-times:after,.fad.fa-volume-xmark:after{content:"\f6a9\f6a9"}.fa-duotone.fa-hand-sparkles:after,.fad.fa-hand-sparkles:after{content:"\e05d\e05d"}.fa-duotone.fa-bars-filter:after,.fad.fa-bars-filter:after{content:"\e0ad\e0ad"}.fa-duotone.fa-paintbrush-pencil:after,.fad.fa-paintbrush-pencil:after{content:"\e206\e206"}.fa-duotone.fa-party-bell:after,.fad.fa-party-bell:after{content:"\e31a\e31a"}.fa-duotone.fa-user-vneck-hair:after,.fad.fa-user-vneck-hair:after{content:"\e462\e462"}.fa-duotone.fa-jack-o-lantern:after,.fad.fa-jack-o-lantern:after{content:"\f30e\f30e"}.fa-duotone.fa-grip-horizontal:after,.fa-duotone.fa-grip:after,.fad.fa-grip-horizontal:after,.fad.fa-grip:after{content:"\f58d\f58d"}.fa-duotone.fa-share-from-square:after,.fa-duotone.fa-share-square:after,.fad.fa-share-from-square:after,.fad.fa-share-square:after{content:"\f14d\f14d"}.fa-duotone.fa-keynote:after,.fad.fa-keynote:after{content:"\f66c\f66c"}.fa-duotone.fa-child-combatant:after,.fa-duotone.fa-child-rifle:after,.fad.fa-child-combatant:after,.fad.fa-child-rifle:after{content:"\e4e0\e4e0"}.fa-duotone.fa-gun:after,.fad.fa-gun:after{content:"\e19b\e19b"}.fa-duotone.fa-phone-square:after,.fa-duotone.fa-square-phone:after,.fad.fa-phone-square:after,.fad.fa-square-phone:after{content:"\f098\f098"}.fa-duotone.fa-hat-beach:after,.fad.fa-hat-beach:after{content:"\e606\e606"}.fa-duotone.fa-add:after,.fa-duotone.fa-plus:after,.fad.fa-add:after,.fad.fa-plus:after{content:"\2b\2b"}.fa-duotone.fa-expand:after,.fad.fa-expand:after{content:"\f065\f065"}.fa-duotone.fa-computer:after,.fad.fa-computer:after{content:"\e4e5\e4e5"}.fa-duotone.fa-fort:after,.fad.fa-fort:after{content:"\e486\e486"}.fa-duotone.fa-cloud-check:after,.fad.fa-cloud-check:after{content:"\e35c\e35c"}.fa-duotone.fa-close:after,.fa-duotone.fa-multiply:after,.fa-duotone.fa-remove:after,.fa-duotone.fa-times:after,.fa-duotone.fa-xmark:after,.fad.fa-close:after,.fad.fa-multiply:after,.fad.fa-remove:after,.fad.fa-times:after,.fad.fa-xmark:after{content:"\f00d\f00d"}.fa-duotone.fa-face-smirking:after,.fad.fa-face-smirking:after{content:"\e397\e397"}.fa-duotone.fa-arrows-up-down-left-right:after,.fa-duotone.fa-arrows:after,.fad.fa-arrows-up-down-left-right:after,.fad.fa-arrows:after{content:"\f047\f047"}.fa-duotone.fa-chalkboard-teacher:after,.fa-duotone.fa-chalkboard-user:after,.fad.fa-chalkboard-teacher:after,.fad.fa-chalkboard-user:after{content:"\f51c\f51c"}.fa-duotone.fa-rhombus:after,.fad.fa-rhombus:after{content:"\e23b\e23b"}.fa-duotone.fa-claw-marks:after,.fad.fa-claw-marks:after{content:"\f6c2\f6c2"}.fa-duotone.fa-peso-sign:after,.fad.fa-peso-sign:after{content:"\e222\e222"}.fa-duotone.fa-face-smile-tongue:after,.fad.fa-face-smile-tongue:after{content:"\e394\e394"}.fa-duotone.fa-cart-circle-xmark:after,.fad.fa-cart-circle-xmark:after{content:"\e3f4\e3f4"}.fa-duotone.fa-building-shield:after,.fad.fa-building-shield:after{content:"\e4d8\e4d8"}.fa-duotone.fa-circle-phone-flip:after,.fa-duotone.fa-phone-circle-alt:after,.fad.fa-circle-phone-flip:after,.fad.fa-phone-circle-alt:after{content:"\e11c\e11c"}.fa-duotone.fa-baby:after,.fad.fa-baby:after{content:"\f77c\f77c"}.fa-duotone.fa-users-line:after,.fad.fa-users-line:after{content:"\e592\e592"}.fa-duotone.fa-quote-left-alt:after,.fa-duotone.fa-quote-left:after,.fad.fa-quote-left-alt:after,.fad.fa-quote-left:after{content:"\f10d\f10d"}.fa-duotone.fa-tractor:after,.fad.fa-tractor:after{content:"\f722\f722"}.fa-duotone.fa-key-skeleton:after,.fad.fa-key-skeleton:after{content:"\f6f3\f6f3"}.fa-duotone.fa-trash-arrow-up:after,.fa-duotone.fa-trash-restore:after,.fad.fa-trash-arrow-up:after,.fad.fa-trash-restore:after{content:"\f829\f829"}.fa-duotone.fa-arrow-down-up-lock:after,.fad.fa-arrow-down-up-lock:after{content:"\e4b0\e4b0"}.fa-duotone.fa-arrow-down-to-bracket:after,.fad.fa-arrow-down-to-bracket:after{content:"\e094\e094"}.fa-duotone.fa-lines-leaning:after,.fad.fa-lines-leaning:after{content:"\e51e\e51e"}.fa-duotone.fa-square-q:after,.fad.fa-square-q:after{content:"\e27b\e27b"}.fa-duotone.fa-ruler-combined:after,.fad.fa-ruler-combined:after{content:"\f546\f546"}.fa-duotone.fa-icons-alt:after,.fa-duotone.fa-symbols:after,.fad.fa-icons-alt:after,.fad.fa-symbols:after{content:"\f86e\f86e"}.fa-duotone.fa-copyright:after,.fad.fa-copyright:after{content:"\f1f9\f1f9"}.fa-duotone.fa-flask-gear:after,.fad.fa-flask-gear:after{content:"\e5f1\e5f1"}.fa-duotone.fa-highlighter-line:after,.fad.fa-highlighter-line:after{content:"\e1af\e1af"}.fa-duotone.fa-bracket-left:after,.fa-duotone.fa-bracket-square:after,.fa-duotone.fa-bracket:after,.fad.fa-bracket-left:after,.fad.fa-bracket-square:after,.fad.fa-bracket:after{content:"\5b\5b"}.fa-duotone.fa-island-tree-palm:after,.fa-duotone.fa-island-tropical:after,.fad.fa-island-tree-palm:after,.fad.fa-island-tropical:after{content:"\f811\f811"}.fa-duotone.fa-arrow-from-left:after,.fa-duotone.fa-arrow-right-from-line:after,.fad.fa-arrow-from-left:after,.fad.fa-arrow-right-from-line:after{content:"\f343\f343"}.fa-duotone.fa-h2:after,.fad.fa-h2:after{content:"\f314\f314"}.fa-duotone.fa-equals:after,.fad.fa-equals:after{content:"\3d\3d"}.fa-duotone.fa-cake-slice:after,.fa-duotone.fa-shortcake:after,.fad.fa-cake-slice:after,.fad.fa-shortcake:after{content:"\e3e5\e3e5"}.fa-duotone.fa-peanut:after,.fad.fa-peanut:after{content:"\e430\e430"}.fa-duotone.fa-wrench-simple:after,.fad.fa-wrench-simple:after{content:"\e2d1\e2d1"}.fa-duotone.fa-blender:after,.fad.fa-blender:after{content:"\f517\f517"}.fa-duotone.fa-teeth:after,.fad.fa-teeth:after{content:"\f62e\f62e"}.fa-duotone.fa-tally-2:after,.fad.fa-tally-2:after{content:"\e295\e295"}.fa-duotone.fa-ils:after,.fa-duotone.fa-shekel-sign:after,.fa-duotone.fa-shekel:after,.fa-duotone.fa-sheqel-sign:after,.fa-duotone.fa-sheqel:after,.fad.fa-ils:after,.fad.fa-shekel-sign:after,.fad.fa-shekel:after,.fad.fa-sheqel-sign:after,.fad.fa-sheqel:after{content:"\f20b\f20b"}.fa-duotone.fa-cars:after,.fad.fa-cars:after{content:"\f85b\f85b"}.fa-duotone.fa-axe-battle:after,.fad.fa-axe-battle:after{content:"\f6b3\f6b3"}.fa-duotone.fa-user-hair-long:after,.fad.fa-user-hair-long:after{content:"\e45b\e45b"}.fa-duotone.fa-map:after,.fad.fa-map:after{content:"\f279\f279"}.fa-duotone.fa-arrow-left-from-arc:after,.fad.fa-arrow-left-from-arc:after{content:"\e615\e615"}.fa-duotone.fa-file-circle-info:after,.fad.fa-file-circle-info:after{content:"\e493\e493"}.fa-duotone.fa-face-disappointed:after,.fad.fa-face-disappointed:after{content:"\e36f\e36f"}.fa-duotone.fa-lasso-sparkles:after,.fad.fa-lasso-sparkles:after{content:"\e1c9\e1c9"}.fa-duotone.fa-clock-eleven:after,.fad.fa-clock-eleven:after{content:"\e347\e347"}.fa-duotone.fa-rocket:after,.fad.fa-rocket:after{content:"\f135\f135"}.fa-duotone.fa-siren-on:after,.fad.fa-siren-on:after{content:"\e02e\e02e"}.fa-duotone.fa-clock-ten:after,.fad.fa-clock-ten:after{content:"\e354\e354"}.fa-duotone.fa-candle-holder:after,.fad.fa-candle-holder:after{content:"\f6bc\f6bc"}.fa-duotone.fa-video-arrow-down-left:after,.fad.fa-video-arrow-down-left:after{content:"\e2c8\e2c8"}.fa-duotone.fa-photo-film:after,.fa-duotone.fa-photo-video:after,.fad.fa-photo-film:after,.fad.fa-photo-video:after{content:"\f87c\f87c"}.fa-duotone.fa-floppy-disk-circle-arrow-right:after,.fa-duotone.fa-save-circle-arrow-right:after,.fad.fa-floppy-disk-circle-arrow-right:after,.fad.fa-save-circle-arrow-right:after{content:"\e180\e180"}.fa-duotone.fa-folder-minus:after,.fad.fa-folder-minus:after{content:"\f65d\f65d"}.fa-duotone.fa-planet-moon:after,.fad.fa-planet-moon:after{content:"\e01f\e01f"}.fa-duotone.fa-face-eyes-xmarks:after,.fad.fa-face-eyes-xmarks:after{content:"\e374\e374"}.fa-duotone.fa-chart-scatter:after,.fad.fa-chart-scatter:after{content:"\f7ee\f7ee"}.fa-duotone.fa-display-arrow-down:after,.fad.fa-display-arrow-down:after{content:"\e164\e164"}.fa-duotone.fa-store:after,.fad.fa-store:after{content:"\f54e\f54e"}.fa-duotone.fa-arrow-trend-up:after,.fad.fa-arrow-trend-up:after{content:"\e098\e098"}.fa-duotone.fa-plug-circle-minus:after,.fad.fa-plug-circle-minus:after{content:"\e55e\e55e"}.fa-duotone.fa-olive-branch:after,.fad.fa-olive-branch:after{content:"\e317\e317"}.fa-duotone.fa-angle:after,.fad.fa-angle:after{content:"\e08c\e08c"}.fa-duotone.fa-vacuum-robot:after,.fad.fa-vacuum-robot:after{content:"\e04e\e04e"}.fa-duotone.fa-sign-hanging:after,.fa-duotone.fa-sign:after,.fad.fa-sign-hanging:after,.fad.fa-sign:after{content:"\f4d9\f4d9"}.fa-duotone.fa-square-divide:after,.fad.fa-square-divide:after{content:"\e26a\e26a"}.fa-duotone.fa-signal-stream-slash:after,.fad.fa-signal-stream-slash:after{content:"\e250\e250"}.fa-duotone.fa-bezier-curve:after,.fad.fa-bezier-curve:after{content:"\f55b\f55b"}.fa-duotone.fa-eye-dropper-half:after,.fad.fa-eye-dropper-half:after{content:"\e173\e173"}.fa-duotone.fa-store-lock:after,.fad.fa-store-lock:after{content:"\e4a6\e4a6"}.fa-duotone.fa-bell-slash:after,.fad.fa-bell-slash:after{content:"\f1f6\f1f6"}.fa-duotone.fa-cloud-bolt-sun:after,.fa-duotone.fa-thunderstorm-sun:after,.fad.fa-cloud-bolt-sun:after,.fad.fa-thunderstorm-sun:after{content:"\f76e\f76e"}.fa-duotone.fa-camera-slash:after,.fad.fa-camera-slash:after{content:"\e0d9\e0d9"}.fa-duotone.fa-comment-quote:after,.fad.fa-comment-quote:after{content:"\e14c\e14c"}.fa-duotone.fa-tablet-android:after,.fa-duotone.fa-tablet:after,.fad.fa-tablet-android:after,.fad.fa-tablet:after{content:"\f3fb\f3fb"}.fa-duotone.fa-school-flag:after,.fad.fa-school-flag:after{content:"\e56e\e56e"}.fa-duotone.fa-message-code:after,.fad.fa-message-code:after{content:"\e1df\e1df"}.fa-duotone.fa-glass-half-empty:after,.fa-duotone.fa-glass-half-full:after,.fa-duotone.fa-glass-half:after,.fad.fa-glass-half-empty:after,.fad.fa-glass-half-full:after,.fad.fa-glass-half:after{content:"\e192\e192"}.fa-duotone.fa-fill:after,.fad.fa-fill:after{content:"\f575\f575"}.fa-duotone.fa-comment-alt-minus:after,.fa-duotone.fa-message-minus:after,.fad.fa-comment-alt-minus:after,.fad.fa-message-minus:after{content:"\f4a7\f4a7"}.fa-duotone.fa-angle-up:after,.fad.fa-angle-up:after{content:"\f106\f106"}.fa-duotone.fa-dinosaur:after,.fad.fa-dinosaur:after{content:"\e5fe\e5fe"}.fa-duotone.fa-drumstick-bite:after,.fad.fa-drumstick-bite:after{content:"\f6d7\f6d7"}.fa-duotone.fa-chain-horizontal-slash:after,.fa-duotone.fa-link-horizontal-slash:after,.fad.fa-chain-horizontal-slash:after,.fad.fa-link-horizontal-slash:after{content:"\e1cc\e1cc"}.fa-duotone.fa-holly-berry:after,.fad.fa-holly-berry:after{content:"\f7aa\f7aa"}.fa-duotone.fa-nose:after,.fad.fa-nose:after{content:"\e5bd\e5bd"}.fa-duotone.fa-arrow-left-to-arc:after,.fad.fa-arrow-left-to-arc:after{content:"\e616\e616"}.fa-duotone.fa-chevron-left:after,.fad.fa-chevron-left:after{content:"\f053\f053"}.fa-duotone.fa-bacteria:after,.fad.fa-bacteria:after{content:"\e059\e059"}.fa-duotone.fa-clouds:after,.fad.fa-clouds:after{content:"\f744\f744"}.fa-duotone.fa-money-bill-simple:after,.fad.fa-money-bill-simple:after{content:"\e1f1\e1f1"}.fa-duotone.fa-hand-lizard:after,.fad.fa-hand-lizard:after{content:"\f258\f258"}.fa-duotone.fa-table-pivot:after,.fad.fa-table-pivot:after{content:"\e291\e291"}.fa-duotone.fa-filter-slash:after,.fad.fa-filter-slash:after{content:"\e17d\e17d"}.fa-duotone.fa-trash-can-arrow-turn-left:after,.fa-duotone.fa-trash-can-undo:after,.fa-duotone.fa-trash-undo-alt:after,.fad.fa-trash-can-arrow-turn-left:after,.fad.fa-trash-can-undo:after,.fad.fa-trash-undo-alt:after{content:"\f896\f896"}.fa-duotone.fa-notdef:after,.fad.fa-notdef:after{content:"\e1fe\e1fe"}.fa-duotone.fa-disease:after,.fad.fa-disease:after{content:"\f7fa\f7fa"}.fa-duotone.fa-person-to-door:after,.fad.fa-person-to-door:after{content:"\e433\e433"}.fa-duotone.fa-turntable:after,.fad.fa-turntable:after{content:"\f8e4\f8e4"}.fa-duotone.fa-briefcase-medical:after,.fad.fa-briefcase-medical:after{content:"\f469\f469"}.fa-duotone.fa-genderless:after,.fad.fa-genderless:after{content:"\f22d\f22d"}.fa-duotone.fa-chevron-right:after,.fad.fa-chevron-right:after{content:"\f054\f054"}.fa-duotone.fa-signal-1:after,.fa-duotone.fa-signal-weak:after,.fad.fa-signal-1:after,.fad.fa-signal-weak:after{content:"\f68c\f68c"}.fa-duotone.fa-clock-five:after,.fad.fa-clock-five:after{content:"\e349\e349"}.fa-duotone.fa-retweet:after,.fad.fa-retweet:after{content:"\f079\f079"}.fa-duotone.fa-car-alt:after,.fa-duotone.fa-car-rear:after,.fad.fa-car-alt:after,.fad.fa-car-rear:after{content:"\f5de\f5de"}.fa-duotone.fa-pump-soap:after,.fad.fa-pump-soap:after{content:"\e06b\e06b"}.fa-duotone.fa-computer-classic:after,.fad.fa-computer-classic:after{content:"\f8b1\f8b1"}.fa-duotone.fa-frame:after,.fad.fa-frame:after{content:"\e495\e495"}.fa-duotone.fa-video-slash:after,.fad.fa-video-slash:after{content:"\f4e2\f4e2"}.fa-duotone.fa-battery-2:after,.fa-duotone.fa-battery-quarter:after,.fad.fa-battery-2:after,.fad.fa-battery-quarter:after{content:"\f243\f243"}.fa-duotone.fa-ellipsis-h-alt:after,.fa-duotone.fa-ellipsis-stroke:after,.fad.fa-ellipsis-h-alt:after,.fad.fa-ellipsis-stroke:after{content:"\f39b\f39b"}.fa-duotone.fa-radio:after,.fad.fa-radio:after{content:"\f8d7\f8d7"}.fa-duotone.fa-baby-carriage:after,.fa-duotone.fa-carriage-baby:after,.fad.fa-baby-carriage:after,.fad.fa-carriage-baby:after{content:"\f77d\f77d"}.fa-duotone.fa-face-expressionless:after,.fad.fa-face-expressionless:after{content:"\e373\e373"}.fa-duotone.fa-down-to-dotted-line:after,.fad.fa-down-to-dotted-line:after{content:"\e408\e408"}.fa-duotone.fa-cloud-music:after,.fad.fa-cloud-music:after{content:"\f8ae\f8ae"}.fa-duotone.fa-traffic-light:after,.fad.fa-traffic-light:after{content:"\f637\f637"}.fa-duotone.fa-cloud-minus:after,.fad.fa-cloud-minus:after{content:"\e35d\e35d"}.fa-duotone.fa-thermometer:after,.fad.fa-thermometer:after{content:"\f491\f491"}.fa-duotone.fa-shield-minus:after,.fad.fa-shield-minus:after{content:"\e249\e249"}.fa-duotone.fa-vr-cardboard:after,.fad.fa-vr-cardboard:after{content:"\f729\f729"}.fa-duotone.fa-car-tilt:after,.fad.fa-car-tilt:after{content:"\f5e5\f5e5"}.fa-duotone.fa-gauge-circle-minus:after,.fad.fa-gauge-circle-minus:after{content:"\e497\e497"}.fa-duotone.fa-brightness-low:after,.fad.fa-brightness-low:after{content:"\e0ca\e0ca"}.fa-duotone.fa-hand-middle-finger:after,.fad.fa-hand-middle-finger:after{content:"\f806\f806"}.fa-duotone.fa-percent:after,.fa-duotone.fa-percentage:after,.fad.fa-percent:after,.fad.fa-percentage:after{content:"\25\25"}.fa-duotone.fa-truck-moving:after,.fad.fa-truck-moving:after{content:"\f4df\f4df"}.fa-duotone.fa-glass-water-droplet:after,.fad.fa-glass-water-droplet:after{content:"\e4f5\e4f5"}.fa-duotone.fa-conveyor-belt:after,.fad.fa-conveyor-belt:after{content:"\f46e\f46e"}.fa-duotone.fa-location-check:after,.fa-duotone.fa-map-marker-check:after,.fad.fa-location-check:after,.fad.fa-map-marker-check:after{content:"\f606\f606"}.fa-duotone.fa-coin-vertical:after,.fad.fa-coin-vertical:after{content:"\e3fd\e3fd"}.fa-duotone.fa-display:after,.fad.fa-display:after{content:"\e163\e163"}.fa-duotone.fa-person-sign:after,.fad.fa-person-sign:after{content:"\f757\f757"}.fa-duotone.fa-face-smile:after,.fa-duotone.fa-smile:after,.fad.fa-face-smile:after,.fad.fa-smile:after{content:"\f118\f118"}.fa-duotone.fa-phone-hangup:after,.fad.fa-phone-hangup:after{content:"\e225\e225"}.fa-duotone.fa-signature-slash:after,.fad.fa-signature-slash:after{content:"\e3cb\e3cb"}.fa-duotone.fa-thumb-tack:after,.fa-duotone.fa-thumbtack:after,.fad.fa-thumb-tack:after,.fad.fa-thumbtack:after{content:"\f08d\f08d"}.fa-duotone.fa-wheat-slash:after,.fad.fa-wheat-slash:after{content:"\e339\e339"}.fa-duotone.fa-trophy:after,.fad.fa-trophy:after{content:"\f091\f091"}.fa-duotone.fa-clouds-sun:after,.fad.fa-clouds-sun:after{content:"\f746\f746"}.fa-duotone.fa-person-praying:after,.fa-duotone.fa-pray:after,.fad.fa-person-praying:after,.fad.fa-pray:after{content:"\f683\f683"}.fa-duotone.fa-hammer:after,.fad.fa-hammer:after{content:"\f6e3\f6e3"}.fa-duotone.fa-face-vomit:after,.fad.fa-face-vomit:after{content:"\e3a0\e3a0"}.fa-duotone.fa-speakers:after,.fad.fa-speakers:after{content:"\f8e0\f8e0"}.fa-duotone.fa-teletype-answer:after,.fa-duotone.fa-tty-answer:after,.fad.fa-teletype-answer:after,.fad.fa-tty-answer:after{content:"\e2b9\e2b9"}.fa-duotone.fa-mug-tea-saucer:after,.fad.fa-mug-tea-saucer:after{content:"\e1f5\e1f5"}.fa-duotone.fa-diagram-lean-canvas:after,.fad.fa-diagram-lean-canvas:after{content:"\e156\e156"}.fa-duotone.fa-alt:after,.fad.fa-alt:after{content:"\e08a\e08a"}.fa-duotone.fa-dial-med-high:after,.fa-duotone.fa-dial:after,.fad.fa-dial-med-high:after,.fad.fa-dial:after{content:"\e15b\e15b"}.fa-duotone.fa-hand-peace:after,.fad.fa-hand-peace:after{content:"\f25b\f25b"}.fa-duotone.fa-circle-trash:after,.fa-duotone.fa-trash-circle:after,.fad.fa-circle-trash:after,.fad.fa-trash-circle:after{content:"\e126\e126"}.fa-duotone.fa-rotate:after,.fa-duotone.fa-sync-alt:after,.fad.fa-rotate:after,.fad.fa-sync-alt:after{content:"\f2f1\f2f1"}.fa-duotone.fa-circle-quarters:after,.fad.fa-circle-quarters:after{content:"\e3f8\e3f8"}.fa-duotone.fa-spinner:after,.fad.fa-spinner:after{content:"\f110\f110"}.fa-duotone.fa-tower-control:after,.fad.fa-tower-control:after{content:"\e2a2\e2a2"}.fa-duotone.fa-arrow-up-triangle-square:after,.fa-duotone.fa-sort-shapes-up:after,.fad.fa-arrow-up-triangle-square:after,.fad.fa-sort-shapes-up:after{content:"\f88a\f88a"}.fa-duotone.fa-whale:after,.fad.fa-whale:after{content:"\f72c\f72c"}.fa-duotone.fa-robot:after,.fad.fa-robot:after{content:"\f544\f544"}.fa-duotone.fa-peace:after,.fad.fa-peace:after{content:"\f67c\f67c"}.fa-duotone.fa-party-horn:after,.fad.fa-party-horn:after{content:"\e31b\e31b"}.fa-duotone.fa-cogs:after,.fa-duotone.fa-gears:after,.fad.fa-cogs:after,.fad.fa-gears:after{content:"\f085\f085"}.fa-duotone.fa-sun-alt:after,.fa-duotone.fa-sun-bright:after,.fad.fa-sun-alt:after,.fad.fa-sun-bright:after{content:"\e28f\e28f"}.fa-duotone.fa-warehouse:after,.fad.fa-warehouse:after{content:"\f494\f494"}.fa-duotone.fa-conveyor-belt-arm:after,.fad.fa-conveyor-belt-arm:after{content:"\e5f8\e5f8"}.fa-duotone.fa-lock-keyhole-open:after,.fa-duotone.fa-lock-open-alt:after,.fad.fa-lock-keyhole-open:after,.fad.fa-lock-open-alt:after{content:"\f3c2\f3c2"}.fa-duotone.fa-box-fragile:after,.fa-duotone.fa-square-fragile:after,.fa-duotone.fa-square-wine-glass-crack:after,.fad.fa-box-fragile:after,.fad.fa-square-fragile:after,.fad.fa-square-wine-glass-crack:after{content:"\f49b\f49b"}.fa-duotone.fa-arrow-up-right-dots:after,.fad.fa-arrow-up-right-dots:after{content:"\e4b7\e4b7"}.fa-duotone.fa-square-n:after,.fad.fa-square-n:after{content:"\e277\e277"}.fa-duotone.fa-splotch:after,.fad.fa-splotch:after{content:"\f5bc\f5bc"}.fa-duotone.fa-face-grin-hearts:after,.fa-duotone.fa-grin-hearts:after,.fad.fa-face-grin-hearts:after,.fad.fa-grin-hearts:after{content:"\f584\f584"}.fa-duotone.fa-meter:after,.fad.fa-meter:after{content:"\e1e8\e1e8"}.fa-duotone.fa-mandolin:after,.fad.fa-mandolin:after{content:"\f6f9\f6f9"}.fa-duotone.fa-dice-four:after,.fad.fa-dice-four:after{content:"\f524\f524"}.fa-duotone.fa-sim-card:after,.fad.fa-sim-card:after{content:"\f7c4\f7c4"}.fa-duotone.fa-transgender-alt:after,.fa-duotone.fa-transgender:after,.fad.fa-transgender-alt:after,.fad.fa-transgender:after{content:"\f225\f225"}.fa-duotone.fa-mercury:after,.fad.fa-mercury:after{content:"\f223\f223"}.fa-duotone.fa-up-from-bracket:after,.fad.fa-up-from-bracket:after{content:"\e590\e590"}.fa-duotone.fa-knife-kitchen:after,.fad.fa-knife-kitchen:after{content:"\f6f5\f6f5"}.fa-duotone.fa-border-right:after,.fad.fa-border-right:after{content:"\f852\f852"}.fa-duotone.fa-arrow-turn-down:after,.fa-duotone.fa-level-down:after,.fad.fa-arrow-turn-down:after,.fad.fa-level-down:after{content:"\f149\f149"}.fa-duotone.fa-spade:after,.fad.fa-spade:after{content:"\f2f4\f2f4"}.fa-duotone.fa-card-spade:after,.fad.fa-card-spade:after{content:"\e3ec\e3ec"}.fa-duotone.fa-line-columns:after,.fad.fa-line-columns:after{content:"\f870\f870"}.fa-duotone.fa-arrow-right-to-line:after,.fa-duotone.fa-arrow-to-right:after,.fad.fa-arrow-right-to-line:after,.fad.fa-arrow-to-right:after{content:"\f340\f340"}.fa-duotone.fa-person-falling-burst:after,.fad.fa-person-falling-burst:after{content:"\e547\e547"}.fa-duotone.fa-flag-pennant:after,.fa-duotone.fa-pennant:after,.fad.fa-flag-pennant:after,.fad.fa-pennant:after{content:"\f456\f456"}.fa-duotone.fa-conveyor-belt-empty:after,.fad.fa-conveyor-belt-empty:after{content:"\e150\e150"}.fa-duotone.fa-user-group-simple:after,.fad.fa-user-group-simple:after{content:"\e603\e603"}.fa-duotone.fa-award:after,.fad.fa-award:after{content:"\f559\f559"}.fa-duotone.fa-ticket-alt:after,.fa-duotone.fa-ticket-simple:after,.fad.fa-ticket-alt:after,.fad.fa-ticket-simple:after{content:"\f3ff\f3ff"}.fa-duotone.fa-building:after,.fad.fa-building:after{content:"\f1ad\f1ad"}.fa-duotone.fa-angle-double-left:after,.fa-duotone.fa-angles-left:after,.fad.fa-angle-double-left:after,.fad.fa-angles-left:after{content:"\f100\f100"}.fa-duotone.fa-camcorder:after,.fa-duotone.fa-video-handheld:after,.fad.fa-camcorder:after,.fad.fa-video-handheld:after{content:"\f8a8\f8a8"}.fa-duotone.fa-pancakes:after,.fad.fa-pancakes:after{content:"\e42d\e42d"}.fa-duotone.fa-album-circle-user:after,.fad.fa-album-circle-user:after{content:"\e48d\e48d"}.fa-duotone.fa-subtitles-slash:after,.fad.fa-subtitles-slash:after{content:"\e610\e610"}.fa-duotone.fa-qrcode:after,.fad.fa-qrcode:after{content:"\f029\f029"}.fa-duotone.fa-dice-d10:after,.fad.fa-dice-d10:after{content:"\f6cd\f6cd"}.fa-duotone.fa-fireplace:after,.fad.fa-fireplace:after{content:"\f79a\f79a"}.fa-duotone.fa-browser:after,.fad.fa-browser:after{content:"\f37e\f37e"}.fa-duotone.fa-pen-paintbrush:after,.fa-duotone.fa-pencil-paintbrush:after,.fad.fa-pen-paintbrush:after,.fad.fa-pencil-paintbrush:after{content:"\f618\f618"}.fa-duotone.fa-fish-cooked:after,.fad.fa-fish-cooked:after{content:"\f7fe\f7fe"}.fa-duotone.fa-chair-office:after,.fad.fa-chair-office:after{content:"\f6c1\f6c1"}.fa-duotone.fa-nesting-dolls:after,.fad.fa-nesting-dolls:after{content:"\e3ba\e3ba"}.fa-duotone.fa-clock-rotate-left:after,.fa-duotone.fa-history:after,.fad.fa-clock-rotate-left:after,.fad.fa-history:after{content:"\f1da\f1da"}.fa-duotone.fa-trumpet:after,.fad.fa-trumpet:after{content:"\f8e3\f8e3"}.fa-duotone.fa-face-grin-beam-sweat:after,.fa-duotone.fa-grin-beam-sweat:after,.fad.fa-face-grin-beam-sweat:after,.fad.fa-grin-beam-sweat:after{content:"\f583\f583"}.fa-duotone.fa-fire-smoke:after,.fad.fa-fire-smoke:after{content:"\f74b\f74b"}.fa-duotone.fa-phone-missed:after,.fad.fa-phone-missed:after{content:"\e226\e226"}.fa-duotone.fa-arrow-right-from-file:after,.fa-duotone.fa-file-export:after,.fad.fa-arrow-right-from-file:after,.fad.fa-file-export:after{content:"\f56e\f56e"}.fa-duotone.fa-shield-blank:after,.fa-duotone.fa-shield:after,.fad.fa-shield-blank:after,.fad.fa-shield:after{content:"\f132\f132"}.fa-duotone.fa-arrow-up-short-wide:after,.fa-duotone.fa-sort-amount-up-alt:after,.fad.fa-arrow-up-short-wide:after,.fad.fa-sort-amount-up-alt:after{content:"\f885\f885"}.fa-duotone.fa-arrows-repeat-1:after,.fa-duotone.fa-repeat-1-alt:after,.fad.fa-arrows-repeat-1:after,.fad.fa-repeat-1-alt:after{content:"\f366\f366"}.fa-duotone.fa-gun-slash:after,.fad.fa-gun-slash:after{content:"\e19c\e19c"}.fa-duotone.fa-avocado:after,.fad.fa-avocado:after{content:"\e0aa\e0aa"}.fa-duotone.fa-binary:after,.fad.fa-binary:after{content:"\e33b\e33b"}.fa-duotone.fa-glasses-alt:after,.fa-duotone.fa-glasses-round:after,.fad.fa-glasses-alt:after,.fad.fa-glasses-round:after{content:"\f5f5\f5f5"}.fa-duotone.fa-phone-plus:after,.fad.fa-phone-plus:after{content:"\f4d2\f4d2"}.fa-duotone.fa-ditto:after,.fad.fa-ditto:after{content:"\22\22"}.fa-duotone.fa-person-seat:after,.fad.fa-person-seat:after{content:"\e21e\e21e"}.fa-duotone.fa-house-medical:after,.fad.fa-house-medical:after{content:"\e3b2\e3b2"}.fa-duotone.fa-golf-ball-tee:after,.fa-duotone.fa-golf-ball:after,.fad.fa-golf-ball-tee:after,.fad.fa-golf-ball:after{content:"\f450\f450"}.fa-duotone.fa-chevron-circle-left:after,.fa-duotone.fa-circle-chevron-left:after,.fad.fa-chevron-circle-left:after,.fad.fa-circle-chevron-left:after{content:"\f137\f137"}.fa-duotone.fa-house-chimney-window:after,.fad.fa-house-chimney-window:after{content:"\e00d\e00d"}.fa-duotone.fa-scythe:after,.fad.fa-scythe:after{content:"\f710\f710"}.fa-duotone.fa-pen-nib:after,.fad.fa-pen-nib:after{content:"\f5ad\f5ad"}.fa-duotone.fa-ban-parking:after,.fa-duotone.fa-parking-circle-slash:after,.fad.fa-ban-parking:after,.fad.fa-parking-circle-slash:after{content:"\f616\f616"}.fa-duotone.fa-tent-arrow-turn-left:after,.fad.fa-tent-arrow-turn-left:after{content:"\e580\e580"}.fa-duotone.fa-face-diagonal-mouth:after,.fad.fa-face-diagonal-mouth:after{content:"\e47e\e47e"}.fa-duotone.fa-diagram-cells:after,.fad.fa-diagram-cells:after{content:"\e475\e475"}.fa-duotone.fa-cricket-bat-ball:after,.fa-duotone.fa-cricket:after,.fad.fa-cricket-bat-ball:after,.fad.fa-cricket:after{content:"\f449\f449"}.fa-duotone.fa-tents:after,.fad.fa-tents:after{content:"\e582\e582"}.fa-duotone.fa-magic:after,.fa-duotone.fa-wand-magic:after,.fad.fa-magic:after,.fad.fa-wand-magic:after{content:"\f0d0\f0d0"}.fa-duotone.fa-dog:after,.fad.fa-dog:after{content:"\f6d3\f6d3"}.fa-duotone.fa-pen-line:after,.fad.fa-pen-line:after{content:"\e212\e212"}.fa-duotone.fa-atom-alt:after,.fa-duotone.fa-atom-simple:after,.fad.fa-atom-alt:after,.fad.fa-atom-simple:after{content:"\f5d3\f5d3"}.fa-duotone.fa-ampersand:after,.fad.fa-ampersand:after{content:"\26\26"}.fa-duotone.fa-carrot:after,.fad.fa-carrot:after{content:"\f787\f787"}.fa-duotone.fa-arrow-from-bottom:after,.fa-duotone.fa-arrow-up-from-line:after,.fad.fa-arrow-from-bottom:after,.fad.fa-arrow-up-from-line:after{content:"\f342\f342"}.fa-duotone.fa-moon:after,.fad.fa-moon:after{content:"\f186\f186"}.fa-duotone.fa-pen-slash:after,.fad.fa-pen-slash:after{content:"\e213\e213"}.fa-duotone.fa-wine-glass-alt:after,.fa-duotone.fa-wine-glass-empty:after,.fad.fa-wine-glass-alt:after,.fad.fa-wine-glass-empty:after{content:"\f5ce\f5ce"}.fa-duotone.fa-square-star:after,.fad.fa-square-star:after{content:"\e27f\e27f"}.fa-duotone.fa-cheese:after,.fad.fa-cheese:after{content:"\f7ef\f7ef"}.fa-duotone.fa-send-backward:after,.fad.fa-send-backward:after{content:"\f87f\f87f"}.fa-duotone.fa-yin-yang:after,.fad.fa-yin-yang:after{content:"\f6ad\f6ad"}.fa-duotone.fa-music:after,.fad.fa-music:after{content:"\f001\f001"}.fa-duotone.fa-compass-slash:after,.fad.fa-compass-slash:after{content:"\f5e9\f5e9"}.fa-duotone.fa-clock-one:after,.fad.fa-clock-one:after{content:"\e34e\e34e"}.fa-duotone.fa-file-music:after,.fad.fa-file-music:after{content:"\f8b6\f8b6"}.fa-duotone.fa-code-commit:after,.fad.fa-code-commit:after{content:"\f386\f386"}.fa-duotone.fa-temperature-low:after,.fad.fa-temperature-low:after{content:"\f76b\f76b"}.fa-duotone.fa-biking:after,.fa-duotone.fa-person-biking:after,.fad.fa-biking:after,.fad.fa-person-biking:after{content:"\f84a\f84a"}.fa-duotone.fa-display-chart-up-circle-currency:after,.fad.fa-display-chart-up-circle-currency:after{content:"\e5e5\e5e5"}.fa-duotone.fa-skeleton:after,.fad.fa-skeleton:after{content:"\f620\f620"}.fa-duotone.fa-circle-g:after,.fad.fa-circle-g:after{content:"\e10f\e10f"}.fa-duotone.fa-circle-arrow-up-left:after,.fad.fa-circle-arrow-up-left:after{content:"\e0fb\e0fb"}.fa-duotone.fa-coin-blank:after,.fad.fa-coin-blank:after{content:"\e3fb\e3fb"}.fa-duotone.fa-broom:after,.fad.fa-broom:after{content:"\f51a\f51a"}.fa-duotone.fa-vacuum:after,.fad.fa-vacuum:after{content:"\e04d\e04d"}.fa-duotone.fa-shield-heart:after,.fad.fa-shield-heart:after{content:"\e574\e574"}.fa-duotone.fa-card-heart:after,.fad.fa-card-heart:after{content:"\e3eb\e3eb"}.fa-duotone.fa-lightbulb-cfl-on:after,.fad.fa-lightbulb-cfl-on:after{content:"\e5a7\e5a7"}.fa-duotone.fa-melon:after,.fad.fa-melon:after{content:"\e310\e310"}.fa-duotone.fa-gopuram:after,.fad.fa-gopuram:after{content:"\f664\f664"}.fa-duotone.fa-earth-oceania:after,.fa-duotone.fa-globe-oceania:after,.fad.fa-earth-oceania:after,.fad.fa-globe-oceania:after{content:"\e47b\e47b"}.fa-duotone.fa-container-storage:after,.fad.fa-container-storage:after{content:"\f4b7\f4b7"}.fa-duotone.fa-face-pouting:after,.fad.fa-face-pouting:after{content:"\e387\e387"}.fa-duotone.fa-square-xmark:after,.fa-duotone.fa-times-square:after,.fa-duotone.fa-xmark-square:after,.fad.fa-square-xmark:after,.fad.fa-times-square:after,.fad.fa-xmark-square:after{content:"\f2d3\f2d3"}.fa-duotone.fa-exploding-head:after,.fa-duotone.fa-face-explode:after,.fad.fa-exploding-head:after,.fad.fa-face-explode:after{content:"\e2fe\e2fe"}.fa-duotone.fa-hashtag:after,.fad.fa-hashtag:after{content:"\23\23"}.fa-duotone.fa-expand-alt:after,.fa-duotone.fa-up-right-and-down-left-from-center:after,.fad.fa-expand-alt:after,.fad.fa-up-right-and-down-left-from-center:after{content:"\f424\f424"}.fa-duotone.fa-oil-can:after,.fad.fa-oil-can:after{content:"\f613\f613"}.fa-duotone.fa-t:after,.fad.fa-t:after{content:"\54\54"}.fa-duotone.fa-transformer-bolt:after,.fad.fa-transformer-bolt:after{content:"\e2a4\e2a4"}.fa-duotone.fa-hippo:after,.fad.fa-hippo:after{content:"\f6ed\f6ed"}.fa-duotone.fa-chart-column:after,.fad.fa-chart-column:after{content:"\e0e3\e0e3"}.fa-duotone.fa-cassette-vhs:after,.fa-duotone.fa-vhs:after,.fad.fa-cassette-vhs:after,.fad.fa-vhs:after{content:"\f8ec\f8ec"}.fa-duotone.fa-infinity:after,.fad.fa-infinity:after{content:"\f534\f534"}.fa-duotone.fa-vial-circle-check:after,.fad.fa-vial-circle-check:after{content:"\e596\e596"}.fa-duotone.fa-chimney:after,.fad.fa-chimney:after{content:"\f78b\f78b"}.fa-duotone.fa-object-intersect:after,.fad.fa-object-intersect:after{content:"\e49d\e49d"}.fa-duotone.fa-person-arrow-down-to-line:after,.fad.fa-person-arrow-down-to-line:after{content:"\e538\e538"}.fa-duotone.fa-voicemail:after,.fad.fa-voicemail:after{content:"\f897\f897"}.fa-duotone.fa-block-brick:after,.fa-duotone.fa-wall-brick:after,.fad.fa-block-brick:after,.fad.fa-wall-brick:after{content:"\e3db\e3db"}.fa-duotone.fa-fan:after,.fad.fa-fan:after{content:"\f863\f863"}.fa-duotone.fa-bags-shopping:after,.fad.fa-bags-shopping:after{content:"\f847\f847"}.fa-duotone.fa-paragraph-left:after,.fa-duotone.fa-paragraph-rtl:after,.fad.fa-paragraph-left:after,.fad.fa-paragraph-rtl:after{content:"\f878\f878"}.fa-duotone.fa-person-walking-luggage:after,.fad.fa-person-walking-luggage:after{content:"\e554\e554"}.fa-duotone.fa-caravan-alt:after,.fa-duotone.fa-caravan-simple:after,.fad.fa-caravan-alt:after,.fad.fa-caravan-simple:after{content:"\e000\e000"}.fa-duotone.fa-turtle:after,.fad.fa-turtle:after{content:"\f726\f726"}.fa-duotone.fa-pencil-mechanical:after,.fad.fa-pencil-mechanical:after{content:"\e5ca\e5ca"}.fa-duotone.fa-arrows-alt-v:after,.fa-duotone.fa-up-down:after,.fad.fa-arrows-alt-v:after,.fad.fa-up-down:after{content:"\f338\f338"}.fa-duotone.fa-cloud-moon-rain:after,.fad.fa-cloud-moon-rain:after{content:"\f73c\f73c"}.fa-duotone.fa-booth-curtain:after,.fad.fa-booth-curtain:after{content:"\f734\f734"}.fa-duotone.fa-calendar:after,.fad.fa-calendar:after{content:"\f133\f133"}.fa-duotone.fa-box-heart:after,.fad.fa-box-heart:after{content:"\f49d\f49d"}.fa-duotone.fa-trailer:after,.fad.fa-trailer:after{content:"\e041\e041"}.fa-duotone.fa-user-doctor-message:after,.fa-duotone.fa-user-md-chat:after,.fad.fa-user-doctor-message:after,.fad.fa-user-md-chat:after{content:"\f82e\f82e"}.fa-duotone.fa-bahai:after,.fa-duotone.fa-haykal:after,.fad.fa-bahai:after,.fad.fa-haykal:after{content:"\f666\f666"}.fa-duotone.fa-lighthouse:after,.fad.fa-lighthouse:after{content:"\e612\e612"}.fa-duotone.fa-amp-guitar:after,.fad.fa-amp-guitar:after{content:"\f8a1\f8a1"}.fa-duotone.fa-sd-card:after,.fad.fa-sd-card:after{content:"\f7c2\f7c2"}.fa-duotone.fa-volume-slash:after,.fad.fa-volume-slash:after{content:"\f2e2\f2e2"}.fa-duotone.fa-border-bottom:after,.fad.fa-border-bottom:after{content:"\f84d\f84d"}.fa-duotone.fa-wifi-1:after,.fa-duotone.fa-wifi-weak:after,.fad.fa-wifi-1:after,.fad.fa-wifi-weak:after{content:"\f6aa\f6aa"}.fa-duotone.fa-dragon:after,.fad.fa-dragon:after{content:"\f6d5\f6d5"}.fa-duotone.fa-shoe-prints:after,.fad.fa-shoe-prints:after{content:"\f54b\f54b"}.fa-duotone.fa-circle-plus:after,.fa-duotone.fa-plus-circle:after,.fad.fa-circle-plus:after,.fad.fa-plus-circle:after{content:"\f055\f055"}.fa-duotone.fa-face-grin-tongue-wink:after,.fa-duotone.fa-grin-tongue-wink:after,.fad.fa-face-grin-tongue-wink:after,.fad.fa-grin-tongue-wink:after{content:"\f58b\f58b"}.fa-duotone.fa-hand-holding:after,.fad.fa-hand-holding:after{content:"\f4bd\f4bd"}.fa-duotone.fa-plug-circle-exclamation:after,.fad.fa-plug-circle-exclamation:after{content:"\e55d\e55d"}.fa-duotone.fa-chain-broken:after,.fa-duotone.fa-chain-slash:after,.fa-duotone.fa-link-slash:after,.fa-duotone.fa-unlink:after,.fad.fa-chain-broken:after,.fad.fa-chain-slash:after,.fad.fa-link-slash:after,.fad.fa-unlink:after{content:"\f127\f127"}.fa-duotone.fa-clone:after,.fad.fa-clone:after{content:"\f24d\f24d"}.fa-duotone.fa-person-walking-arrow-loop-left:after,.fad.fa-person-walking-arrow-loop-left:after{content:"\e551\e551"}.fa-duotone.fa-arrow-up-z-a:after,.fa-duotone.fa-sort-alpha-up-alt:after,.fad.fa-arrow-up-z-a:after,.fad.fa-sort-alpha-up-alt:after{content:"\f882\f882"}.fa-duotone.fa-fire-alt:after,.fa-duotone.fa-fire-flame-curved:after,.fad.fa-fire-alt:after,.fad.fa-fire-flame-curved:after{content:"\f7e4\f7e4"}.fa-duotone.fa-tornado:after,.fad.fa-tornado:after{content:"\f76f\f76f"}.fa-duotone.fa-file-circle-plus:after,.fad.fa-file-circle-plus:after{content:"\e494\e494"}.fa-duotone.fa-delete-right:after,.fad.fa-delete-right:after{content:"\e154\e154"}.fa-duotone.fa-book-quran:after,.fa-duotone.fa-quran:after,.fad.fa-book-quran:after,.fad.fa-quran:after{content:"\f687\f687"}.fa-duotone.fa-circle-quarter:after,.fad.fa-circle-quarter:after{content:"\e11f\e11f"}.fa-duotone.fa-anchor:after,.fad.fa-anchor:after{content:"\f13d\f13d"}.fa-duotone.fa-border-all:after,.fad.fa-border-all:after{content:"\f84c\f84c"}.fa-duotone.fa-function:after,.fad.fa-function:after{content:"\f661\f661"}.fa-duotone.fa-angry:after,.fa-duotone.fa-face-angry:after,.fad.fa-angry:after,.fad.fa-face-angry:after{content:"\f556\f556"}.fa-duotone.fa-people-simple:after,.fad.fa-people-simple:after{content:"\e21b\e21b"}.fa-duotone.fa-cookie-bite:after,.fad.fa-cookie-bite:after{content:"\f564\f564"}.fa-duotone.fa-arrow-trend-down:after,.fad.fa-arrow-trend-down:after{content:"\e097\e097"}.fa-duotone.fa-feed:after,.fa-duotone.fa-rss:after,.fad.fa-feed:after,.fad.fa-rss:after{content:"\f09e\f09e"}.fa-duotone.fa-face-monocle:after,.fad.fa-face-monocle:after{content:"\e380\e380"}.fa-duotone.fa-draw-polygon:after,.fad.fa-draw-polygon:after{content:"\f5ee\f5ee"}.fa-duotone.fa-balance-scale:after,.fa-duotone.fa-scale-balanced:after,.fad.fa-balance-scale:after,.fad.fa-scale-balanced:after{content:"\f24e\f24e"}.fa-duotone.fa-calendar-lines:after,.fa-duotone.fa-calendar-note:after,.fad.fa-calendar-lines:after,.fad.fa-calendar-note:after{content:"\e0d5\e0d5"}.fa-duotone.fa-arrow-down-big-small:after,.fa-duotone.fa-sort-size-down:after,.fad.fa-arrow-down-big-small:after,.fad.fa-sort-size-down:after{content:"\f88c\f88c"}.fa-duotone.fa-gauge-simple-high:after,.fa-duotone.fa-tachometer-fast:after,.fa-duotone.fa-tachometer:after,.fad.fa-gauge-simple-high:after,.fad.fa-tachometer-fast:after,.fad.fa-tachometer:after{content:"\f62a\f62a"}.fa-duotone.fa-do-not-enter:after,.fad.fa-do-not-enter:after{content:"\f5ec\f5ec"}.fa-duotone.fa-shower:after,.fad.fa-shower:after{content:"\f2cc\f2cc"}.fa-duotone.fa-dice-d8:after,.fad.fa-dice-d8:after{content:"\f6d2\f6d2"}.fa-duotone.fa-desktop-alt:after,.fa-duotone.fa-desktop:after,.fad.fa-desktop-alt:after,.fad.fa-desktop:after{content:"\f390\f390"}.fa-duotone.fa-m:after,.fad.fa-m:after{content:"\4d\4d"}.fa-duotone.fa-grip-dots-vertical:after,.fad.fa-grip-dots-vertical:after{content:"\e411\e411"}.fa-duotone.fa-face-viewfinder:after,.fad.fa-face-viewfinder:after{content:"\e2ff\e2ff"}.fa-duotone.fa-creemee:after,.fa-duotone.fa-soft-serve:after,.fad.fa-creemee:after,.fad.fa-soft-serve:after{content:"\e400\e400"}.fa-duotone.fa-h5:after,.fad.fa-h5:after{content:"\e412\e412"}.fa-duotone.fa-hand-back-point-down:after,.fad.fa-hand-back-point-down:after{content:"\e19e\e19e"}.fa-duotone.fa-table-list:after,.fa-duotone.fa-th-list:after,.fad.fa-table-list:after,.fad.fa-th-list:after{content:"\f00b\f00b"}.fa-duotone.fa-comment-sms:after,.fa-duotone.fa-sms:after,.fad.fa-comment-sms:after,.fad.fa-sms:after{content:"\f7cd\f7cd"}.fa-duotone.fa-rectangle-landscape:after,.fa-duotone.fa-rectangle:after,.fad.fa-rectangle-landscape:after,.fad.fa-rectangle:after{content:"\f2fa\f2fa"}.fa-duotone.fa-clipboard-list-check:after,.fad.fa-clipboard-list-check:after{content:"\f737\f737"}.fa-duotone.fa-turkey:after,.fad.fa-turkey:after{content:"\f725\f725"}.fa-duotone.fa-book:after,.fad.fa-book:after{content:"\f02d\f02d"}.fa-duotone.fa-user-plus:after,.fad.fa-user-plus:after{content:"\f234\f234"}.fa-duotone.fa-ice-skate:after,.fad.fa-ice-skate:after{content:"\f7ac\f7ac"}.fa-duotone.fa-check:after,.fad.fa-check:after{content:"\f00c\f00c"}.fa-duotone.fa-battery-4:after,.fa-duotone.fa-battery-three-quarters:after,.fad.fa-battery-4:after,.fad.fa-battery-three-quarters:after{content:"\f241\f241"}.fa-duotone.fa-tomato:after,.fad.fa-tomato:after{content:"\e330\e330"}.fa-duotone.fa-sword-laser:after,.fad.fa-sword-laser:after{content:"\e03b\e03b"}.fa-duotone.fa-house-circle-check:after,.fad.fa-house-circle-check:after{content:"\e509\e509"}.fa-duotone.fa-buildings:after,.fad.fa-buildings:after{content:"\e0cc\e0cc"}.fa-duotone.fa-angle-left:after,.fad.fa-angle-left:after{content:"\f104\f104"}.fa-duotone.fa-cart-flatbed-boxes:after,.fa-duotone.fa-dolly-flatbed-alt:after,.fad.fa-cart-flatbed-boxes:after,.fad.fa-dolly-flatbed-alt:after{content:"\f475\f475"}.fa-duotone.fa-diagram-successor:after,.fad.fa-diagram-successor:after{content:"\e47a\e47a"}.fa-duotone.fa-truck-arrow-right:after,.fad.fa-truck-arrow-right:after{content:"\e58b\e58b"}.fa-duotone.fa-square-w:after,.fad.fa-square-w:after{content:"\e285\e285"}.fa-duotone.fa-arrows-split-up-and-left:after,.fad.fa-arrows-split-up-and-left:after{content:"\e4bc\e4bc"}.fa-duotone.fa-lamp:after,.fad.fa-lamp:after{content:"\f4ca\f4ca"}.fa-duotone.fa-airplay:after,.fad.fa-airplay:after{content:"\e089\e089"}.fa-duotone.fa-fist-raised:after,.fa-duotone.fa-hand-fist:after,.fad.fa-fist-raised:after,.fad.fa-hand-fist:after{content:"\f6de\f6de"}.fa-duotone.fa-shield-quartered:after,.fad.fa-shield-quartered:after{content:"\e575\e575"}.fa-duotone.fa-slash-forward:after,.fad.fa-slash-forward:after{content:"\2f\2f"}.fa-duotone.fa-location-pen:after,.fa-duotone.fa-map-marker-edit:after,.fad.fa-location-pen:after,.fad.fa-map-marker-edit:after{content:"\f607\f607"}.fa-duotone.fa-cloud-moon:after,.fad.fa-cloud-moon:after{content:"\f6c3\f6c3"}.fa-duotone.fa-pot-food:after,.fad.fa-pot-food:after{content:"\e43f\e43f"}.fa-duotone.fa-briefcase:after,.fad.fa-briefcase:after{content:"\f0b1\f0b1"}.fa-duotone.fa-person-falling:after,.fad.fa-person-falling:after{content:"\e546\e546"}.fa-duotone.fa-image-portrait:after,.fa-duotone.fa-portrait:after,.fad.fa-image-portrait:after,.fad.fa-portrait:after{content:"\f3e0\f3e0"}.fa-duotone.fa-user-tag:after,.fad.fa-user-tag:after{content:"\f507\f507"}.fa-duotone.fa-rug:after,.fad.fa-rug:after{content:"\e569\e569"}.fa-duotone.fa-print-slash:after,.fad.fa-print-slash:after{content:"\f686\f686"}.fa-duotone.fa-earth-europe:after,.fa-duotone.fa-globe-europe:after,.fad.fa-earth-europe:after,.fad.fa-globe-europe:after{content:"\f7a2\f7a2"}.fa-duotone.fa-cart-flatbed-suitcase:after,.fa-duotone.fa-luggage-cart:after,.fad.fa-cart-flatbed-suitcase:after,.fad.fa-luggage-cart:after{content:"\f59d\f59d"}.fa-duotone.fa-hand-back-point-ribbon:after,.fad.fa-hand-back-point-ribbon:after{content:"\e1a0\e1a0"}.fa-duotone.fa-rectangle-times:after,.fa-duotone.fa-rectangle-xmark:after,.fa-duotone.fa-times-rectangle:after,.fa-duotone.fa-window-close:after,.fad.fa-rectangle-times:after,.fad.fa-rectangle-xmark:after,.fad.fa-times-rectangle:after,.fad.fa-window-close:after{content:"\f410\f410"}.fa-duotone.fa-tire-rugged:after,.fad.fa-tire-rugged:after{content:"\f634\f634"}.fa-duotone.fa-lightbulb-dollar:after,.fad.fa-lightbulb-dollar:after{content:"\f670\f670"}.fa-duotone.fa-cowbell:after,.fad.fa-cowbell:after{content:"\f8b3\f8b3"}.fa-duotone.fa-baht-sign:after,.fad.fa-baht-sign:after{content:"\e0ac\e0ac"}.fa-duotone.fa-corner:after,.fad.fa-corner:after{content:"\e3fe\e3fe"}.fa-duotone.fa-chevron-double-right:after,.fa-duotone.fa-chevrons-right:after,.fad.fa-chevron-double-right:after,.fad.fa-chevrons-right:after{content:"\f324\f324"}.fa-duotone.fa-book-open:after,.fad.fa-book-open:after{content:"\f518\f518"}.fa-duotone.fa-book-journal-whills:after,.fa-duotone.fa-journal-whills:after,.fad.fa-book-journal-whills:after,.fad.fa-journal-whills:after{content:"\f66a\f66a"}.fa-duotone.fa-inhaler:after,.fad.fa-inhaler:after{content:"\f5f9\f5f9"}.fa-duotone.fa-handcuffs:after,.fad.fa-handcuffs:after{content:"\e4f8\e4f8"}.fa-duotone.fa-snake:after,.fad.fa-snake:after{content:"\f716\f716"}.fa-duotone.fa-exclamation-triangle:after,.fa-duotone.fa-triangle-exclamation:after,.fa-duotone.fa-warning:after,.fad.fa-exclamation-triangle:after,.fad.fa-triangle-exclamation:after,.fad.fa-warning:after{content:"\f071\f071"}.fa-duotone.fa-note-medical:after,.fad.fa-note-medical:after{content:"\e200\e200"}.fa-duotone.fa-database:after,.fad.fa-database:after{content:"\f1c0\f1c0"}.fa-duotone.fa-down-left:after,.fad.fa-down-left:after{content:"\e16a\e16a"}.fa-duotone.fa-arrow-turn-right:after,.fa-duotone.fa-mail-forward:after,.fa-duotone.fa-share:after,.fad.fa-arrow-turn-right:after,.fad.fa-mail-forward:after,.fad.fa-share:after{content:"\f064\f064"}.fa-duotone.fa-face-thinking:after,.fad.fa-face-thinking:after{content:"\e39b\e39b"}.fa-duotone.fa-turn-down-right:after,.fad.fa-turn-down-right:after{content:"\e455\e455"}.fa-duotone.fa-bottle-droplet:after,.fad.fa-bottle-droplet:after{content:"\e4c4\e4c4"}.fa-duotone.fa-mask-face:after,.fad.fa-mask-face:after{content:"\e1d7\e1d7"}.fa-duotone.fa-hill-rockslide:after,.fad.fa-hill-rockslide:after{content:"\e508\e508"}.fa-duotone.fa-scanner-keyboard:after,.fad.fa-scanner-keyboard:after{content:"\f489\f489"}.fa-duotone.fa-circle-o:after,.fad.fa-circle-o:after{content:"\e119\e119"}.fa-duotone.fa-grid-horizontal:after,.fad.fa-grid-horizontal:after{content:"\e307\e307"}.fa-duotone.fa-comment-alt-dollar:after,.fa-duotone.fa-message-dollar:after,.fad.fa-comment-alt-dollar:after,.fad.fa-message-dollar:after{content:"\f650\f650"}.fa-duotone.fa-exchange-alt:after,.fa-duotone.fa-right-left:after,.fad.fa-exchange-alt:after,.fad.fa-right-left:after{content:"\f362\f362"}.fa-duotone.fa-columns-3:after,.fad.fa-columns-3:after{content:"\e361\e361"}.fa-duotone.fa-paper-plane:after,.fad.fa-paper-plane:after{content:"\f1d8\f1d8"}.fa-duotone.fa-road-circle-exclamation:after,.fad.fa-road-circle-exclamation:after{content:"\e565\e565"}.fa-duotone.fa-dungeon:after,.fad.fa-dungeon:after{content:"\f6d9\f6d9"}.fa-duotone.fa-hand-holding-box:after,.fad.fa-hand-holding-box:after{content:"\f47b\f47b"}.fa-duotone.fa-input-text:after,.fad.fa-input-text:after{content:"\e1bf\e1bf"}.fa-duotone.fa-window-alt:after,.fa-duotone.fa-window-flip:after,.fad.fa-window-alt:after,.fad.fa-window-flip:after{content:"\f40f\f40f"}.fa-duotone.fa-align-right:after,.fad.fa-align-right:after{content:"\f038\f038"}.fa-duotone.fa-scanner-gun:after,.fa-duotone.fa-scanner:after,.fad.fa-scanner-gun:after,.fad.fa-scanner:after{content:"\f488\f488"}.fa-duotone.fa-tire:after,.fad.fa-tire:after{content:"\f631\f631"}.fa-duotone.fa-engine:after,.fad.fa-engine:after{content:"\e16e\e16e"}.fa-duotone.fa-money-bill-1-wave:after,.fa-duotone.fa-money-bill-wave-alt:after,.fad.fa-money-bill-1-wave:after,.fad.fa-money-bill-wave-alt:after{content:"\f53b\f53b"}.fa-duotone.fa-life-ring:after,.fad.fa-life-ring:after{content:"\f1cd\f1cd"}.fa-duotone.fa-hands:after,.fa-duotone.fa-sign-language:after,.fa-duotone.fa-signing:after,.fad.fa-hands:after,.fad.fa-sign-language:after,.fad.fa-signing:after{content:"\f2a7\f2a7"}.fa-duotone.fa-caret-circle-right:after,.fa-duotone.fa-circle-caret-right:after,.fad.fa-caret-circle-right:after,.fad.fa-circle-caret-right:after{content:"\f330\f330"}.fa-duotone.fa-wheat:after,.fad.fa-wheat:after{content:"\f72d\f72d"}.fa-duotone.fa-file-spreadsheet:after,.fad.fa-file-spreadsheet:after{content:"\f65b\f65b"}.fa-duotone.fa-audio-description-slash:after,.fad.fa-audio-description-slash:after{content:"\e0a8\e0a8"}.fa-duotone.fa-calendar-day:after,.fad.fa-calendar-day:after{content:"\f783\f783"}.fa-duotone.fa-ladder-water:after,.fa-duotone.fa-swimming-pool:after,.fa-duotone.fa-water-ladder:after,.fad.fa-ladder-water:after,.fad.fa-swimming-pool:after,.fad.fa-water-ladder:after{content:"\f5c5\f5c5"}.fa-duotone.fa-arrows-up-down:after,.fa-duotone.fa-arrows-v:after,.fad.fa-arrows-up-down:after,.fad.fa-arrows-v:after{content:"\f07d\f07d"}.fa-duotone.fa-chess-pawn-alt:after,.fa-duotone.fa-chess-pawn-piece:after,.fad.fa-chess-pawn-alt:after,.fad.fa-chess-pawn-piece:after{content:"\f444\f444"}.fa-duotone.fa-face-grimace:after,.fa-duotone.fa-grimace:after,.fad.fa-face-grimace:after,.fad.fa-grimace:after{content:"\f57f\f57f"}.fa-duotone.fa-wheelchair-alt:after,.fa-duotone.fa-wheelchair-move:after,.fad.fa-wheelchair-alt:after,.fad.fa-wheelchair-move:after{content:"\e2ce\e2ce"}.fa-duotone.fa-level-down-alt:after,.fa-duotone.fa-turn-down:after,.fad.fa-level-down-alt:after,.fad.fa-turn-down:after{content:"\f3be\f3be"}.fa-duotone.fa-square-s:after,.fad.fa-square-s:after{content:"\e27d\e27d"}.fa-duotone.fa-barcode-alt:after,.fa-duotone.fa-rectangle-barcode:after,.fad.fa-barcode-alt:after,.fad.fa-rectangle-barcode:after{content:"\f463\f463"}.fa-duotone.fa-person-walking-arrow-right:after,.fad.fa-person-walking-arrow-right:after{content:"\e552\e552"}.fa-duotone.fa-envelope-square:after,.fa-duotone.fa-square-envelope:after,.fad.fa-envelope-square:after,.fad.fa-square-envelope:after{content:"\f199\f199"}.fa-duotone.fa-dice:after,.fad.fa-dice:after{content:"\f522\f522"}.fa-duotone.fa-unicorn:after,.fad.fa-unicorn:after{content:"\f727\f727"}.fa-duotone.fa-bowling-ball:after,.fad.fa-bowling-ball:after{content:"\f436\f436"}.fa-duotone.fa-pompebled:after,.fad.fa-pompebled:after{content:"\e43d\e43d"}.fa-duotone.fa-brain:after,.fad.fa-brain:after{content:"\f5dc\f5dc"}.fa-duotone.fa-watch-smart:after,.fad.fa-watch-smart:after{content:"\e2cc\e2cc"}.fa-duotone.fa-book-user:after,.fad.fa-book-user:after{content:"\f7e7\f7e7"}.fa-duotone.fa-sensor-cloud:after,.fa-duotone.fa-sensor-smoke:after,.fad.fa-sensor-cloud:after,.fad.fa-sensor-smoke:after{content:"\e02c\e02c"}.fa-duotone.fa-clapperboard-play:after,.fad.fa-clapperboard-play:after{content:"\e132\e132"}.fa-duotone.fa-band-aid:after,.fa-duotone.fa-bandage:after,.fad.fa-band-aid:after,.fad.fa-bandage:after{content:"\f462\f462"}.fa-duotone.fa-calendar-minus:after,.fad.fa-calendar-minus:after{content:"\f272\f272"}.fa-duotone.fa-circle-xmark:after,.fa-duotone.fa-times-circle:after,.fa-duotone.fa-xmark-circle:after,.fad.fa-circle-xmark:after,.fad.fa-times-circle:after,.fad.fa-xmark-circle:after{content:"\f057\f057"}.fa-duotone.fa-circle-4:after,.fad.fa-circle-4:after{content:"\e0f1\e0f1"}.fa-duotone.fa-gifts:after,.fad.fa-gifts:after{content:"\f79c\f79c"}.fa-duotone.fa-album-collection:after,.fad.fa-album-collection:after{content:"\f8a0\f8a0"}.fa-duotone.fa-hotel:after,.fad.fa-hotel:after{content:"\f594\f594"}.fa-duotone.fa-earth-asia:after,.fa-duotone.fa-globe-asia:after,.fad.fa-earth-asia:after,.fad.fa-globe-asia:after{content:"\f57e\f57e"}.fa-duotone.fa-id-card-alt:after,.fa-duotone.fa-id-card-clip:after,.fad.fa-id-card-alt:after,.fad.fa-id-card-clip:after{content:"\f47f\f47f"}.fa-duotone.fa-magnifying-glass-plus:after,.fa-duotone.fa-search-plus:after,.fad.fa-magnifying-glass-plus:after,.fad.fa-search-plus:after{content:"\f00e\f00e"}.fa-duotone.fa-thumbs-up:after,.fad.fa-thumbs-up:after{content:"\f164\f164"}.fa-duotone.fa-cloud-showers:after,.fad.fa-cloud-showers:after{content:"\f73f\f73f"}.fa-duotone.fa-user-clock:after,.fad.fa-user-clock:after{content:"\f4fd\f4fd"}.fa-duotone.fa-onion:after,.fad.fa-onion:after{content:"\e427\e427"}.fa-duotone.fa-clock-twelve-thirty:after,.fad.fa-clock-twelve-thirty:after{content:"\e359\e359"}.fa-duotone.fa-arrow-down-to-dotted-line:after,.fad.fa-arrow-down-to-dotted-line:after{content:"\e095\e095"}.fa-duotone.fa-allergies:after,.fa-duotone.fa-hand-dots:after,.fad.fa-allergies:after,.fad.fa-hand-dots:after{content:"\f461\f461"}.fa-duotone.fa-file-invoice:after,.fad.fa-file-invoice:after{content:"\f570\f570"}.fa-duotone.fa-window-minimize:after,.fad.fa-window-minimize:after{content:"\f2d1\f2d1"}.fa-duotone.fa-rectangle-wide:after,.fad.fa-rectangle-wide:after{content:"\f2fc\f2fc"}.fa-duotone.fa-comment-arrow-up:after,.fad.fa-comment-arrow-up:after{content:"\e144\e144"}.fa-duotone.fa-garlic:after,.fad.fa-garlic:after{content:"\e40e\e40e"}.fa-duotone.fa-coffee:after,.fa-duotone.fa-mug-saucer:after,.fad.fa-coffee:after,.fad.fa-mug-saucer:after{content:"\f0f4\f0f4"}.fa-duotone.fa-brush:after,.fad.fa-brush:after{content:"\f55d\f55d"}.fa-duotone.fa-tree-decorated:after,.fad.fa-tree-decorated:after{content:"\f7dc\f7dc"}.fa-duotone.fa-mask:after,.fad.fa-mask:after{content:"\f6fa\f6fa"}.fa-duotone.fa-calendar-heart:after,.fad.fa-calendar-heart:after{content:"\e0d3\e0d3"}.fa-duotone.fa-magnifying-glass-minus:after,.fa-duotone.fa-search-minus:after,.fad.fa-magnifying-glass-minus:after,.fad.fa-search-minus:after{content:"\f010\f010"}.fa-duotone.fa-flower:after,.fad.fa-flower:after{content:"\f7ff\f7ff"}.fa-duotone.fa-arrow-down-from-arc:after,.fad.fa-arrow-down-from-arc:after{content:"\e614\e614"}.fa-duotone.fa-right-left-large:after,.fad.fa-right-left-large:after{content:"\e5e1\e5e1"}.fa-duotone.fa-ruler-vertical:after,.fad.fa-ruler-vertical:after{content:"\f548\f548"}.fa-duotone.fa-circles-overlap:after,.fad.fa-circles-overlap:after{content:"\e600\e600"}.fa-duotone.fa-user-alt:after,.fa-duotone.fa-user-large:after,.fad.fa-user-alt:after,.fad.fa-user-large:after{content:"\f406\f406"}.fa-duotone.fa-starship-freighter:after,.fad.fa-starship-freighter:after{content:"\e03a\e03a"}.fa-duotone.fa-train-tram:after,.fad.fa-train-tram:after{content:"\e5b4\e5b4"}.fa-duotone.fa-bridge-suspension:after,.fad.fa-bridge-suspension:after{content:"\e4cd\e4cd"}.fa-duotone.fa-trash-check:after,.fad.fa-trash-check:after{content:"\e2af\e2af"}.fa-duotone.fa-user-nurse:after,.fad.fa-user-nurse:after{content:"\f82f\f82f"}.fa-duotone.fa-boombox:after,.fad.fa-boombox:after{content:"\f8a5\f8a5"}.fa-duotone.fa-syringe:after,.fad.fa-syringe:after{content:"\f48e\f48e"}.fa-duotone.fa-cloud-sun:after,.fad.fa-cloud-sun:after{content:"\f6c4\f6c4"}.fa-duotone.fa-shield-exclamation:after,.fad.fa-shield-exclamation:after{content:"\e247\e247"}.fa-duotone.fa-stopwatch-20:after,.fad.fa-stopwatch-20:after{content:"\e06f\e06f"}.fa-duotone.fa-square-full:after,.fad.fa-square-full:after{content:"\f45c\f45c"}.fa-duotone.fa-grip-dots:after,.fad.fa-grip-dots:after{content:"\e410\e410"}.fa-duotone.fa-comment-exclamation:after,.fad.fa-comment-exclamation:after{content:"\f4af\f4af"}.fa-duotone.fa-pen-swirl:after,.fad.fa-pen-swirl:after{content:"\e214\e214"}.fa-duotone.fa-falafel:after,.fad.fa-falafel:after{content:"\e40a\e40a"}.fa-duotone.fa-circle-2:after,.fad.fa-circle-2:after{content:"\e0ef\e0ef"}.fa-duotone.fa-magnet:after,.fad.fa-magnet:after{content:"\f076\f076"}.fa-duotone.fa-jar:after,.fad.fa-jar:after{content:"\e516\e516"}.fa-duotone.fa-gramophone:after,.fad.fa-gramophone:after{content:"\f8bd\f8bd"}.fa-duotone.fa-dice-d12:after,.fad.fa-dice-d12:after{content:"\f6ce\f6ce"}.fa-duotone.fa-note-sticky:after,.fa-duotone.fa-sticky-note:after,.fad.fa-note-sticky:after,.fad.fa-sticky-note:after{content:"\f249\f249"}.fa-duotone.fa-arrow-alt-down:after,.fa-duotone.fa-down:after,.fad.fa-arrow-alt-down:after,.fad.fa-down:after{content:"\f354\f354"}.fa-duotone.fa-100:after,.fa-duotone.fa-hundred-points:after,.fad.fa-100:after,.fad.fa-hundred-points:after{content:"\e41c\e41c"}.fa-duotone.fa-paperclip-vertical:after,.fad.fa-paperclip-vertical:after{content:"\e3c2\e3c2"}.fa-duotone.fa-wind-circle-exclamation:after,.fa-duotone.fa-wind-warning:after,.fad.fa-wind-circle-exclamation:after,.fad.fa-wind-warning:after{content:"\f776\f776"}.fa-duotone.fa-location-pin-slash:after,.fa-duotone.fa-map-marker-slash:after,.fad.fa-location-pin-slash:after,.fad.fa-map-marker-slash:after{content:"\f60c\f60c"}.fa-duotone.fa-face-sad-sweat:after,.fad.fa-face-sad-sweat:after{content:"\e38a\e38a"}.fa-duotone.fa-bug-slash:after,.fad.fa-bug-slash:after{content:"\e490\e490"}.fa-duotone.fa-cupcake:after,.fad.fa-cupcake:after{content:"\e402\e402"}.fa-duotone.fa-light-switch-off:after,.fad.fa-light-switch-off:after{content:"\e018\e018"}.fa-duotone.fa-toggle-large-off:after,.fad.fa-toggle-large-off:after{content:"\e5b0\e5b0"}.fa-duotone.fa-pen-fancy-slash:after,.fad.fa-pen-fancy-slash:after{content:"\e210\e210"}.fa-duotone.fa-truck-container:after,.fad.fa-truck-container:after{content:"\f4dc\f4dc"}.fa-duotone.fa-boot:after,.fad.fa-boot:after{content:"\f782\f782"}.fa-duotone.fa-arrow-up-from-water-pump:after,.fad.fa-arrow-up-from-water-pump:after{content:"\e4b6\e4b6"}.fa-duotone.fa-file-check:after,.fad.fa-file-check:after{content:"\f316\f316"}.fa-duotone.fa-bone:after,.fad.fa-bone:after{content:"\f5d7\f5d7"}.fa-duotone.fa-cards-blank:after,.fad.fa-cards-blank:after{content:"\e4df\e4df"}.fa-duotone.fa-circle-3:after,.fad.fa-circle-3:after{content:"\e0f0\e0f0"}.fa-duotone.fa-bench-tree:after,.fad.fa-bench-tree:after{content:"\e2e7\e2e7"}.fa-duotone.fa-keyboard-brightness-low:after,.fad.fa-keyboard-brightness-low:after{content:"\e1c1\e1c1"}.fa-duotone.fa-ski-boot-ski:after,.fad.fa-ski-boot-ski:after{content:"\e3cd\e3cd"}.fa-duotone.fa-brain-circuit:after,.fad.fa-brain-circuit:after{content:"\e0c6\e0c6"}.fa-duotone.fa-user-injured:after,.fad.fa-user-injured:after{content:"\f728\f728"}.fa-duotone.fa-block-brick-fire:after,.fa-duotone.fa-firewall:after,.fad.fa-block-brick-fire:after,.fad.fa-firewall:after{content:"\e3dc\e3dc"}.fa-duotone.fa-face-sad-tear:after,.fa-duotone.fa-sad-tear:after,.fad.fa-face-sad-tear:after,.fad.fa-sad-tear:after{content:"\f5b4\f5b4"}.fa-duotone.fa-plane:after,.fad.fa-plane:after{content:"\f072\f072"}.fa-duotone.fa-tent-arrows-down:after,.fad.fa-tent-arrows-down:after{content:"\e581\e581"}.fa-duotone.fa-exclamation:after,.fad.fa-exclamation:after{content:"\21\21"}.fa-duotone.fa-arrows-spin:after,.fad.fa-arrows-spin:after{content:"\e4bb\e4bb"}.fa-duotone.fa-face-smile-relaxed:after,.fad.fa-face-smile-relaxed:after{content:"\e392\e392"}.fa-duotone.fa-comment-times:after,.fa-duotone.fa-comment-xmark:after,.fad.fa-comment-times:after,.fad.fa-comment-xmark:after{content:"\f4b5\f4b5"}.fa-duotone.fa-print:after,.fad.fa-print:after{content:"\f02f\f02f"}.fa-duotone.fa-try:after,.fa-duotone.fa-turkish-lira-sign:after,.fa-duotone.fa-turkish-lira:after,.fad.fa-try:after,.fad.fa-turkish-lira-sign:after,.fad.fa-turkish-lira:after{content:"\e2bb\e2bb"}.fa-duotone.fa-face-nose-steam:after,.fad.fa-face-nose-steam:after{content:"\e382\e382"}.fa-duotone.fa-circle-waveform-lines:after,.fa-duotone.fa-waveform-circle:after,.fad.fa-circle-waveform-lines:after,.fad.fa-waveform-circle:after{content:"\e12d\e12d"}.fa-duotone.fa-dollar-sign:after,.fa-duotone.fa-dollar:after,.fa-duotone.fa-usd:after,.fad.fa-dollar-sign:after,.fad.fa-dollar:after,.fad.fa-usd:after{content:"\24\24"}.fa-duotone.fa-ferris-wheel:after,.fad.fa-ferris-wheel:after{content:"\e174\e174"}.fa-duotone.fa-computer-speaker:after,.fad.fa-computer-speaker:after{content:"\f8b2\f8b2"}.fa-duotone.fa-skull-cow:after,.fad.fa-skull-cow:after{content:"\f8de\f8de"}.fa-duotone.fa-x:after,.fad.fa-x:after{content:"\58\58"}.fa-duotone.fa-magnifying-glass-dollar:after,.fa-duotone.fa-search-dollar:after,.fad.fa-magnifying-glass-dollar:after,.fad.fa-search-dollar:after{content:"\f688\f688"}.fa-duotone.fa-users-cog:after,.fa-duotone.fa-users-gear:after,.fad.fa-users-cog:after,.fad.fa-users-gear:after{content:"\f509\f509"}.fa-duotone.fa-person-military-pointing:after,.fad.fa-person-military-pointing:after{content:"\e54a\e54a"}.fa-duotone.fa-bank:after,.fa-duotone.fa-building-columns:after,.fa-duotone.fa-institution:after,.fa-duotone.fa-museum:after,.fa-duotone.fa-university:after,.fad.fa-bank:after,.fad.fa-building-columns:after,.fad.fa-institution:after,.fad.fa-museum:after,.fad.fa-university:after{content:"\f19c\f19c"}.fa-duotone.fa-circle-t:after,.fad.fa-circle-t:after{content:"\e124\e124"}.fa-duotone.fa-sack:after,.fad.fa-sack:after{content:"\f81c\f81c"}.fa-duotone.fa-grid-2:after,.fad.fa-grid-2:after{content:"\e196\e196"}.fa-duotone.fa-camera-cctv:after,.fa-duotone.fa-cctv:after,.fad.fa-camera-cctv:after,.fad.fa-cctv:after{content:"\f8ac\f8ac"}.fa-duotone.fa-umbrella:after,.fad.fa-umbrella:after{content:"\f0e9\f0e9"}.fa-duotone.fa-trowel:after,.fad.fa-trowel:after{content:"\e589\e589"}.fa-duotone.fa-horizontal-rule:after,.fad.fa-horizontal-rule:after{content:"\f86c\f86c"}.fa-duotone.fa-bed-alt:after,.fa-duotone.fa-bed-front:after,.fad.fa-bed-alt:after,.fad.fa-bed-front:after{content:"\f8f7\f8f7"}.fa-duotone.fa-d:after,.fad.fa-d:after{content:"\44\44"}.fa-duotone.fa-stapler:after,.fad.fa-stapler:after{content:"\e5af\e5af"}.fa-duotone.fa-masks-theater:after,.fa-duotone.fa-theater-masks:after,.fad.fa-masks-theater:after,.fad.fa-theater-masks:after{content:"\f630\f630"}.fa-duotone.fa-kip-sign:after,.fad.fa-kip-sign:after{content:"\e1c4\e1c4"}.fa-duotone.fa-face-woozy:after,.fad.fa-face-woozy:after{content:"\e3a2\e3a2"}.fa-duotone.fa-cloud-question:after,.fad.fa-cloud-question:after{content:"\e492\e492"}.fa-duotone.fa-pineapple:after,.fad.fa-pineapple:after{content:"\e31f\e31f"}.fa-duotone.fa-hand-point-left:after,.fad.fa-hand-point-left:after{content:"\f0a5\f0a5"}.fa-duotone.fa-gallery-thumbnails:after,.fad.fa-gallery-thumbnails:after{content:"\e3aa\e3aa"}.fa-duotone.fa-circle-j:after,.fad.fa-circle-j:after{content:"\e112\e112"}.fa-duotone.fa-eyes:after,.fad.fa-eyes:after{content:"\e367\e367"}.fa-duotone.fa-handshake-alt:after,.fa-duotone.fa-handshake-simple:after,.fad.fa-handshake-alt:after,.fad.fa-handshake-simple:after{content:"\f4c6\f4c6"}.fa-duotone.fa-file-caret-up:after,.fa-duotone.fa-page-caret-up:after,.fad.fa-file-caret-up:after,.fad.fa-page-caret-up:after{content:"\e42a\e42a"}.fa-duotone.fa-fighter-jet:after,.fa-duotone.fa-jet-fighter:after,.fad.fa-fighter-jet:after,.fad.fa-jet-fighter:after{content:"\f0fb\f0fb"}.fa-duotone.fa-comet:after,.fad.fa-comet:after{content:"\e003\e003"}.fa-duotone.fa-share-alt-square:after,.fa-duotone.fa-square-share-nodes:after,.fad.fa-share-alt-square:after,.fad.fa-square-share-nodes:after{content:"\f1e1\f1e1"}.fa-duotone.fa-shield-keyhole:after,.fad.fa-shield-keyhole:after{content:"\e248\e248"}.fa-duotone.fa-barcode:after,.fad.fa-barcode:after{content:"\f02a\f02a"}.fa-duotone.fa-plus-minus:after,.fad.fa-plus-minus:after{content:"\e43c\e43c"}.fa-duotone.fa-sliders-v-square:after,.fa-duotone.fa-square-sliders-vertical:after,.fad.fa-sliders-v-square:after,.fad.fa-square-sliders-vertical:after{content:"\f3f2\f3f2"}.fa-duotone.fa-video-camera:after,.fa-duotone.fa-video:after,.fad.fa-video-camera:after,.fad.fa-video:after{content:"\f03d\f03d"}.fa-duotone.fa-comment-middle-alt:after,.fa-duotone.fa-message-middle:after,.fad.fa-comment-middle-alt:after,.fad.fa-message-middle:after{content:"\e1e1\e1e1"}.fa-duotone.fa-graduation-cap:after,.fa-duotone.fa-mortar-board:after,.fad.fa-graduation-cap:after,.fad.fa-mortar-board:after{content:"\f19d\f19d"}.fa-duotone.fa-hand-holding-medical:after,.fad.fa-hand-holding-medical:after{content:"\e05c\e05c"}.fa-duotone.fa-person-circle-check:after,.fad.fa-person-circle-check:after{content:"\e53e\e53e"}.fa-duotone.fa-square-z:after,.fad.fa-square-z:after{content:"\e288\e288"}.fa-duotone.fa-comment-alt-text:after,.fa-duotone.fa-message-text:after,.fad.fa-comment-alt-text:after,.fad.fa-message-text:after{content:"\e1e6\e1e6"}.fa-duotone.fa-level-up-alt:after,.fa-duotone.fa-turn-up:after,.fad.fa-level-up-alt:after,.fad.fa-turn-up:after{content:"\f3bf\f3bf"} :host,:root{--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:300;font-display:block;src:url(../webfonts/fa-light-300.woff2) format("woff2"),url(../webfonts/fa-light-300.ttf) format("truetype")}.fa-light,.fal{font-weight:300}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:100;font-display:block;src:url(../webfonts/fa-thin-100.woff2) format("woff2"),url(../webfonts/fa-thin-100.ttf) format("truetype")}.fa-thin,.fat{font-weight:100}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Pro";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Pro";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Pro";font-display:block;font-weight:300;src:url(../webfonts/fa-light-300.woff2) format("woff2"),url(../webfonts/fa-light-300.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Duotone";font-display:block;font-weight:900;src:url(../webfonts/fa-duotone-900.woff2) format("woff2"),url(../webfonts/fa-duotone-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} +/*! + * Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2023 Fonticons, Inc. + */ +:host,:root{--fa-style-family-sharp:"Font Awesome 6 Sharp";--fa-font-sharp-light:normal 300 1em/1 "Font Awesome 6 Sharp"}@font-face{font-family:"Font Awesome 6 Sharp";font-style:normal;font-weight:300;font-display:block;src:url(../webfonts/fa-sharp-light-300.woff2) format("woff2"),url(../webfonts/fa-sharp-light-300.ttf) format("truetype")}.fa-light,.fasl{font-weight:300} +/*! + * Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2023 Fonticons, Inc. + */ +:host,:root{--fa-style-family-sharp:"Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp"}@font-face{font-family:"Font Awesome 6 Sharp";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-sharp-regular-400.woff2) format("woff2"),url(../webfonts/fa-sharp-regular-400.ttf) format("truetype")}.fa-regular,.fasr{font-weight:400} +/*! + * Font Awesome Pro 6.4.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2023 Fonticons, Inc. + */ +:host,:root{--fa-style-family-sharp:"Font Awesome 6 Sharp";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp"}@font-face{font-family:"Font Awesome 6 Sharp";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-sharp-solid-900.woff2) format("woff2"),url(../webfonts/fa-sharp-solid-900.ttf) format("truetype")}.fa-solid,.fass{font-weight:900} /*! * bootstrap-fileinput v4.5.2 * http://plugins.krajee.com/file-input @@ -1879,13 +1891,21 @@ video::-webkit-media-text-track-display { outline: none; } -/*! - * Fuel UX v3.1.0 - * Copyright 2012-2014 ExactTarget - * Licensed under the BSD-3-Clause license () - */ +.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/* + /*rtl:begin:ignore*/left:0/* + /*rtl:end:ignore*/}/* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{/* + /*rtl:begin:ignore*/right:0/* + /*rtl:end:ignore*/}/* + /*rtl:begin:ignore*/ +/* + /*rtl:end:ignore*/ +.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}} +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline;list-style:none;padding:0}.select2-container .select2-selection--multiple .select2-selection__clear{background-color:transparent;border:none;font-size:1em}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;margin-left:5px;padding:0;max-width:100%;resize:none;height:18px;vertical-align:bottom;font-family:sans-serif;overflow:hidden;word-break:keep-all}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option--selectable{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px;padding-right:0px}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;padding-bottom:5px;padding-right:5px;position:relative}.select2-container--default .select2-selection--multiple.select2-selection--clearable{padding-right:25px}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;font-weight:bold;height:20px;margin-right:10px;margin-top:5px;position:absolute;right:0;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:inline-block;margin-left:5px;margin-top:5px;padding:0;padding-left:20px;position:relative;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;white-space:nowrap}.select2-container--default .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-right:1px solid #aaa;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#999;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px;position:absolute;left:0;top:0}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover,.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus{background-color:#f1f1f1;color:#333;outline:none}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-left:1px solid #aaa;border-right:none;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__clear{float:left;margin-left:10px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--group{padding:0}.select2-container--default .select2-results__option--disabled{color:#999}.select2-container--default .select2-results__option--selected{background-color:#ddd}.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;height:26px;margin-right:20px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;padding-bottom:5px;padding-right:5px}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;display:inline-block;margin-left:5px;margin-top:5px;padding:0}.select2-container--classic .select2-selection--multiple .select2-selection__choice__display{cursor:default;padding-left:2px;padding-right:5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{background-color:transparent;border:none;border-top-left-radius:4px;border-bottom-left-radius:4px;color:#888;cursor:pointer;font-size:1em;font-weight:bold;padding:0 4px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;outline:none}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display{padding-left:5px;padding-right:2px}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:4px;border-bottom-right-radius:4px}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option--group{padding:0}.select2-container--classic .select2-results__option--disabled{color:grey}.select2-container--classic .select2-results__option--highlighted.select2-results__option--selectable{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} -@charset "UTF-8";.fuelux .clearfix{*zoom:1}.fuelux .clearfix:before,.fuelux .clearfix:after{display:table;content:"";line-height:0}.fuelux .clearfix:after{clear:both}@font-face{font-family:fuelux;src:url(https://groups.io/fonts/fuelux.eot);src:url(https://groups.io/fonts/fuelux.eot?) format("embedded-opentype"),url(https://groups.io/fonts/fuelux.woff) format("woff"),url(https://groups.io/fonts/fuelux.ttf) format("truetype"),url(https://groups.io/fonts/fuelux.svg) format("svg");font-weight:400;font-style:normal}.fuelux [class^=fueluxicon-]:before,.fuelux [class*=" fueluxicon-"]:before{font-family:fuelux!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;line-height:1;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fuelux .fueluxicon-loader-full:before{content:"\e000"}.fuelux .fueluxicon-loader-1:before{content:"\e001"}.fuelux .fueluxicon-loader-2:before{content:"\e002"}.fuelux .fueluxicon-loader-3:before{content:"\e003"}.fuelux .fueluxicon-loader-4:before{content:"\e004"}.fuelux .fueluxicon-loader-5:before{content:"\e005"}.fuelux .fueluxicon-loader-6:before{content:"\e006"}.fuelux .fueluxicon-loader-7:before{content:"\e007"}.fuelux .fueluxicon-loader-8:before{content:"\e008"}.fuelux .fueluxicon-bullet:before{content:"\e009"}.fuelux .checkbox.highlight{padding:4px}.fuelux .checkbox.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .checkbox input[type=checkbox]:focus+.checkbox-label,.fuelux .checkbox input[type=checkbox]:hover+.checkbox-label,.fuelux .checkbox .checkbox-label:hover{color:#999}.fuelux .form-horizontal .checkbox-inline{padding-top:0}.fuelux .input-group-addon.checkbox-custom.checkbox-inline:before{left:11px;top:9px}.fuelux .checkbox-custom{position:relative}.fuelux .checkbox-custom:before{font-family:"Glyphicons Halflings"!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;line-height:1;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;border:1px solid #adadad;border-radius:4px;color:#fff;content:" ";font-size:9px;height:14px;left:0;padding:1px 0 0 1px;position:absolute;top:3px;width:14px}.fuelux .checkbox-custom.checked:before{background:#39b3d7;border-color:#39b3d7;content:"\e013"}.fuelux .checkbox-custom.disabled{cursor:not-allowed}.fuelux .checkbox-custom.disabled:before{cursor:not-allowed;opacity:.5}.fuelux .checkbox-custom.checkbox-inline:before{left:0;top:3px}.fuelux .checkbox-custom.checkbox-inline.highlight{padding:4px 4px 4px 24px}.fuelux .checkbox-custom.checkbox-inline.highlight:before{left:4px;top:7px}.fuelux .checkbox-custom.checkbox-inline.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .checkbox-custom input[type=checkbox]:focus+.checkbox-label{color:#999}.fuelux .combobox.disabled .input-group-btn{cursor:not-allowed}.fuelux .datepicker-calendar{padding:16px 16px 0;min-height:262px}.fuelux .datepicker-calendar button{border:0;padding:0;background-color:transparent}.fuelux .datepicker-calendar-days{height:182px;margin:10px 0 12px;width:100%}.fuelux .datepicker-calendar-days thead{border-bottom:1px solid #cccaca}.fuelux .datepicker-calendar-days tbody:before{line-height:3px;content:"\200C";display:block}.fuelux .datepicker-calendar-days td,.fuelux .datepicker-calendar-days th{font-size:14px;height:32px;text-align:center;vertical-align:middle;width:14.29%}.fuelux .datepicker-calendar-days td b,.fuelux .datepicker-calendar-days td button{color:#231f20;display:inline-block;font-weight:400;height:30px;text-decoration:none;width:30px}.fuelux .datepicker-calendar-days td b{line-height:30px}.fuelux .datepicker-calendar-days td span{display:block}.fuelux .datepicker-calendar-days td span:hover{background:#b7e3f8;text-decoration:none}.fuelux .datepicker-calendar-days td.current-day b,.fuelux .datepicker-calendar-days td.current-day button{border:1px solid #1d75bb}.fuelux .datepicker-calendar-days td.last-month,.fuelux .datepicker-calendar-days td.next-month{background:#e3e2e1}.fuelux .datepicker-calendar-days td.past b,.fuelux .datepicker-calendar-days td.past button{color:#8d8787}.fuelux .datepicker-calendar-days td.restricted b,.fuelux .datepicker-calendar-days td.restricted button{cursor:no-drop;position:relative}.fuelux .datepicker-calendar-days td.restricted b:before,.fuelux .datepicker-calendar-days td.restricted button:before{border-top:1px solid #a94442;bottom:0;content:" ";display:block;left:5px;position:absolute;right:5px;top:50%}.fuelux .datepicker-calendar-days td.restricted b:hover,.fuelux .datepicker-calendar-days td.restricted button:hover{background:0 0}.fuelux .datepicker-calendar-days td.selected span{background:#1d75bb}.fuelux .datepicker-calendar-days td.selected span:hover{background:#0f5f9f}.fuelux .datepicker-calendar-days td.selected b,.fuelux .datepicker-calendar-days td.selected button{color:#fff}.fuelux .datepicker-calendar-days td.selected.current-day{box-shadow:0 0 0 1px #fff offset}.fuelux .datepicker-calendar-days td.selected.current-day span:hover b,.fuelux .datepicker-calendar-days td.selected.current-day span:hover button{border-color:#0f5f9f}.fuelux .datepicker-calendar-days th{font-weight:700;height:22px;vertical-align:top}.fuelux .datepicker-calendar-header{*zoom:1}.fuelux .datepicker-calendar-header:before,.fuelux .datepicker-calendar-header:after{display:table;content:"";line-height:0}.fuelux .datepicker-calendar-header:after{clear:both}.fuelux .datepicker-calendar-header button{border:0;padding:0;background-color:transparent}.fuelux .datepicker-calendar-header .title{margin:0 auto;text-align:center;display:block;width:174px;color:#4d4d4f;font-size:20px;line-height:30px;text-decoration:underline;vertical-align:middle}.fuelux .datepicker-calendar-header .title:hover{color:#1d75bb;text-decoration:underline}.fuelux .datepicker-calendar-header .title.disabled{cursor:default;pointer-events:none;text-decoration:none}.fuelux .datepicker-calendar-header .title .month{display:inline;margin:0;padding:0}.fuelux .datepicker-calendar-header .title .month span{display:none}.fuelux .datepicker-calendar-header .title .month span.current{display:inline}.fuelux .datepicker-calendar-header .next,.fuelux .datepicker-calendar-header .prev{background:#666669;background-clip:padding-box;border-radius:30px;cursor:pointer;float:left;height:30px;text-align:center;width:30px}.fuelux .datepicker-calendar-header .next span.glyphicon,.fuelux .datepicker-calendar-header .prev span.glyphicon{color:#fff;font-size:16px;line-height:30px}.fuelux .datepicker-calendar-header .next:hover,.fuelux .datepicker-calendar-header .prev:hover{background:#1d75bb}.fuelux .datepicker-calendar-header .next{float:right}.fuelux .datepicker-calendar-header .next span.glyphicon{line-height:28px}.fuelux .datepicker-calendar-footer{background:#e3e2e1;background-clip:padding-box;border-radius:0 0 4px 4px;border-top:1px solid #cccaca;height:30px;margin:0 -16px;padding:4px 14px}.fuelux .datepicker-calendar-footer .datepicker-today{color:#231f20;font-size:14px;text-decoration:underline}.fuelux .datepicker-calendar-footer .datepicker-today:hover{color:#1b75bb;text-decoration:underline}.fuelux .datepicker-calendar-footer .datepicker-today.disabled{color:#8b8c8e;cursor:default;pointer-events:none}.fuelux .datepicker-calendar-footer .datepicker-today.disabled:hover{color:#8b8c8e}.fuelux .datepicker-calendar-wrapper{border:1px solid #6e6f71;min-height:20px;padding:0;width:300px}.fuelux .datepicker-wheels{display:none}.fuelux .datepicker-wheels ul button{border:0;padding:0;background-color:transparent}.fuelux .datepicker-wheels-footer{background:#e3e2e1;border-radius:0 0 4px 4px;border-top:1px solid #cccaca;clear:both}.fuelux .datepicker-wheels-footer .datepicker-wheels-back{display:block;color:#4d4d4f;float:left;line-height:22px;border:0;background-color:transparent}.fuelux .datepicker-wheels-footer .datepicker-wheels-back:hover{color:#1d75bb}.fuelux .datepicker-wheels-footer .datepicker-wheels-select{float:right;background-color:transparent;color:#049cdb}.fuelux .datepicker-wheels-footer .datepicker-wheels-select:hover{color:#1d75bb}.fuelux .datepicker-wheels-month,.fuelux .datepicker-wheels-year{float:left;width:50%}.fuelux .datepicker-wheels-month ul,.fuelux .datepicker-wheels-year ul{height:217px;list-style-type:none;margin:0;overflow:auto;padding:0;text-align:center}.fuelux .datepicker-wheels-month ul li,.fuelux .datepicker-wheels-year ul li{margin:4px 0}.fuelux .datepicker-wheels-month ul li button,.fuelux .datepicker-wheels-year ul li button{width:100%;text-align:center;color:#414041;display:block;font-size:16px;line-height:24px;text-decoration:none}.fuelux .datepicker-wheels-month ul li button:hover,.fuelux .datepicker-wheels-year ul li button:hover{background:#aee0f8;text-decoration:none}.fuelux .datepicker-wheels-month ul li.selected button,.fuelux .datepicker-wheels-year ul li.selected button{background:#1d75bb;color:#fff}.fuelux .datepicker-wheels-month ul li.selected button:hover,.fuelux .datepicker-wheels-year ul li.selected button:hover{background:#0f5f9f}.fuelux .datepicker-wheels-month .header,.fuelux .datepicker-wheels-year .header{background:#e3e2e1;background-clip:padding-box;border-bottom:1px solid #cccaca;border-radius:4px 0 0;color:#4d4d4f;font-size:20px;font-weight:700;line-height:30px;margin-top:0;margin-bottom:0;text-align:center}.fuelux .datepicker-wheels-month.full,.fuelux .datepicker-wheels-year.full{border-left:0;width:100%}.fuelux .datepicker-wheels-month.full .header,.fuelux .datepicker-wheels-year.full .header{border-radius:4px 4px 0 0}.fuelux .datepicker-wheels-year{border-left:1px solid #cccaca;float:right}.fuelux .datepicker-wheels-year .header{border-radius:0 4px 0 0}.fuelux .infinitescroll{overflow-y:auto}.fuelux .infinitescroll .infinitescroll-end{clear:both;font-style:italic;padding:6px;text-align:center}.fuelux .infinitescroll .infinitescroll-load{clear:both;padding:6px}.fuelux .infinitescroll .infinitescroll-load button{padding:5px 12px;width:100%}.fuelux .infinitescroll .infinitescroll-load .loader{font-size:32px;height:32px;margin:0 auto;width:32px}.fuelux .dropUp{-webkit-box-shadow:0 0 10px rgba(0,0,0,.2);-moz-box-shadow:0 0 10px rgba(0,0,0,.2);box-shadow:0 0 10px rgba(0,0,0,.2)}.fuelux .loader{height:64px;font-size:64px;position:relative;width:64px}.fuelux .loader:after,.fuelux .loader:before{font-family:fuelux!important;font-style:normal!important;font-weight:400!important;font-variant:normal!important;text-transform:none!important;line-height:1;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;bottom:0;display:block;left:0;position:absolute;right:0;top:0}.fuelux .loader:before{content:'\e000';opacity:.33}.fuelux .loader.iefix:before{color:#bcbcbc;opacity:1}.fuelux .loader[data-frame="1"]:after{content:'\e001'}.fuelux .loader[data-frame="2"]:after{content:'\e002'}.fuelux .loader[data-frame="3"]:after{content:'\e003'}.fuelux .loader[data-frame="4"]:after{content:'\e004'}.fuelux .loader[data-frame="5"]:after{content:'\e005'}.fuelux .loader[data-frame="6"]:after{content:'\e006'}.fuelux .loader[data-frame="7"]:after{content:'\e007'}.fuelux .loader[data-frame="8"]:after{content:'\e008'}.fuelux input.glass,.fuelux textarea.glass{background:0 0;border:1px solid #fff;box-shadow:none}.fuelux input.glass:hover,.fuelux textarea.glass:hover{background:#d9edf7;border-color:#66afe9;cursor:pointer}.fuelux input.glass:hover[disabled],.fuelux textarea.glass:hover[disabled]{background:0 0;border-color:#fff;cursor:not-allowed}.fuelux input.glass:focus,.fuelux textarea.glass:focus{background:#fff;border-color:#66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);cursor:auto}.fuelux input.glass:focus[disabled],.fuelux textarea.glass:focus[disabled]{background:0 0;border-color:#fff;cursor:not-allowed}.fuelux input.glass[disabled],.fuelux textarea.glass[disabled]{cursor:not-allowed}.fuelux .input-group-addon{padding:6px 18px}.fuelux [data-toggle=buttons]>.btn>input[type=radio],.fuelux [data-toggle=buttons]>.btn>input[type=checkbox]{display:inline;position:absolute;left:-9999px}.fuelux .pillbox{border:1px solid #BBB;border-radius:4px;cursor:text;padding:3px}.fuelux .pillbox[data-readonly]{border:1px solid transparent}.fuelux .pillbox[data-readonly].truncate .pillbox-input-wrap{display:inline-block}.fuelux .pillbox[data-readonly].truncate .pillbox-input-wrap.truncated{display:none}.fuelux .pillbox[data-readonly].truncate .pillbox-more{display:inline}.fuelux .pillbox[data-readonly] .pill span.glyphicon-close{display:none}.fuelux .pillbox[data-readonly] .pillbox-add-item{display:none}.fuelux .pillbox[data-readonly] .pillbox-input-wrap{display:none}.fuelux .pillbox[data-readonly] .pillbox-input-wrap button.dropdown-toggle{display:none}.fuelux .pillbox.pills-editable .pill-group .pill span{cursor:text}.fuelux .pillbox.pills-editable .pill-group .pill span.glyphicon-close{cursor:pointer}.fuelux .pillbox>.pill-group{margin:0;padding:0;width:100%}.fuelux .pillbox>.pill-group>.pill{margin:2px;cursor:default;float:left;word-break:break-all}.fuelux .pillbox>.pill-group>.pill.pillbox-highlight{outline:1px dotted #999}.fuelux .pillbox>.pill-group>.pill.truncated{display:none}.fuelux .pillbox>.pill-group>.pill .pillbox-list-edit{border:0;color:#333;font-weight:400;border-radius:2px}.fuelux .pillbox>.pill-group>.pill .pillbox-list-edit:focus{outline:0;border:0}.fuelux .pillbox>.pill-group>.pill .glyphicon-close{cursor:pointer;top:-1px;left:2px}.fuelux .pillbox>.pill-group>.pill .glyphicon-close:before{content:" \00d7"}.fuelux .pillbox>.pill-group>.pill .glyphicon-close:hover{opacity:.4}.fuelux .pillbox .pillbox-input-wrap{position:relative;margin:4px 0 3px 3px;float:left}.fuelux .pillbox .pillbox-input-wrap.editing{border:1px solid #ccc;border-radius:4px;margin:2px 0 3px 3px}.fuelux .pillbox .pillbox-input-wrap.editing input.pillbox-add-item{border-radius:4px;color:#333;height:32px}.fuelux .pillbox .pillbox-add-item{border:0;box-shadow:none}.fuelux .pillbox .pillbox-add-item:focus{outline:0;border:0}.fuelux .pillbox .pillbox-more{cursor:pointer;display:none;line-height:30px}.fuelux .pillbox .suggest{max-height:166px;overflow-y:auto}.fuelux .pillbox .suggest>li{white-space:nowrap;cursor:pointer;padding:3px 20px}.fuelux .pillbox .suggest>li.pillbox-suggest-sel{background-color:#eee}.fuelux .pillbox .suggest>li:hover{background-color:#eee}.fuelux .placard{display:inline-block;position:relative}.fuelux .placard[data-ellipsis=true].showing input.placard-field{overflow:visible;text-overflow:clip;white-space:normal}.fuelux .placard[data-ellipsis=true] input.placard-field{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fuelux .placard[data-ellipsis=true] textarea.placard-field[readonly]{overflow:hidden}.fuelux .placard.showing .placard-footer,.fuelux .placard.showing .placard-header,.fuelux .placard.showing .placard-popup{display:block;z-index:1}.fuelux .placard.showing input.placard-field,.fuelux .placard.showing textarea.placard-field{background:#fff;border:1px solid #CCC;box-shadow:none;position:relative;z-index:1}.fuelux .placard input.placard-field,.fuelux .placard textarea.placard-field{resize:none}.fuelux .placard input.placard-field[readonly],.fuelux .placard textarea.placard-field[readonly]{background:#fff;cursor:auto}.fuelux .placard input.placard-field[readonly].glass,.fuelux .placard textarea.placard-field[readonly].glass{background:0 0}.fuelux .placard input.placard-field[readonly].glass:hover,.fuelux .placard textarea.placard-field[readonly].glass:hover{background:#d9edf7;cursor:pointer}.fuelux .placard input.placard-field:focus,.fuelux .placard textarea.placard-field:focus{border:1px solid #CCC;box-shadow:none}.fuelux .placard-cancel{font-size:12px;margin-right:4px;vertical-align:middle}.fuelux .placard-footer,.fuelux .placard-header{display:none;left:0;line-height:1;position:absolute;right:0}.fuelux .placard-footer{padding:4px 0 8px;text-align:right;top:100%}.fuelux .placard-header{bottom:100%;padding:8px 0 4px}.fuelux .placard-header h1,.fuelux .placard-header h2,.fuelux .placard-header h3,.fuelux .placard-header h4,.fuelux .placard-header h5,.fuelux .placard-header h6{margin:0}.fuelux .placard-popup{background:#d9edf7;background-clip:padding-box;border:1px solid #ccc;border-radius:4px;bottom:-8px;box-shadow:0 0 0 1px #fff inset;display:none;left:-8px;position:absolute;right:-8px;top:-8px}.fuelux .radio.highlight{padding:4px}.fuelux .radio.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .radio input[type=radio]:focus+.radio-label,.fuelux .radio input[type=radio]:hover+.radio-label,.fuelux .radio .radio-label:hover{color:#999}.fuelux .form-horizontal .radio-inline{padding-top:0}.fuelux .input-group-addon.radio-custom.radio-inline:before{left:11px;top:9px}.fuelux .radio-custom{position:relative}.fuelux .radio-custom:after{background:0 0;border-radius:6px;content:" ";height:6px;left:4px;position:absolute;top:7px;width:6px}.fuelux .radio-custom:before{border:1px solid #adadad;border-radius:14px;content:" ";height:14px;left:0;position:absolute;top:3px;width:14px}.fuelux .radio-custom.checked:after{background:#fff}.fuelux .radio-custom.checked:before{background:#39b3d7;border-color:#39b3d7}.fuelux .radio-custom.disabled{cursor:not-allowed}.fuelux .radio-custom.disabled:after{cursor:not-allowed}.fuelux .radio-custom.disabled:before{cursor:not-allowed;opacity:.5}.fuelux .radio-custom.radio-inline:after{left:4px;top:7px}.fuelux .radio-custom.radio-inline:before{left:0;top:3px}.fuelux .radio-custom.radio-inline.highlight{padding:4px 4px 4px 24px}.fuelux .radio-custom.radio-inline.highlight:after{left:8px;top:11px}.fuelux .radio-custom.radio-inline.highlight:before{left:4px;top:7px}.fuelux .radio-custom.radio-inline.highlight.checked{background:#e9e9e9;border-radius:4px}.fuelux .radio-custom input[type=radio]:focus+.radio-label{color:#999}.fuelux .repeater{border:1px solid #ddd;border-radius:4px}.fuelux .repeater-canvas.scrolling{bottom:0;left:0;overflow-y:auto;position:absolute;right:0;top:0}.fuelux .repeater-header,.fuelux .repeater-footer{background:#f9f9f9;min-height:50px;padding:8px;*zoom:1}.fuelux .repeater-header:before,.fuelux .repeater-footer:before,.fuelux .repeater-header:after,.fuelux .repeater-footer:after{display:table;content:"";line-height:0}.fuelux .repeater-header:after,.fuelux .repeater-footer:after{clear:both}.fuelux .repeater-header-left,.fuelux .repeater-footer-left{float:left}.fuelux .repeater-header-right,.fuelux .repeater-footer-right{float:right}@media (max-width:625px){.fuelux .repeater-header-left,.fuelux .repeater-footer-left,.fuelux .repeater-header-right,.fuelux .repeater-footer-right{float:none;*zoom:1}.fuelux .repeater-header-left:before,.fuelux .repeater-footer-left:before,.fuelux .repeater-header-right:before,.fuelux .repeater-footer-right:before,.fuelux .repeater-header-left:after,.fuelux .repeater-footer-left:after,.fuelux .repeater-header-right:after,.fuelux .repeater-footer-right:after{display:table;content:"";line-height:0}.fuelux .repeater-header-left:after,.fuelux .repeater-footer-left:after,.fuelux .repeater-header-right:after,.fuelux .repeater-footer-right:after{clear:both}.fuelux .repeater-header-left,.fuelux .repeater-footer-left{margin-bottom:8px}}.fuelux .repeater-header{border-bottom:1px solid #ddd;border-top-right-radius:4px;border-top-left-radius:4px}.fuelux .repeater-footer{border-top:1px solid #ddd;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.fuelux .repeater-loader{display:none;left:50%;position:absolute;margin:-32px 0 0 -32px;top:50%}.fuelux .repeater-viewport{min-height:80px;position:relative}.fuelux .repeater-pagination label{font-weight:400}.fuelux .repeater-pagination .repeater-primaryPaging{display:none;vertical-align:middle;width:116px}.fuelux .repeater-pagination .repeater-primaryPaging.active{display:inline-block}.fuelux .repeater-pagination .repeater-primaryPaging ul.dropdown-menu{min-width:116px}.fuelux .repeater-pagination .repeater-secondaryPaging{display:none;width:82px}.fuelux .repeater-pagination .repeater-secondaryPaging.active{display:inline-block}.fuelux .repeater-search{float:left;width:200px}.fuelux .repeater-title{display:block;float:left;line-height:34px;margin-right:10px}.fuelux .repeater[data-currentview=list] .repeater-canvas.scrolling{overflow:visible}.fuelux .repeater[data-currentview=list] .repeater-canvas.scrolling .repeater-list{bottom:0;left:0;position:absolute;right:0;top:0}.fuelux .repeater[data-currentview=list] .repeater-canvas.scrolling .repeater-list-wrapper{height:100%;overflow:auto}.fuelux .repeater[data-currentview=list] .repeater-loader{margin-top:-12px}.fuelux .repeater[data-currentview=list] .repeater-loader.noHeader{margin-top:-32px}.fuelux .repeater[data-currentview=list] .repeater-viewport{overflow:hidden}.fuelux .repeater-list{position:relative}.fuelux .repeater-list table{margin-bottom:0;width:100%}.fuelux .repeater-list table tbody td{border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0}.fuelux .repeater-list table tbody td:first-child{border-left:0}.fuelux .repeater-list table tbody tr.empty td{border-bottom:0;font-style:italic;padding:20px;text-align:center;width:100%}.fuelux .repeater-list table tbody tr.selectable:hover{background:#d9edf7;cursor:pointer}.fuelux .repeater-list table tbody tr.selected{background:#66AFE9;color:#fff}.fuelux .repeater-list table tbody tr.selected:hover{background:#428bca}.fuelux .repeater-list table tbody tr.selected td:first-child{padding-left:30px}.fuelux .repeater-list table thead>tr>th{background:0 0;border-bottom:1px solid transparent;border-left:1px solid transparent;border-top:0;color:rgba(0,0,0,0);line-height:1.42857;padding:8px}.fuelux .repeater-list table thead>tr>th:first-child{border-left:0}.fuelux .repeater-list table thead>tr>th.sorted span.glyphicon{display:block;visibility:hidden}.fuelux .repeater-list table thead>tr>th span.glyphicon{display:none;float:right;margin-top:2px}.fuelux .repeater-list-check{display:inline-block;height:0;line-height:0;position:relative;vertical-align:top;width:0}.fuelux .repeater-list-check span.glyphicon{left:-22px;position:absolute;top:2px}.fuelux .repeater-list-heading{background:#F9F9F9;border-bottom:1px solid #ddd;border-left:1px solid #ddd;border-top:0;color:#333;line-height:1.42857;margin-left:-9px;padding:8px;position:absolute;top:0;z-index:1}.fuelux .repeater-list-heading.shifted{margin-left:-1px}@media screen and (-webkit-min-device-pixel-ratio:0){.fuelux .repeater-list-heading.shifted{margin-left:0}}.fuelux .repeater-list-heading.sortable:hover,.fuelux .repeater-list-heading.sortable.sorted{background:#F1F1F1;cursor:pointer;background-color:#f1f1f1;background-image:-moz-linear-gradient(top,#f9f9f9,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f9f9f9),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f9f9f9,#e5e5e5);background-image:-o-linear-gradient(top,#f9f9f9,#e5e5e5);background-image:linear-gradient(to bottom,#f9f9f9,#e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#ffe5e5e5', GradientType=0)}.fuelux .repeater-list-heading.sortable.sorted span.glyphicon{display:block;visibility:visible}.fuelux .repeater-list-heading span.glyphicon{display:none;float:right;margin-top:2px}.fuelux .repeater-thumbnail{border:1px solid #ddd;color:#666;float:left;min-height:110px;min-width:100px;margin:8px 7px;text-align:center}.fuelux .repeater-thumbnail.selectable:hover{background:#d9edf7;cursor:pointer}.fuelux .repeater-thumbnail.selected{background:#66AFE9;color:#fff}.fuelux .repeater-thumbnail.selected:hover{background:#428bca}.fuelux .repeater-thumbnail img{display:block;margin-top:10px;margin-bottom:3px}.fuelux .repeater-thumbnail-cont{height:100%;overflow-y:auto;padding:6px;width:100%}.fuelux .repeater-thumbnail-cont div.empty{font-style:italic;padding:20px 10px;text-align:center}.fuelux .spinbox{display:inline-block;position:relative}.fuelux .spinbox.digits-3{width:60px}.fuelux .spinbox.disabled .spinbox-buttons{cursor:not-allowed}.fuelux .spinbox .spinbox-input{float:left;padding-bottom:3px;padding:0 25px 0 7px}.fuelux .spinbox .btn{position:relative;width:20px;height:13px;padding-top:0;padding-right:9px;padding-left:9px}.fuelux .spinbox .btn.disabled{cursor:not-allowed}.fuelux .spinbox .spinbox-buttons{position:absolute;height:28px;width:20px;right:2px}.fuelux .spinbox .spinbox-up{padding:0 0 14px 1px;top:2px}.fuelux .spinbox .spinbox-up .glyphicon-chevron-up{position:relative;top:0}.fuelux .spinbox .btn-group>.btn.spinbox-up{border-top-right-radius:4px}.fuelux .spinbox .spinbox-down{padding:0 0 8px 1px;top:2px;height:15px;border-bottom-left-radius:4px}.fuelux .spinbox .spinbox-down .glyphicon-chevron-down{position:relative;left:-1px;top:0}.fuelux .scheduler .control-label{min-width:7em}.fuelux .scheduler .inline-form-text{float:left;line-height:27px;margin-top:4px}.fuelux .scheduler .start-datetime.form-group{margin-bottom:0}.fuelux .scheduler .start-datetime .form-group{margin-left:0}.fuelux .scheduler .start-datetime .combobox{max-width:9em}.fuelux .scheduler .start-datetime .combobox .dropdown-menu{max-height:200px;overflow:auto}.fuelux .scheduler .start-datetime .dropdown{float:left;margin:0 10px 0 0}.fuelux .scheduler .timezone-container .input-group{max-width:20em}.fuelux .scheduler .timezone-container .dropdown-label{height:18px;white-space:nowrap;max-width:20em;overflow:hidden;text-overflow:ellipsis}.fuelux .scheduler .timezone-container .dropdown-menu{max-height:200px;overflow:auto}.fuelux .scheduler .repeat-panel{margin-left:0}.fuelux .scheduler .repeat-panel label{font-weight:400}.fuelux .scheduler .repeat-panel .radio{margin-right:10px}.fuelux .scheduler .repeat-panel .form-group{margin-left:0}.fuelux .scheduler .repeat-interval{margin-left:0;*zoom:1}.fuelux .scheduler .repeat-interval:before,.fuelux .scheduler .repeat-interval:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-interval:after{clear:both}.fuelux .scheduler .repeat-interval .form-group{margin-left:0}.fuelux .scheduler .repeat-interval .dropdown-menu{max-height:200px;overflow:auto}.fuelux .scheduler .repeat-interval .repeat-every-panel{float:left}.fuelux .scheduler .repeat-interval .repeat-every-panel .repeat-every-pretext{padding:0 10px}.fuelux .scheduler .repeat-interval .repeat-every-panel .spinbox{float:left;margin-right:10px}.fuelux .scheduler .repeat-interval .repeat-every-panel .spinbox input{margin-bottom:0}.fuelux .scheduler .repeat-monthly .repeat-monthly-date{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-monthly .repeat-monthly-date:before,.fuelux .scheduler .repeat-monthly .repeat-monthly-date:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-monthly .repeat-monthly-date:after{clear:both}.fuelux .scheduler .repeat-monthly .repeat-monthly-date .selectlist{margin-left:5px}.fuelux .scheduler .repeat-monthly .repeat-monthly-day{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-monthly .repeat-monthly-day:before,.fuelux .scheduler .repeat-monthly .repeat-monthly-day:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-monthly .repeat-monthly-day:after{clear:both}.fuelux .scheduler .repeat-monthly .month-days{margin-left:10px}.fuelux .scheduler .repeat-yearly .repeat-yearly-date{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-yearly .repeat-yearly-date:before,.fuelux .scheduler .repeat-yearly .repeat-yearly-date:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-yearly .repeat-yearly-date:after{clear:both}.fuelux .scheduler .repeat-yearly .repeat-yearly-date .year-month-day{margin-left:10px}.fuelux .scheduler .repeat-yearly .year-month-days{margin-left:10px}.fuelux .scheduler .repeat-yearly .year-month{margin-left:10px}.fuelux .scheduler .repeat-yearly .repeat-yearly-day{margin-top:10px;*zoom:1}.fuelux .scheduler .repeat-yearly .repeat-yearly-day:before,.fuelux .scheduler .repeat-yearly .repeat-yearly-day:after{display:table;content:"";line-height:0}.fuelux .scheduler .repeat-yearly .repeat-yearly-day:after{clear:both}.fuelux .scheduler .repeat-yearly .repeat-yearly-day .repeat-yearly-day-text{margin-left:10px}.fuelux .scheduler .repeat-weekly button:not(.active){background-color:#fff}.fuelux .scheduler .repeat-weekly .btn-group.disabled{position:relative;opacity:.65}.fuelux .scheduler .repeat-weekly .btn-group.disabled:before{background:0 0;bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:5}.fuelux .scheduler .selectlist{float:left}.fuelux .scheduler label.radio{float:left;line-height:27px}.fuelux .scheduler label.radio input{margin-top:8px}.fuelux .scheduler .repeat-end .end-after{float:left;display:inline-block;margin-right:10px}.fuelux .scheduler .repeat-end .form-group{margin-left:0}.fuelux .search.disabled .input-group-btn{cursor:not-allowed}.fuelux .selectlist.disabled{cursor:not-allowed}.fuelux .selectlist-sizer{display:inline-block;position:absolute;visibility:hidden;top:0}.fuelux .selectlist .selected-label{overflow:hidden;min-width:2em}.fuelux .selectlist .btn.dropdown-toggle{white-space:normal}.fuelux .selectlist .btn.dropdown-toggle .selected-label{padding-right:10px;text-align:left}.fuelux .tree{border:1px solid #999;border-radius:4px;padding:10px 15px 0;overflow-x:auto;overflow-y:auto;position:relative;list-style:none}.fuelux .tree :focus{outline:0}.fuelux .tree button:focus{color:#999}.fuelux .tree ul{padding-left:0;margin-top:0;margin-bottom:0;list-style:none}.fuelux .tree li{margin:0;margin-top:5px;margin-bottom:5px}.fuelux .tree .tree-loader{margin-left:45px}.fuelux .tree .tree-open>.tree-branch-header .glyphicon-play{transform:rotate(90deg);-ms-transform:rotate(90deg);-webkit-transform:rotate(90deg);position:relative;left:-5px}.fuelux .tree [data-children=false]>.tree-branch-header .icon-caret:before{content:'\00a0'}.fuelux .tree .tree-branch .tree-branch-header{position:relative;border-radius:6px}.fuelux .tree .tree-branch .tree-branch-header .tree-branch-name:hover{color:#999}.fuelux .tree .tree-branch .tree-branch-header .glyphicon-play{font-size:10px;padding-right:5px}.fuelux .tree .tree-branch .tree-branch-header .glyphicon-play:before{position:relative;top:-2px}.fuelux .tree .tree-branch .tree-branch-header .tree-branch-name{white-space:nowrap;border-radius:6px;background-color:transparent;border:0}.fuelux .tree .tree-branch .tree-branch-header label{font-weight:400;padding-left:3px;margin-bottom:0;cursor:pointer}.fuelux .tree .tree-branch .tree-branch-children{margin-left:14px}.fuelux .tree .tree-item{position:relative;cursor:pointer;border-radius:6px;margin-left:26px}.fuelux .tree .tree-item .tree-item-name{white-space:nowrap;border-radius:6px;background-color:transparent;border:0}.fuelux .tree .tree-item .tree-item-name:hover{color:#999}.fuelux .tree .tree-item.tree-selected .tree-item-name{background-color:#4f4f4f;color:#fff}.fuelux .tree .tree-item label{font-weight:400;padding-left:7px;margin-bottom:0;cursor:pointer}.fuelux .tree .icon-caret:hover+.tree-branch-name{color:#999}.fuelux .tree.tree-folder-select .tree-branch .icon-caret{background-color:transparent;border:0}.fuelux .tree.tree-folder-select .tree-branch .icon-caret:hover{cursor:pointer;color:#999}.fuelux .tree.tree-folder-select .tree-branch>.tree-branch-name{padding:1px 5px 0;border-radius:6px}.fuelux .tree.tree-folder-select .tree-branch>.tree-branch-name.tree-selected{background-color:#4f4f4f;color:#fff}.fuelux .tree.tree-folder-select .tree-branch.tree-selected>.tree-branch-header .tree-branch-name{background-color:#4f4f4f;color:#fff}.fuelux .tree.tree-folder-select .tree-branch.tree-selected>.tree-branch-header .tree-branch-name:hover{background-color:#4f4f4f;color:#fff}.fuelux .wizard{*zoom:1;border:1px solid #d4d4d4;border-radius:4px;box-shadow:0 1px 4px rgba(0,0,0,.065);background-color:#f9f9f9;position:relative;min-height:48px;overflow:hidden}.fuelux .wizard:before,.fuelux .wizard:after{display:table;content:"";line-height:0}.fuelux .wizard:after{clear:both}.fuelux .wizard>.steps{list-style:none outside none;padding:0;margin:0;width:4000px}.fuelux .wizard>.steps.previous-disabled li.complete{cursor:default}.fuelux .wizard>.steps.previous-disabled li.complete:hover{background:#f3f4f5;color:#468847;cursor:default}.fuelux .wizard>.steps.previous-disabled li.complete:hover .chevron:before{border-left-color:#f3f4f5}.fuelux .wizard>.steps li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#999;font-size:16px;cursor:not-allowed}.fuelux .wizard>.steps li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.fuelux .wizard>.steps li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.fuelux .wizard>.steps li.complete{background:#f3f4f5;color:#468847}.fuelux .wizard>.steps li.complete:hover{background:#e7eff8;cursor:pointer}.fuelux .wizard>.steps li.complete:hover .chevron:before{border-left:14px solid #e7eff8}.fuelux .wizard>.steps li.complete .chevron:before{border-left:14px solid #f3f4f5}.fuelux .wizard>.steps li.active{background:#f1f6fc;color:#3a87ad;cursor:default}.fuelux .wizard>.steps li.active .chevron:before{border-left:14px solid #f1f6fc}.fuelux .wizard>.steps li.active .badge{background-color:#3a87ad}.fuelux .wizard>.steps li .badge{margin-right:8px}.fuelux .wizard>.steps li .badge-success{background-color:#468847}.fuelux .wizard>.steps li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.fuelux .wizard>.actions{z-index:1000;position:absolute;right:0;line-height:46px;float:right;padding-left:15px;padding-right:15px;vertical-align:middle;background-color:#e5e5e5;border-left:1px solid #d4d4d4}.fuelux .wizard>.actions a{line-height:45px;font-size:12px;margin-right:8px}.fuelux .wizard>.actions .btn-prev[disabled]{cursor:not-allowed}.fuelux .wizard>.actions .btn-prev span{margin-right:5px}.fuelux .wizard>.actions .btn-next[disabled]{cursor:not-allowed}.fuelux .wizard>.actions .btn-next span{margin-left:5px}.fuelux .wizard .step-content{border-top:1px solid #D4D4D4;padding:10px;float:left;width:100%}.fuelux .wizard .step-content .step-pane{display:none}.fuelux .wizard .step-content>.active{display:block}.fuelux .wizard .step-content>.active .btn-group .active{display:inline-block}.fuelux .wizard.complete>.actions .glyphicon-arrow-right:before{display:none}.fuelux .wizard.complete>.actions .glyphicon-arrow-right{margin-left:0} /* * A colorselector for Twitter Bootstrap which lets you select a color from a predefined set of colors only. * https://github.com/flaute/bootstrap-colorselector @@ -2103,6 +2123,8 @@ video::-webkit-media-text-track-display { .cc-floating.cc-theme-classic{padding:1.2em;border-radius:5px}.cc-floating.cc-type-info.cc-theme-classic .cc-compliance{text-align:center;display:inline;-ms-flex:none;flex:none}.cc-theme-classic .cc-btn{border-radius:5px}.cc-theme-classic .cc-btn:last-child{min-width:140px}.cc-floating.cc-type-info.cc-theme-classic .cc-btn{display:inline-block} .cc-theme-edgeless.cc-window{padding:0}.cc-floating.cc-theme-edgeless .cc-message{margin:2em 2em 1.5em}.cc-banner.cc-theme-edgeless .cc-btn{margin:0;padding:.8em 1.8em;height:100%}.cc-banner.cc-theme-edgeless .cc-message{margin-left:1em}.cc-floating.cc-theme-edgeless .cc-btn+.cc-btn{margin-left:0} .navbar-head { + background-color: #337ab7; + /* background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); @@ -2110,6 +2132,7 @@ video::-webkit-media-text-track-display { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); background-repeat: repeat-x; + */ border-color: #245580; } .navbar-head .navbar-brand { @@ -2197,32 +2220,74 @@ hr { color: #eeeeee; } +:root { + --light-mode-body-color: #fff; + --light-mode-primary-color: #fafafa; + --light-mode-highlight-color: #eeeeee; + --light-mode-input-color: #fff; + --light-mode-text-color: #555; + --light-mode-light-text-color: #707070; + --light-mode-divider: #ccc; + + --dark-mode-body-color: #141414; + --dark-mode-primary-color: rgb(36, 37, 38); + --dark-mode-highlight-color: rgb(58, 59, 60); + --dark-mode-input-color: #141414; + --dark-mode-text-color: rgb(222, 226, 230); + --dark-mode-reverse-text-color: #141414; + --dark-mode-light-text-color: #999; + --dark-mode-divider: rgb(62, 64, 66); +} + +@media print { + #maincontent { + margin-left:0px !important; + } + a[href]:after { + content: none !important; + } +} + .modal-dialog { - margin-top: max(10px, env(safe-area-inset-top)); + margin-top: calc(10px + env(safe-area-inset-top)) +} + +th { + font-weight: normal; } @media (min-width: 768px) { .modal-dialog { - margin-top: max(30px, env(safe-area-inset-top)); + margin-top: calc(30px + env(safe-area-inset-top)) } } +a.button-link { + color: #888 !important; + text-decoration: none; + padding: 8px 12px; + border-radius: 4px; + transition: background-color 0.3s ease; +} + +.button-link-group a.button-link { + padding-right: 15px; +} + +a.button-link:hover { + background-color: rgba(0, 123, 255, 0.1); + /* Faint background on hover, change the rgba values as desired */ +} + /* otherwise selects extend to the entire width, which is too wide */ select.form-control { - width: auto; + width: auto; } .scrollable-groups-menu { - height: auto; - max-height: 400px; - overflow-x: hidden; -} - - -/* make current page in pagination blocks stand out */ -.currentpage { - color: #000 !important; - font-weight: 900; + height: auto; + max-height: 400px; + overflow-x: hidden; } @@ -2230,89 +2295,101 @@ select.form-control { text-align: center span, which is what summernote does to align things. so we use inline-block instead. */ .myimg-responsive { - display: inline-block; - max-width: 100%; - height: auto; + display: inline-block; + max-width: 100%; + height: auto; } +.table { + border-radius: 4px; + border-color: #f8f8f8; +} + +.table>tbody>tr:last-child>td:first-child { + border-bottom-left-radius: 4px; +} + +.table>tbody>tr:last-child>td:last-child { + border-bottom-right-radius: 4px; +} /* snug up breadcrumb bottom */ - .breadcrumb { - margin-bottom: 10px; + margin-bottom: 10px; } /* fix for Microsoft Outlook */ p.MsoNormal { - margin: 0px; + margin: 0px; } p.MsoListParagraph { - margin-bottom: 0px; + margin-bottom: 0px; } .the-table { - table-layout: fixed; - word-wrap: break-word; + table-layout: fixed; + word-wrap: break-word; } blockquote { - font-size: 14px; - border-left: 5px solid #eee; + font-size: 16px; + border-left: 5px solid #e0e0e0; } .hidden-label { - font-size: 0; - height: 1px; - overflow: hidden; - display: block; + font-size: 0; + height: 1px; + overflow: hidden; + display: block; } .scroll-top-wrapper { - position: fixed; - opacity: 0; - visibility: hidden; - overflow: hidden; - text-align: center; - z-index: 99999999; - background-color: #777777; - color: #eeeeee; - width: 50px; - height: 48px; - line-height: 48px; - right: 10px; - bottom: 0px; - padding-top: 2px; - border-top-left-radius: 10px; - border-top-right-radius: 10px; - border-bottom-right-radius: 10px; - border-bottom-left-radius: 10px; - -webkit-transition: all 0.5s ease-in-out; - -moz-transition: all 0.5s ease-in-out; - -ms-transition: all 0.5s ease-in-out; - -o-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; + position: fixed; + opacity: 0; + visibility: hidden; + overflow: hidden; + text-align: center; + z-index: 99999999; + background-color: #707070; + color: #eeeeee; + width: 50px; + height: 48px; + line-height: 48px; + right: 10px; + bottom: 0px; + padding-top: 2px; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; + border-bottom-left-radius: 10px; + -webkit-transition: all 0.5s ease-in-out; + -moz-transition: all 0.5s ease-in-out; + -ms-transition: all 0.5s ease-in-out; + -o-transition: all 0.5s ease-in-out; + transition: all 0.5s ease-in-out; } .scroll-top-wrapper:hover { - background-color: #888888; + background-color: #888888; } .scroll-top-wrapper.show { - visibility: visible; - cursor: pointer; - opacity: 0.4; + visibility: visible; + cursor: pointer; + opacity: 0.4; } .scroll-top-wrapper i.fa { - line-height: inherit; + line-height: inherit; } .dropdown-wide { display: block; } + .dropdown-narrow { display: none; } @@ -2320,15 +2397,77 @@ blockquote { /* subject font size */ .subject { - font-size: 17px; + font-size: 17px; } -@media screen and (max-width: 992px) { - .breadcrumb { - margin-left: -15px; - margin-right: -15px; - } - +a, +.pagination>li>a, +.pagination>li>span { + color: #2f6fa7; +} + +.navbar-head, +.list-group-item.active, +.list-group-item.active:focus, +.list-group-item.active:hover, +body.dark-mode .list-group-item.active, +body.dark-mode .list-group-item.active:focus, +body.dark-mode .list-group-item.active:hover { + background-color: #2f6fa7; +} + +body:not(.dark-mode) .groupmaincontent ul.dropdown-menu a, +body:not(.dark-mode) .panel-default>.panel-heading a { + color: #333 !important; +} + +body:not(.dark-mode) a.showvisited:visited, +body:not(.dark-mode) a.button-link, +body:not(.dark-mode) .thread-attribution, +body:not(.dark-mode) .text-muted, +body:not(.dark-mode) .breadcrumb>.active, +body:not(.dark-mode) .help-block, +body:not(.dark-mode) span[id*="likestats"] { + color: #707070 !important; +} + +.likestats { + font-size:14px; + color:#707070; +} + + +.thread-attribution { + font-size:14px; + color:#707070; +} + +body { + font-family: system-ui, + "Segoe UI", + Roboto, + "Helvetica Neue", + "Noto Sans", + "Liberation Sans", + Arial, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji", + "Segoe UI Symbol", + "Noto Color Emoji"; + font-size: 16px; + font-weight: 400; +} + +#body { + padding-top: calc(60px + env(safe-area-inset-top)); +} + +/* + This is to prevent the header and footer on Safari from moving when scrolling the + page. +*/ +@media (max-width: 992px) { #maincontent { position: absolute; top: calc(55px + env(safe-area-inset-top)); @@ -2337,1230 +2476,1572 @@ blockquote { left: 0; overflow-y: auto !important; } +} - #staticcontent { +#maincontent-refresh { + scroll-margin-top: 60px; +} + +.groupmaincontent { + margin-left: 225px; +} + +.btn-xs { + font-size:12px !important; +} + +.btn-default { + font-size: 14px; + color: rgb(51, 51, 51); + background-color: #ccc; + /*line-height: 15px;*/ + border: 1px solid #ccc; + border-radius: 6px; + transition: all 0.3s ease 0s; +} + +.btn-default:hover { + background-color: #bbb; + border: 1px solid #bbb; + color: rgb(41, 41, 41); +} + +.btn-outline-default { + font-size: 14px; + color: #ccc; + /*line-height: 15px;*/ + border: 2px solid #ccc; + border-radius: 6px; + background: transparent; + transition: all 0.3s ease 0s; +} + +.btn-outline-default:hover { + color: #FFF; + background-color: #ccc; + border: 2px solid #ccc; +} + +.btn-sm { + line-height: 18px; +} + +.btn-primary { + font-size: 14px; + color: #FFF; + /*line-height: 18px;*/ + border: 1px solid #337ab7; + background-color: #337ab7; + border-radius: 6px; + transition: all 0.3s ease 0s; +} + +.btn-primary.active { + background-color: #337ab7; + border-color: #337ab7; +} + +.btn-outline-primary { + font-size: 14px; + color: #337ab7; + /*line-height: 15px;*/ + border: 1px solid #337ab7; + background-color: #337ab7; + border-radius: 6px; + background: transparent; + transition: all 0.3s ease 0s; +} + +.btn-outline-primary.active { + background-color: #337ab7; + border-color: #337ab7; +} + +.btn-outline-primary:hover { + color: #FFF; + background: #337ab7; + border: 1px solid #337ab7; +} + +.btn-success { + font-size: 14px; + color: #FFF; + background-color: #419641; + /*line-height: 15px;*/ + border: 1px solid #419641; + border-radius: 6px; + transition: all 0.3s ease 0s; +} + +.btn-success:hover { + background-color: #307d30; + border: 1px solid #307d30; +} + +.btn-outline-success { + font-size: 14px; + color: #419641; + /*line-height: 15px;*/ + border: 1px solid #419641; + border-radius: 6px; + background: transparent; + transition: all 0.3s ease 0s; +} + +.btn-outline-success:hover { + color: #FFF; + background: #419641; + border: 1px solid #419641; +} + +.btn-outline-success:hover { + color: #FFF; + background: #419641; + border: 1px solid #419641; +} + +.btn-info { + font-size: 14px; + color: #FFF; + background-color: #5bc0de; + /*line-height: 15px;*/ + border: 1px solid #5bc0de; + border-radius: 6px; + transition: all 0.3s ease 0s; +} + +.btn-info:hover { + background-color: #2188a0; + border: 1px solid #2188a0; +} + +.btn-outline-info { + font-size: 14px; + color: #5bc0de; + /*line-height: 15px;*/ + border: 1px solid #5bc0de; + border-radius: 6px; + background: transparent; + transition: all 0.3s ease 0s; +} + +.btn-outline-info:hover { + color: #FFF; + background: #5bc0de; + border: 1px solid #5bc0de; +} + + +.btn-warning { + font-size: 14px; + color: #FFF; + background-color: rgb(245, 128, 62); + /*line-height: 15px;*/ + border: 1px solid rgb(245, 128, 62); + border-radius: 6px; + transition: all 0.3s ease 0s; +} + +.btn-warning:hover { + background-color: #d67f0c; + border: 1px solid #d67f0c; +} + +.btn-outline-warning { + font-size: 14px; + color: rgb(245, 128, 62); + /*line-height: 15px;*/ + border: 1px solid rgb(245, 128, 62); + border-radius: 6px; + background: transparent; + transition: all 0.3s ease 0s; +} + +.btn-outline-warning:hover { + color: #FFF; + background: rgb(245, 128, 62); + border: 1px solid rgb(245, 128, 62); +} + +.btn-danger { + font-size: 14px; + color: #FFF; + background-color: #d9534f; + /*line-height: 15px;*/ + border: 1px solid #d9534f; + border-radius: 6px; + transition: all 0.3s ease 0s; +} + +.btn-danger:hover { + background-color: #a0211d; + border: 1px solid #a0211d; +} + +.btn-outline-danger { + font-size: 14px; + color: #d9534f; + /*line-height: 15px;*/ + border: 1px solid #d9534f; + border-radius: 6px; + background: transparent; + transition: all 0.3s ease 0s; +} + +.btn-outline-danger:hover { + color: #FFF; + background: #d9534f; + border: 1px solid #d9534f; +} + +.scrolling-wrapper { + overflow-x: auto; + white-space: nowrap; +} + +.scrolling-wrapper .btn { + display: inline-block; + white-space: normal; +} + +.Xmce-tinymce { + box-shadow: none !important; +} + +.Xmce-content-body { + margin-top: 10px; + margin-left: 10px; +} + +.Xmce-panel { + border-color: #ccc !important; +} + +.scrollbar { + overflow-y: auto; + max-height: calc(100vh - 61px); + /*visibility: hidden;*/ +} + +.scrollbar-content, +.scrollbar:hover, +.scrollbar:focus { + /*visibility: visible !important; + -webkit-overflow-scrolling: touch;*/ + overflow-y: auto; +} + +.scrollbar::-webkit-scrollbar { + /*-webkit-appearance: none;*/ + width: 6px; + height: 6px; + background-color: rgba(0, 0, 0, 0); +} +.scrollbar::-webkit-scrollbar-thumb { + border-radius: 3px; + background-color: #ccc; +} + +#groupsidebar { + padding-right:0px; + position:fixed; + max-width:220px; + width:100%; + top: calc(60px + env(safe-area-inset-top)); +} + +/* force a passage without spaces to be broken up to fit a fixed width container */ +.forcebreak, .forcebreak * { +/* + word-break: break-all; + overflow-wrap: break-word; + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; +*/ + word-wrap: break-word !important; + overflow-wrap: break-word !important; + /*white-space: normal !important;*/ +} + +@media screen and (max-width: 992px) { + + .breadcrumb { + margin-left: -15px; + margin-right: -15px; + } + /* + .groupmaincontent { + position: absolute; + top: calc(55px + env(safe-area-inset-top)); + bottom: 80px; + right: 0; + left: 0; overflow-y: auto !important; + margin-left: 0px; + margin-right: 0px; + } + */ + .groupmaincontent { + margin-left: 0px; } - /* need to do this because tinymce goes into an iframe and inherits the body overflow */ - .mce-content-bodyXX { + #groupsidebar { + display: none; + } + #staticcontent { overflow-y: auto !important; } .dropdown-wide { display: none; } - + .dropdown-narrow { display: block; } /* fix chat */ #chat-container { - height: calc(100% - 181px - env(safe-area-inset-top)) !important; + height: calc(100% - 50px) !important; } - #chat-unread-counter { - bottom: 201px !important; + + .nav-pills>li { + float: none; + } + + .navbar-fixed-bottom { + margin-bottom: 0px; + } + + .table-responsive { + border: 0px; + } + + /* subject font size bigger than desktop*/ + .subject { + font-size: 18px; + } + + .scroll-top-wrapper { + right: 0px; + bottom: 72px; + } + + /* fix for auto zoom in summernote */ + .note-editor .note-editable { + font-size: 17px; + } + + /* undo this from above because it causes horizontal scrolling */ + select.form-control { + width: 100%; } - .nav-pills>li { - float: none; - } - .navbar-fixed-bottom { - margin-bottom: 0px; - } - .table-responsive { - border: 0px; - } - /* subject font size bigger than desktop*/ - .subject { - font-size: 18px; - } - /* force a passage without spaces to be broken up to fit a fixed width container */ - .forcebreak { - -ms-word-break: break-all; - /* word-break is commented out because it breaks firefox and apparently adds nothing */ - /* word-break: break-all; w*/ - /* Non standard for webkit */ - word-wrap: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - } - .scroll-top-wrapper { - right: 0px; - bottom: 72px; - } - /* fix for auto zoom in summernote */ - .note-editor .note-editable { - font-size: 16px; - } - /* undo this from above because it causes horizontal scrolling */ - select.form-control { - width: 100%; - } } a.showvisited:visited { - /* visited link */ - color: #787878; + /* visited link */ + color: #787878; } .navbar.center .navbar-inner { - text-align: center; -} -.navbar.center .navbar-inner .nav { - float: none; - display:inline-block; - vertical-align: middle; + text-align: center; } -.noborderlist { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; +.navbar.center .navbar-inner .nav { + float: none; + display: inline-block; + vertical-align: middle; } .noborderitem:first-child { - border-top: 0px; + border-top-left-radius: 0px !important; + border-top-right-radius: 0px !important; } .noborderitem:last-child { - border-bottom: 0px; + border-bottom: 0px !important; } .noborderitem { - border-right-width: 0px; - border-left-width: 0px; - border-top-left-radius: 0px !important; - border-top-right-radius: 0px !important; - border-bottom-left-radius: 0px !important; - border-bottom-right-radius: 0px !important; + border-right-width: 0px; + border-left-width: 0px; } table.table-fixed { - table-layout: fixed; - width: 100%; + table-layout: fixed; + width: 100%; } /* spacing used for buttons that may wrap to the next line */ .top5 { - margin-top: 5px; + margin-top: 5px; } .top7 { - margin-top: 7px; + margin-top: 7px; } .top10 { - margin-top: 10px; + margin-top: 10px; } .top15 { - margin-top: 15px; + margin-top: 15px; } .top17 { - margin-top: 17px; + margin-top: 17px; } .top30 { - margin-top: 30px; + margin-top: 30px; } .bottom5 { - margin-bottom: 5px; + margin-bottom: 5px; } .bottom7 { - margin-bottom: 7px; + margin-bottom: 7px; } .bottom10 { - margin-bottom: 10px; + margin-bottom: 10px; } .bottom15 { - margin-bottom: 15px; + margin-bottom: 15px; } .bottom17 { - margin-bottom: 17px; + margin-bottom: 17px; } .bottom30 { - margin-bottom: 30px; + margin-bottom: 30px; } .list-group-submenu { - margin-left: 20px; + margin-left: 20px; } +.list-group-subsubmenu { + margin-left: 40px; +} /* hashtag color definitions */ .hashtag-btn { - color: #fff !important; + color: #fff; } .hashtag-label-white { - background-color: #fff; - border-color: #ccc; + background-color: #fff; + border-color: #ccc; } .hashtag-label-green-lantern { - background-color: #61b16c; + background-color: #61b16c; } .hashtag-label-cucumber { - background-color: #91d09a; + background-color: #91d09a; } .hashtag-label-cerulean-blue { - background-color: #4191d6; + background-color: #4191d6; } .hashtag-label-bluejean { - background-color: #8ec2ee; + background-color: #8ec2ee; } .hashtag-label-capri-blue { - background-color: #88ddf7; + background-color: #88ddf7; } .hashtag-label-aquamute { - background-color: #60d2b8; + background-color: #60d2b8; } .hashtag-label-emerald-green { - background-color: #11adb1; + background-color: #11adb1; } .hashtag-label-apricot { - background-color: #fe904b; + background-color: #fe904b; } .hashtag-label-orange { - background-color: #faa849; + background-color: #faa849; } .hashtag-label-yellow { - background-color: #fecd0f; + background-color: #fecd0f; } .hashtag-label-cherry-blossom { - background-color: #f96ab0; + background-color: #f96ab0; } .hashtag-label-peony { - background-color: #fb9bc4; + background-color: #fb9bc4; } .hashtag-label-tomato { - background-color: #f85347; + background-color: #f85347; } .hashtag-label-melon { - background-color: #fa8287; + background-color: #fa8287; } .hashtag-label-orchid { - background-color: #df6cca; + background-color: #df6cca; } .hashtag-label-pink { - background-color: #f39de4; + background-color: #f39de4; } .hashtag-label-lilac { - background-color: #9f8cd5; + background-color: #9f8cd5; } .hashtag-label-purple { - background-color: #837fd5; + background-color: #837fd5; } .hashtag-label-dark-grey { - background-color: #4c4c4c; + background-color: #4c4c4c; } .hashtag-label-light-grey { - background-color: #8c8c8c; + background-color: #8c8c8c; } .hashtag-label-military { - background-color: #938953; + background-color: #938953; } .hashtag-label-light-brown { - background-color: #c4bd97; + background-color: #c4bd97; } .hashtag-label-moss-green { - background-color: #93ad59; + background-color: #93ad59; } .hashtag-label-grey-blue { - background-color: #83adb5; + background-color: #83adb5; } .hashtag-label-green-sage { - background-color: #9fc4ac; + background-color: #9fc4ac; } .hashtag-label-sage { - background-color: #89bfbd; + background-color: #89bfbd; } .hashtag-label-blush { - background-color: #ee836f; + background-color: #ee836f; } .hashtag-label-mustard { - background-color: #cb9228; + background-color: #cb9228; } .hashtag-label-mulbery { - background-color: #d55d75; + background-color: #d55d75; } .hashtag-label-dusty-mauve { - background-color: #655251; + background-color: #655251; } .hashtag-label-dark-orange { - background-color: #e76239; + background-color: #e76239; } .hashtag-label-burnt-yellow { - background-color: #dab71f; + background-color: #dab71f; } .hashtag-label-antique-pink { - background-color: #e5b9b7; + background-color: #e5b9b7; } .hashtag-label-lips { - background-color: #c97586; + background-color: #c97586; } .hashtag-label-terracotta { - background-color: #a7605f; + background-color: #a7605f; } .hashtag-label-cloudy-blue { - background-color: #6381b4; + background-color: #6381b4; } .hashtag-label-purple-grey { - background-color: #8593ab; + background-color: #8593ab; } .hashtag-label-light-lilac { - background-color: #ccc1d9; + background-color: #ccc1d9; } .hashtag-label-grape { - background-color: #5e3c58; + background-color: #5e3c58; } .hashtag-label-purple-blue { - background-color: #4853a1; + background-color: #4853a1; } .hashtag-label-sky { - background-color: #9cc7df; + background-color: #9cc7df; } .hashtag-label-beige { - background-color: #dcc39c; + background-color: #dcc39c; } .hashtag-box-white { - background-color: #fff; - border-color: #ccc; + background-color: #fff !important; + border-color: #ccc; } .hashtag-box-green-lantern { - color: #333 !important; - background-color: #61b16c; + color: #333 !important; + background-color: #61b16c !important; } .hashtag-box-cucumber { - color: #333 !important; - background-color: #91d09a; + color: #333 !important; + background-color: #91d09a !important; } .hashtag-box-cerulean-blue { - color: #333 !important; - background-color: #4191d6; + color: #333 !important; + background-color: #4191d6 !important; } .hashtag-box-bluejean { - color: #333 !important; - background-color: #8ec2ee; + color: #333 !important; + background-color: #8ec2ee !important; } .hashtag-box-capri-blue { - color: #333 !important; - background-color: #88ddf7; + color: #333 !important; + background-color: #88ddf7 !important; } .hashtag-box-aquamute { - color: #333 !important; - background-color: #60d2b8; + color: #333 !important; + background-color: #60d2b8 !important; } .hashtag-box-emerald-green { - color: #333 !important; - background-color: #11adb1; + color: #333 !important; + background-color: #11adb1 !important; } .hashtag-box-apricot { - color: #333 !important; - background-color: #fe904b; + color: #333 !important; + background-color: #fe904b !important; } .hashtag-box-orange { - color: #333 !important; - background-color: #faa849; + color: #333 !important; + background-color: #faa849 !important; } .hashtag-box-yellow { - color: #333 !important; - background-color: #fecd0f; + color: #333 !important; + background-color: #fecd0f !important; } .hashtag-box-cherry-blossom { - color: #333 !important; - background-color: #f96ab0; + color: #333 !important; + background-color: #f96ab0 !important; } .hashtag-box-peony { - color: #333 !important; - background-color: #fb9bc4; + color: #333 !important; + background-color: #fb9bc4 !important; } .hashtag-box-tomato { - color: #333 !important; - background-color: #f85347; + color: #333 !important; + background-color: #f85347 !important; } .hashtag-box-melon { - color: #333 !important; - background-color: #fa8287; + color: #333 !important; + background-color: #fa8287 !important; } .hashtag-box-orchid { - color: #333 !important; - background-color: #df6cca; + color: #333 !important; + background-color: #df6cca !important; } .hashtag-box-pink { - color: #333 !important; - background-color: #f39de4; + color: #333 !important; + background-color: #f39de4 !important; } .hashtag-box-lilac { - color: #333 !important; - background-color: #9f8cd5; + color: #333 !important; + background-color: #9f8cd5 !important; } .hashtag-box-purple { - color: #333 !important; - background-color: #837fd5; + color: #333 !important; + background-color: #837fd5 !important; } .hashtag-box-dark-grey { - color: #eee !important; - background-color: #4c4c4c; + color: #eee !important; + background-color: #4c4c4c !important; } .hashtag-box-light-grey { - color: #333 !important; - background-color: #8c8c8c; + color: #333 !important; + background-color: #8c8c8c !important; } .hashtag-box-military { - color: #333 !important; - background-color: #938953; + color: #333 !important; + background-color: #938953 !important; } .hashtag-box-light-brown { - color: #333 !important; - background-color: #c4bd97; + color: #333 !important; + background-color: #c4bd97 !important; } .hashtag-box-moss-green { - color: #333 !important; - background-color: #93ad59; + color: #333 !important; + background-color: #93ad59 !important; } .hashtag-box-grey-blue { - color: #333 !important; - background-color: #83adb5; + color: #333 !important; + background-color: #83adb5 !important; } .hashtag-box-green-sage { - color: #333 !important; - background-color: #9fc4ac; + color: #333 !important; + background-color: #9fc4ac !important; } .hashtag-box-sage { - color: #333 !important; - background-color: #89bfbd; + color: #333 !important; + background-color: #89bfbd !important; } .hashtag-box-blush { - color: #333 !important; - background-color: #ee836f; + color: #333 !important; + background-color: #ee836f !important; } .hashtag-box-mustard { - color: #333 !important; - background-color: #cb9228; + color: #333 !important; + background-color: #cb9228 !important; } .hashtag-box-mulbery { - color: #333 !important; - background-color: #d55d75; + color: #333 !important; + background-color: #d55d75 !important; } .hashtag-box-dusty-mauve { - color: #eee !important; - background-color: #655251; + color: #eee !important; + background-color: #655251 !important; } .hashtag-box-dark-orange { - color: #333 !important; - background-color: #e76239; + color: #333 !important; + background-color: #e76239 !important; } .hashtag-box-burnt-yellow { - color: #333 !important; - background-color: #dab71f; + color: #333 !important; + background-color: #dab71f !important; } .hashtag-box-antique-pink { - color: #333 !important; - background-color: #e5b9b7; + color: #333 !important; + background-color: #e5b9b7 !important; } .hashtag-box-lips { - color: #333 !important; - background-color: #c97586; + color: #333 !important; + background-color: #c97586 !important; } .hashtag-box-terracotta { - color: #eee !important; - background-color: #a7605f; + color: #eee !important; + background-color: #a7605f !important; } .hashtag-box-cloudy-blue { - color: #333 !important; - background-color: #6381b4; + color: #333 !important; + background-color: #6381b4 !important; } .hashtag-box-purple-grey { - color: #333 !important; - background-color: #8593ab; + color: #333 !important; + background-color: #8593ab !important; } .hashtag-box-light-lilac { - color: #333 !important; - background-color: #ccc1d9; + color: #333 !important; + background-color: #ccc1d9 !important; } .hashtag-box-grape { - color: #eee !important; - background-color: #5e3c58; + color: #eee !important; + background-color: #5e3c58 !important; } .hashtag-box-purple-blue { - color: #eee !important; - background-color: #4853a1; + color: #eee !important; + background-color: #4853a1 !important; } .hashtag-box-sky { - color: #333 !important; - background-color: #9cc7df; + color: #333 !important; + background-color: #9cc7df !important; } .hashtag-box-beige { - color: #333 !important; - background-color: #dcc39c; + color: #333 !important; + background-color: #dcc39c !important; } .fa-6x { - font-size: 6em; + font-size: 6em; } .template { - display: none; + display: none; } .alert-gray { - background-color: #e6e6e6; - color: #333; + background-color: #e6e6e6; + color: #333; } -.stickywiki { - max-height: 100px; - overflow: hidden; - line-height: 20px; - word-wrap: break-word; -} - -.stickywiki>p { - margin-bottom: 20px; -} - -.mce-ico.mce-i-fa { - display: inline-block; - font: normal normal normal 14px/1; - font-family: 'Font Awesome\ 5 Pro'; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +.Xmce-ico.Xmce-i-fa { + display: inline-block; + font: normal normal normal 14px/1; + font-family: 'Font Awesome\ 5 Pro'; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } .mobilebadge { - position: absolute; - top: -5px; - right: -10px; - color: white; - background-color:#d43f3a; + position: absolute; + top: -5px; + right: -10px; + color: white; + background-color: #d43f3a; border: 2px solid white; } + .groupsbadge { background-color: #d43f3a; - position: absolute; - top: 0px; + position: absolute; + top: 0px; } @media screen and (max-width: 515px) { - .mce-window { - max-width: 320px !important; - left: calc(50% - 160px) !important; - } - .mce-window-body { - max-width: 100% !important; - min-height: 230px !important; - } - .mce-container.mce-panel.mce-abs-layout-item, - .mce-container.mce-panel.mce-abs-layout-item .mce-container-body.mce-abs-layout { - max-width: 100% !important; - min-height: 190px !important; - } - .mce-flow-layout { - text-align: center !important; - } - .mce-flow-layout-item.mce-btn-group { - border-left: none !important; - } - .mce-floatpanel, - .mce-floatpanel>.mce-container-body, - .mce-foot, - .mce-foot>.mce-abs-layout { - max-width: 320px !important; - text-align: center; - } - .mce-formitem { - width: 300px !important; - left: 10px !important; - display: block !important; - } - .mce-formitem:nth-child(2) { - top: 10px !important; - } - .mce-formitem:nth-child(3) { - top: 50px !important; - } - .mce-formitem:nth-child(4) { - top: 90px !important; - } - .mce-formitem:nth-child(5) { - top: 130px !important; - } - .mce-formitem:nth-child(6) { - top: 170px !important; - } - .mce-container.mce-form.mce-abs-layout-item .mce-container-body.mce-abs-layout .mce-container.mce-form.mce-abs-layout-item { - top: 40px !important; - left: 0 !important; - height: 160px !important; - } - .mce-formitem label { - width: 106px !important; - font-size: 13px !important; - left: 0px !important; - } - .mce-multiline { - max-width: 290px !important; - } - .mce-checkbox { - top: 40px !important; - left: 0 !important; - } - .mce-label { - font-size: 13px !important; - } - .mce-foot .mce-btn-has-text { - position: relative !important; - top: 0 !important; - left: 0 !important; - display: inline-block !important; - margin: 10px 5px !important; - } - .mce-abs-layout-item input { - max-width: 150px !important; - } - .mce-abs-layout-item.mce-has-open input { - max-width: 118px !important; - } + .Xmce-window { + max-width: 320px !important; + left: calc(50% - 160px) !important; + } + + .Xmce-window-body { + max-width: 100% !important; + min-height: 230px !important; + } + + .Xmce-container.Xmce-panel.Xmce-abs-layout-item, + .Xmce-container.Xmce-panel.Xmce-abs-layout-item .Xmce-container-body.Xmce-abs-layout { + max-width: 100% !important; + min-height: 190px !important; + } + + .Xmce-flow-layout { + text-align: center !important; + } + + .Xmce-flow-layout-item.Xmce-btn-group { + border-left: none !important; + } + + .Xmce-floatpanel, + .Xmce-floatpanel>.Xmce-container-body, + .Xmce-foot, + .Xmce-foot>.Xmce-abs-layout { + max-width: 320px !important; + text-align: center; + } + + .Xmce-formitem { + width: 300px !important; + left: 10px !important; + display: block !important; + } + + .Xmce-formitem:nth-child(2) { + top: 10px !important; + } + + .Xmce-formitem:nth-child(3) { + top: 50px !important; + } + + .Xmce-formitem:nth-child(4) { + top: 90px !important; + } + + .Xmce-formitem:nth-child(5) { + top: 130px !important; + } + + .Xmce-formitem:nth-child(6) { + top: 170px !important; + } + + .Xmce-container.Xmce-form.Xmce-abs-layout-item .Xmce-container-body.Xmce-abs-layout .Xmce-container.Xmce-form.Xmce-abs-layout-item { + top: 40px !important; + left: 0 !important; + height: 160px !important; + } + + .Xmce-formitem label { + width: 106px !important; + font-size: 14px !important; + left: 0px !important; + } + + .Xmce-multiline { + max-width: 290px !important; + } + + .Xmce-checkbox { + top: 40px !important; + left: 0 !important; + } + + .Xmce-label { + font-size: 14px !important; + } + + .Xmce-foot .Xmce-btn-has-text { + position: relative !important; + top: 0 !important; + left: 0 !important; + display: inline-block !important; + margin: 10px 5px !important; + } + + .Xmce-abs-layout-item input { + max-width: 150px !important; + } + + .Xmce-abs-layout-item.Xmce-has-open input { + max-width: 118px !important; + } } .toc ol { - counter-reset: item + counter-reset: item } .toc li { - display: block; - color: #aaa; + display: block; + color: #aaa; } .toc li:before { - content: counters(item, ".") " "; - counter-increment: item; - color: #000; + content: counters(item, ".") " "; + counter-increment: item; + color: #000; } -.visitedlinks a:visited { - color: #787878; +.wikidisplay a { + text-decoration: underline; +} + +.wikidisplay a:visited { + color: #787878; } .StripeElement--focus.StripeElement--invalid { - box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px inset, rgb(206, 132, 131) 0px 0px 6px; - border-color: rgb(132, 53, 52); + box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px inset, rgb(206, 132, 131) 0px 0px 6px; + border-color: rgb(132, 53, 52); } .StripeElement--focus { - border-color: #66afe9; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + border-color: #66afe9; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6); } .strike { - display: block; - text-align: center; - overflow: hidden; - white-space: nowrap; + display: block; + text-align: center; + overflow: hidden; + white-space: nowrap; } .strike>span { - position: relative; - display: inline-block; + position: relative; + display: inline-block; } .strike>span:before, .strike>span:after { - content: ""; - position: absolute; - top: 50%; - width: 9999px; - height: 1px; - background: #d3d3d3; + content: ""; + position: absolute; + top: 50%; + width: 9999px; + height: 1px; + background: #d3d3d3; } .strike>span:before { - right: 100%; - margin-right: 15px; + right: 100%; + margin-right: 15px; } .strike>span:after { - left: 100%; - margin-left: 15px; + left: 100%; + margin-left: 15px; } .scrollable-menu { - height: auto; - max-height: 200px; - overflow-x: hidden; + height: auto; + max-height: 200px; + overflow-x: hidden; } .template { - display: none; + display: none; } .nomargin { - margin-bottom: 0px; + margin-bottom: 0px; } .help-block { - margin-bottom: 0px; + margin-bottom: 0px; } .fa-stack-1x { - top: .25em; + top: .25em; } .fa-stack { - font-size: .5em; - vertical-align: -16%; + font-size: .5em; + vertical-align: -16%; } .filetype-text { - font-size: .7em; - font-weight: 700; - font-family: 'Oswald'; + font-size: .7em; + font-weight: 700; + font-family: 'Oswald'; } /* remove extra file upload icon, make placeholder text smaller, for file upload widget */ .kv-file-upload { - display: none + display: none } .file-drop-zone-title { - font-size: 30px; + font-size: 30px; } .btn-file { - position: relative; - overflow: hidden; + position: relative; + overflow: hidden; + font-size: 14px !important; } .btn-file input[type=file] { - position: absolute; - top: 0; - right: 0; - min-width: 100%; - min-height: 100%; - font-size: 100px; - text-align: right; - filter: alpha(opacity=0); - opacity: 0; - outline: none; - background: white; - cursor: inherit; - display: block; + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + text-align: right; + filter: alpha(opacity=0); + opacity: 0; + outline: none; + background: white; + cursor: inherit; + display: block; + font-size: 14px; } .clearfix:before, .clearfix:after { - content: " "; - display: table; - /* 2 */ + content: " "; + display: table; + /* 2 */ } .clearfix:after { - clear: both; + clear: both; } .clearfix { - *zoom: 1; + *zoom: 1; } .options { - margin-bottom: 8px; + margin-bottom: 8px; } .wrapper { - max-width: 140px; - max-height: 140px; + max-width: 140px; + max-height: 140px; } .imgthumb { - max-width: 100%; - max-height: 100%; - width: auto; + max-width: 100%; + max-height: 100%; + width: auto; } .btn-colorselector { - border-style: solid; - border-color: black; + border-style: solid; + border-color: black; } .popover { - max-width: 100%; - width: 500px; + max-width: 100%; + width: 500px; } .hideme { - display: none; + display: none; } .fc-list-table { - word-break: break-word; + word-break: break-word; } .fc-h-event .fc-event-time { - overflow: visible; + overflow: visible; } + .F { - table-layout: fixed; - width: 100%; + table-layout: fixed; + width: 100%; } .panel-collapsable a:after { - font-family:'Glyphicons Halflings'; - content:"\e114"; - float: right; - color: grey; + font-family: 'Glyphicons Halflings'; + content: "\e114"; + float: right; + color: grey; } + .panel-collapsable a.collapsed:after { - content:"\e080"; -} -.panel-titleDISABLED { - font-weight: 400; -} -labelDISABLED { - font-weight: normal; + content: "\e080"; } /* feed page */ .feed-square { - position: relative; - width: 100px; - height: 100px; - margin:0.50%; - overflow:hidden; + position: relative; + width: 100px; + height: 100px; + margin: 0.50%; + overflow: hidden; } + .feed-mycontent { - position:absolute; - height:100%; /* = 100% - 2*5% padding */ - width:100%; /* = 100% - 2*5% padding */ - padding-left: 2%; - + position: absolute; + height: 100%; + /* = 100% - 2*5% padding */ + width: 100%; + /* = 100% - 2*5% padding */ + padding-left: 2%; + } -.feed-mytable{ - display:table; - width:100%; - height:100%; + +.feed-mytable { + display: table; + width: 100%; + height: 100%; } -.feed-table-cell{ - display:table-cell; - vertical-align:bottom; + +.feed-table-cell { + display: table-cell; + vertical-align: bottom; } + /* For responsive images */ -.feed-mycontent .rs{ - width:auto; - height:auto; - max-height:90%; - max-width:100%; +.feed-mycontent .rs { + width: auto; + height: auto; + max-height: 90%; + max-width: 100%; } + /* For responsive images as background */ -.feed-bg{ - background-position:center center; - background-repeat:no-repeat; - background-size:cover; /* you change this to "contain" if you don't want the images to be cropped */ +.feed-bg { + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + /* you change this to "contain" if you don't want the images to be cropped */ +} + +.feed-mylink { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; } -.feed-mylink{ - position:absolute; - width:100%; - height:100%; - top:0; - left: 0; - z-index: 1; -} /* album page */ .album-header { - float:left; - position: relative; - width: 100%; - min-height:250px; - margin-bottom:10px; - overflow:hidden; + float: left; + position: relative; + width: 100%; + min-height: 250px; + margin-bottom: 10px; + overflow: hidden; } + .photos-square { - float:left; - position: relative; - width: 24%; - padding-bottom : 24%; /* = width for a 1:1 aspect ratio */ - margin:0.50%; - overflow:hidden; + float: left; + position: relative; + width: 24%; + padding-bottom: 24%; + /* = width for a 1:1 aspect ratio */ + margin: 0.50%; + overflow: hidden; + border-radius:4px; } + .photos-mycontent { - position:absolute; - height:100%; /* = 100% - 2*5% padding */ - width:100%; /* = 100% - 2*5% padding */ - padding: 5%; - + position: absolute; + height: 100%; + /* = 100% - 2*5% padding */ + width: 100%; + /* = 100% - 2*5% padding */ + padding: 5%; + } -.photos-mytable{ - display:table; - width:100%; - height:100%; + +.photos-mytable { + display: table; + width: 100%; + height: 100%; } -.photos-table-cell{ - display:table-cell; - vertical-align:bottom; + +.photos-table-cell { + display: table-cell; + vertical-align: bottom; } + /* For responsive images */ -.photos-mycontent .rs{ - width:auto; - height:auto; - max-height:90%; - max-width:100%; +.photos-mycontent .rs { + width: auto; + height: auto; + max-height: 90%; + max-width: 100%; } + /* For responsive images as background */ -.photos-bg{ - background-position:center center; - background-repeat:no-repeat; - background-size:cover; /* you change this to "contain" if you don't want the images to be cropped */ +.photos-bg { + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + /* you change this to "contain" if you don't want the images to be cropped */ +} + +.photos-mylink { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 1; } -.photos-mylink{ - position:absolute; - width:100%; - height:100%; - top:0; - left: 0; - z-index: 1; -} /* single photo */ .singlephoto-square { - float:left; - position: relative; - width: 100%; - padding-bottom : 70%; /* = width for a 1:1 aspect ratio */ - min-height:200px; - margin:0.50%; + float: left; + position: relative; + width: 100%; + padding-bottom: 70%; + /* = width for a 1:1 aspect ratio */ + min-height: 200px; + margin: 0.50%; } .singlephoto-mycontent { - position:absolute; - height:100%; /* = 100% - 2*5% padding */ - width:100%; /* = 100% - 2*5% padding */ + position: absolute; + height: 100%; + /* = 100% - 2*5% padding */ + width: 100%; + /* = 100% - 2*5% padding */ } -.singlephoto-mytable{ - display:table; - width:100%; - height:100%; + +.singlephoto-mytable { + display: table; + width: 100%; + height: 100%; } -.singlephoto-table-cell{ - display:table-cell; - vertical-align:middle; + +.singlephoto-table-cell { + display: table-cell; + vertical-align: middle; } + .singlephoto-table-cell a { - color: white; - display: block; - min-height:100%; - width:100%; + color: white; + display: block; + min-height: 100%; + width: 100%; } /* For responsive images */ -.singlephoto-mycontent .rs{ - width:auto; - height:auto; - max-height:90%; - max-width:100%; +.singlephoto-mycontent .rs { + width: auto; + height: auto; + max-height: 90%; + max-width: 100%; } + /* For responsive images as background */ -.singlephoto-bg{ - background-position:center center; - background-repeat:no-repeat; - background-size:contain; /* you change this to "contain" if you don't want the images to be cropped */ +.singlephoto-bg { + background-position: center center; + background-repeat: no-repeat; + background-size: contain; + /* you change this to "contain" if you don't want the images to be cropped */ } /* edit wiki page */ .wikiphoto-modal-body { - max-height: calc(100vh - 212px); - overflow-y: auto; + max-height: calc(100vh - 212px); + overflow-y: auto; } + .wikiphoto-square { - float:left; - position: relative; - width: 30%; - padding-bottom : 30%; /* = width for a 1:1 aspect ratio */ - margin:1.66%; - background-position:center center; - background-repeat:no-repeat; - background-size:cover; /* you change this to "contain" if you don't want the images to be cropped */ - border: 4px solid #ffffff; + float: left; + position: relative; + width: 30%; + padding-bottom: 30%; + /* = width for a 1:1 aspect ratio */ + margin: 1.66%; + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + /* you change this to "contain" if you don't want the images to be cropped */ + border: 4px solid #ffffff; } + .wikiphoto-selected { - border: 4px solid #668eaa; + border: 4px solid #668eaa; } /* group home */ .grouphome-fit { - max-width: 100%; - max-height: 100%; + max-width: 100%; + max-height: 100%; } + .grouphome-center { - display: block; - margin: auto; + display: block; + margin: auto; } /* database table */ .dbtable { - border-top: none; - border-bottom: none; - background-color: #FFF; + border-top: none; + border-bottom: none; + background-color: #FFF; } /* chat page autocomplete */ .ui-autocomplete { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - max-height: 400px; - overflow-y: scroll; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - font-size: 14px; - text-align: left; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + max-height: 400px; + overflow-y: scroll; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; } -.ui-autocomplete > li > div { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333333; - white-space: nowrap; +.ui-autocomplete>li>div { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333333; + white-space: nowrap; } .ui-state-hover, .ui-state-active, .ui-state-focus { - text-decoration: none; - color: #262626; - background-color: #f5f5f5; - cursor: pointer; + text-decoration: none; + color: #262626; + background-color: #f5f5f5; + cursor: pointer; } .ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } .event-dot { - display: inline-block; - width: 10px; - height: 10px; - border-radius: 5px; + display: inline-block; + width: 10px; + height: 10px; + border-radius: 5px; } .album-owner a { - color: white; + color: white; } /* mobile hamburger drawer */ .drawer { - display: none; + display: none; } + .drawer__header { - padding: 1.5rem; - display: flex; - justify-content: space-between; - align-items: center; - border-bottom: 1px solid #ddd; + padding: 1.5rem; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid #ddd; } .drawer__close { - margin: 0; - padding: 0; - border: none; - background-color: transparent; - cursor: pointer; - background-image: url("data:image/svg+xml,%0A%3Csvg width='15px' height='16px' viewBox='0 0 15 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg id='Page-1' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='2.-Menu' transform='translate(-15.000000, -13.000000)' stroke='%23000000'%3E%3Cg id='Group' transform='translate(15.000000, 13.521000)'%3E%3Cpath d='M0,0.479000129 L15,14.2971819' id='Path-3'%3E%3C/path%3E%3Cpath d='M0,14.7761821 L15,-1.24344979e-14' id='Path-3'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); - width: 15px; - height: 15px; + margin: 0; + padding: 0; + border: none; + background-color: transparent; + cursor: pointer; + background-image: url("data:image/svg+xml,%0A%3Csvg width='15px' height='16px' viewBox='0 0 15 16' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cg id='Page-1' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='2.-Menu' transform='translate(-15.000000, -13.000000)' stroke='%23000000'%3E%3Cg id='Group' transform='translate(15.000000, 13.521000)'%3E%3Cpath d='M0,0.479000129 L15,14.2971819' id='Path-3'%3E%3C/path%3E%3Cpath d='M0,14.7761821 L15,-1.24344979e-14' id='Path-3'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E"); + width: 15px; + height: 15px; } .drawer__wrapper { - position: fixed; - top: 0; - right: 0; - bottom: 0; - height: 100%; - width: 100%; - max-width: 500px; - z-index: 9999; - overflow: auto; - transition: transform 0.3s; - will-change: transform; - background-color: #fff; - display: flex; - flex-direction: column; - -webkit-transform: translateX(103%); - transform: translateX(103%); /* extra 3% because of box-shadow */ - -webkit-overflow-scrolling: touch; /* enables momentum scrolling in iOS overflow elements */ - box-shadow: 0 2px 6px #777; - padding-top: max(0px, env(safe-area-inset-top)); + position: fixed; + top: 0; + right: 0; + bottom: 0; + height: 100%; + width: 100%; + max-width: 500px; + z-index: 9999; + overflow: auto; + transition: transform 0.3s; + will-change: transform; + background-color: #fff; + display: flex; + flex-direction: column; + -webkit-transform: translateX(103%); + transform: translateX(103%); + /* extra 3% because of box-shadow */ + -webkit-overflow-scrolling: touch; + /* enables momentum scrolling in iOS overflow elements */ + box-shadow: 0 2px 6px #707070; + padding-top: max(0px, env(safe-area-inset-top)); } .drawer__content { - position: relative; - overflow-x: hidden; - overflow-y: auto; - height: 100%; - flex-grow: 1; - padding: 1.5rem; + position: relative; + overflow-x: hidden; + overflow-y: auto; + height: 100%; + flex-grow: 1; + padding: 1.5rem; } .drawer.is-active { - display: inline-block; + display: inline-block; } .drawer.is-visible .drawer__wrapper { - -webkit-transform: translateX(0); - transform: translateX(0); + -webkit-transform: translateX(0); + transform: translateX(0); } .drawer.is-visible .drawer__overlay { - opacity: 0.5; + opacity: 0.5; } .drawer__overlay { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - width: 100%; - z-index: 200; - opacity: 0; - transition: opacity 0.3s; - will-change: opacity; - background-color: #000; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + z-index: 200; + opacity: 0; + transition: opacity 0.3s; + will-change: opacity; + background-color: #000; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } .drawer--left .drawer__wrapper { - left: 0; - right: auto; - -webkit-transform: translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0); + left: 0; + right: auto; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); } .drawer--bottom .drawer__wrapper { @@ -3577,23 +4058,9 @@ labelDISABLED { /* extra 3% because of box-shadow */ } -@supports (font: -apple-system-body) { - /* in the future to support dynamic text, will require additional work */ - body.appXX { - font: -apple-system-body !important; - font-size: 1rem; - line-height: initial; - } -} - -body.app { - padding-top: calc(60px + env(safe-area-inset-top)); - /*padding-left: max(12px, env(safe-area-inset-left)); - padding-right: max(12px, env(safe-area-inset-right));*/ -} body.app .navbar-fixed-top { - padding-top: max(0px, env(safe-area-inset-top)); - /*padding-bottom: max(20px, env(safe-area-inset-bottom));*/ + padding-top: max(0px, env(safe-area-inset-top)); + /*padding-bottom: max(20px, env(safe-area-inset-bottom));*/ } /* attachment display */ @@ -3664,6 +4131,7 @@ body.app .navbar-fixed-top { .attachment-box:hover .attachment-name-hover { opacity: 1; } + .delete-checkbox { position: absolute; top: 5px; @@ -3671,7 +4139,8 @@ body.app .navbar-fixed-top { } /* files move tree */ -.tree, .tree ul { +.tree, +.tree ul { margin: 0; padding: 0; list-style: none @@ -3743,16 +4212,25 @@ body.app .navbar-fixed-top { outline: 0; } +.maincontent-column { + height:100%; +} +.maincontent-chat-column { + overflow-y: auto; + height: 100%; + padding-right: 0px; + padding-left: 0px; +} + /* chat */ #chat-container { display: flex; flex-direction: column; width: 100%; - height: calc(100% - 50px); + height: calc(100% - 39px); margin: 0 auto; box-sizing: border-box; font-size: 17px; - font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; } #chat-messages { @@ -3811,7 +4289,7 @@ body.app .navbar-fixed-top { } .chat-message.sent .chat-message-content { - background-color: rgb(5,133,148); + background-color: rgb(5, 133, 148); color: rgb(224, 231, 243); } @@ -3886,6 +4364,10 @@ body.app .navbar-fixed-top { z-index: 10; } +.chat-emoji-box a { + text-decoration: none !important; +} + .chat-emoji { font-size: 1.4rem; margin-right: 5px; @@ -3927,6 +4409,7 @@ body.app .navbar-fixed-top { border: 1px solid #ccc; overflow: hidden; min-height: 34px; + outline: none; } #chat-username-popup { @@ -3946,7 +4429,7 @@ body.app .navbar-fixed-top { .chat-reply-bubble-us { padding: 0px 10px 0px 10px; - color: rgb(51,51,51); + color: rgb(51, 51, 51); background-color: rgb(245, 245, 245); width: 100% } @@ -3969,6 +4452,7 @@ body.app .navbar-fixed-top { cursor: pointer; } +/* .chat-html { height: 100%; } @@ -3989,11 +4473,20 @@ body.app .navbar-fixed-top { } .chat-maincontent { - height: 100%; + height: 100vh; padding-right: 0px; padding-left: 0px; padding-bottom: 0px; } +*/ + +.expanded-message { + border-radius:4px; + padding:10px; + border-width:1px; + border-style:solid; + border-color:#f8f8f8; +} /* htmx */ .load-indicator { @@ -4130,7 +4623,8 @@ body.app .navbar-fixed-top { /* Reduced width */ padding: 0 40px; /* Padding added */ - padding-top: env(safe-area-inset-top);} + padding-top: env(safe-area-inset-top); +} .viewer-arrow { color: #FFF; @@ -4233,6 +4727,31 @@ body.app .navbar-fixed-top { color: white; } +.truncate-one-line { + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; +} +.truncate-two-lines { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} +.truncate-three-lines { + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} +.truncate-four-lines { + display: -webkit-box; + -webkit-line-clamp: 4; + -webkit-box-orient: vertical; + overflow: hidden; +} + .database-truncate-cell { position: relative; line-height: 1.2em; @@ -4243,7 +4762,6 @@ body.app .navbar-fixed-top { padding-bottom: 1.2em; /* Equal to line height to make space for 'Show More' link */ } - .database-text-container { display: -webkit-box; -webkit-line-clamp: 2; @@ -4251,34 +4769,1230 @@ body.app .navbar-fixed-top { overflow: hidden; text-overflow: ellipsis; } - .database-show-more { display: none; } +.list-group-item.sidebar-item { + border: none !important; + padding-top: 8px; + padding-bottom: 8px; +} + +.list-group-item.sidebar-section { + border: none !important; + padding-top: 8px; + padding-bottom: 8px; +} + +.list-group-item.sidebar-section:hover { + background-color: transparent; +} + +.list-group-item>.badge { + float: none; +} + +.sidebar-divider-padding { + padding-top:8px; + padding-bottom:8px; +} + +.sidebar-item-divider { + border: none; + height: 1px; + background-color: #ccc; + padding-top: 1px; + padding-bottom: 1px; +} + +.sidebar-item-divider-label { + font-size:12px; + margin-left:20px; + margin-right:0px; + color: #707070; +} + +.sidebar-item-divider-hr { + margin-top: 10px; + margin-bottom: 0px; + border-top-color: #ccc; +} + +.sidebar-item-smalldivider { + border: none; + height: 1px; + background-color: #ccc; + padding-top: 1px; + padding-bottom: 1px; + width: 90%; + margin: auto; +} + +.autocomplete-highlight { + font-weight: bold; +} + +.autocomplete-list-item { + padding: 5px; + cursor: pointer; + font-size: 16px; + border: 0px; +} + +.autocomplete-list-item:not(.no-hover):hover { + background-color: #337ab7; + color: #fff; +} + + +.tooltip-inner { + text-align: left; + background-color: rgb(36,37,38); +} +.tooltip-arrow { + border-top-color: rgb(36,37,38) !important; +} + +.large-tooltip + .tooltip .tooltip-inner { + min-width: 400px !important; +} + +.hashtag-position { + position: relative; + top: -2px; +} + +.list-group-item-nohover:hover { + background-color: transparent !important; +} + +@media (min-width: 1200px) { + + .col-xl-1, + .col-xl-2, + .col-xl-3, + .col-xl-4, + .col-xl-5, + .col-xl-6, + .col-xl-7, + .col-xl-8, + .col-xl-9, + .col-xl-10, + .col-xl-11, + .col-xl-12 { + float: left; + } + + .col-xl-12 { + width: 100%; + } + + .col-xl-11 { + width: 91.66666667%; + } + + .col-xl-10 { + width: 83.33333333%; + } + + .col-xl-9 { + width: 75%; + } + + .col-xl-8 { + width: 66.66666667%; + } + + .col-xl-7 { + width: 58.33333333%; + } + + .col-xl-6 { + width: 50%; + } + + .col-xl-5 { + width: 41.66666667%; + } + + .col-xl-4 { + width: 33.33333333%; + } + + .col-xl-3 { + width: 25%; + } + + .col-xl-2 { + width: 16.66666667%; + } + + .col-xl-1 { + width: 8.33333333%; + } +} +.calendar-date { + width: 65px; + text-align: center; + border-radius: 4px; + display:inline-block; + vertical-align:top; +} + +.calendar-date .calendar-month { + background-color: rgb(230, 55, 87); + border-radius: 4px 4px 0 0; + padding: 2px; + font-weight: 600; +} + +.calendar-date .calendar-day { + border: 2px solid rgba(230, 55, 87, 0.3); + border-top: 0; + border-radius: 0 0 4px 4px; + font-weight: 700; +} + +.sticky-sidebar { + position: -webkit-sticky; + position: sticky; + top: calc(70px + env(safe-area-inset-top)); +} + +/* pulled in from Bootstrap 5 */ .fs-1 { font-size: 40px; } - -/* Larger */ .fs-2 { font-size: 32px; } - .fs-3 { font-size: 28px; } - .fs-4 { font-size: 24px; } - .fs-5 { font-size: 20px; } - -/* Default */ .fs-6 { font-size: 16px; } +.fs-7 { + font-size: 14px; +} + +.mt-0 { + margin-top: 0 !important; +} +.mb-0 { + margin-bottom: 0 !important; +} +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.ms-0 { + margin-left: 0 !important; +} +.me-0 { + margin-right: 0 !important; +} +.mx-0 { + margin-left: 0 !important; + margin-right: 0 !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.px-0 { + padding-left: 0 !important; + padding-right: 0 !important; +} + +.Xmce-statusbar { + border:0 !important; +} + +.Xmce-panel { + border-color: rgb(204,204,204); +} + +.select2-selection, +.select2-selection__arrow { + height: 33px !important; +} + +.select2-selection__rendered { + line-height: 31px !important +} + +.background-color { + background-color: var(--light-mode-body-color) !important; +} + +.primary-background-color { + background-color: var(--light-mode-primary-color); +} + +.highlight-background-color { + background-color: var(--light-mode-highlight-color); +} + +.table-background-color { + background-color: var(--light-mode-primary-color); +} + +.table-highlight-background-color { + background-color: var(--light-mode-highlight-color); +} + +.panel { + background-color: var(--light-mode-primary-color); +} + +.panel-default { + background-color: var(--light-mode-primary-color); + border-color: var(--light-mode-primary-color); +} + +.panel-interior { + background-color: var(--light-mode-body-color) !important; +} + +.panel-default .panel-heading { + background-color: var(--light-mode-highlight-color); + border-color: var(--light-mode-divider); + border-bottom-width:0px; +} + +.panel-default .panel-footer { + background-color: var(--light-mode-highlight-color); + border-color: var(--light-mode-divider); +} + +.table { + background-color: var(--light-mode-primary-color); + border-color: var(--light-mode-divider); +} + +thead { + background-color: var(--light-mode-highlight-color); +} + +/* Striped Table Rows */ +.table-striped>tbody>tr:nth-of-type(odd) { + background-color: var(--light-mode-primary-color); + /* Darker stripe for odd rows */ +} + +.table-striped>tbody>tr:nth-of-type(even) { + background-color: var(--light-mode-highlight-color); + /* Lighter stripe for even rows */ +} + +.table th, +.table td { + border-color: var(--light-mode-divider); +} + +.table-bordered { + border: 0px; +} + +/* Target the first th of thead for top-left corner */ +.table thead th:first-child { + border-top-left-radius: 4px; + /* Adjust this value as needed */ +} + +/* Target the last th of thead for top-right corner */ +.table thead th:last-child { + border-top-right-radius: 4px; + /* Adjust this value as needed */ +} + +/* Step 1: Style the elements of the first row of every table */ +.table>tbody>tr:first-child>td { + border-radius: 4px; + border-top-width: 0px; +} + +.table>thead>tr>th, +.table>thead>tr>td { + border-bottom-width: 0px; +} + +.transparent-editor { + opacity: 0.4; +} + +.tox-textfield, +.tox-toolbar-textfield { + background-color: rgb(255,255,255) !important; +} + +.feed-border { + border-bottom: 1px solid #eee; +} + + +.navbar-vertical .dropdown-indicator { + padding-right: 1rem !important; +} + +.dropdown-indicator { + position: relative; +} + +.dropdown-indicator[aria-expanded=true]:after { + -webkit-transform: translateY(-50%) rotate(225deg); + -ms-transform: translateY(-50%) rotate(225deg); + transform: translateY(-50%) rotate(225deg); +} + +.dropdown-indicator:after { + content: ""; + display: block; + position: absolute; + left: 190px; + height: .8rem; + width: .8rem; + border-right: 2px solid var(--light-mode-text-color); + border-bottom: 2px solid var(--light-mode-text-color); + top: 50%; + -webkit-transform: translateY(-50%) rotate(45deg); + -ms-transform: translateY(-50%) rotate(45deg); + transform: translateY(-50%) rotate(45deg); + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; + -webkit-transform-origin: center; + -ms-transform-origin: center; + transform-origin: center; + -webkit-transition-property: border-color, -webkit-transform; + transition-property: border-color, -webkit-transform; + -o-transition-property: transform, border-color; + transition-property: transform, border-color; + transition-property: transform, border-color, -webkit-transform; +} + +body.dark-mode .dropdown-indicator:after { + border-right-color: var(--dark-mode-text-color); + border-bottom-color: var(--dark-mode-text-color); +} + +body.dark-mode .feed-border { + border-bottom: 1px solid var(--dark-mode-divider); +} + +body.dark-mode .label-primary { + color: rgb(255,255,255) !important; +} + +body.dark-mode .label-info { + background-color: #3da8c0; + border-color: #3da8c0; +} + +body.dark-mode { + background-color: var(--dark-mode-body-color); + color: var(--dark-mode-text-color); +} + +body.dark-mode .background-color { + background-color: var(--dark-mode-body-color) !important; +} + +body.dark-mode .primary-background-color { + background-color: var(--dark-mode-primary-color); +} +body.dark-mode .highlight-background-color { + background-color: var(--dark-mode-highlight-color); +} +body.dark-mode .table-background-color { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .table-highlight-background-color { + background-color: var(--dark-mode-highlight-color); +} + +body.dark-mode a { + color: #7da8d4; +} + +body.dark-mode a:hover, +body.dark-mode a:focus { + color: #4a7ca3; +} + +body.dark-mode a.showvisited:visited, +body.dark-mode a.button-link, +body.dark-mode .wikidisplay a:visited, +body.dark-mode .thread-attribution, +body.dark-mode .truncate-two-lines+div, +body.dark-mode .text-muted, +body.dark-mode .breadcrumb>.active, +body.dark-mode .help-block { + color: #999999 !important; +} + +body.dark-mode pre { + color: var(--dark-mode-text-color); + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode h1, +body.dark-mode h2, +body.dark-mode h3, +body.dark-mode h4, +body.dark-mode h5, +body.dark-mode h6 { + color: var(--dark-mode-text-color); +} + +body.dark-mode .text-muted, +body.dark-mode .breadcrumb>.active, +body.dark-mode .help-block, +body.dark-mode .dropdown-header { + color: #999; +} + +body.dark-mode .jumbotron { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .form-control { + background-color: var(--dark-mode-input-color); + color: var(--dark-mode-text-color); + border-color: var(--dark-mode-divider); +} + +body.dark-mode .form-control:focus { + border-color: #337ab7; + box-shadow: 0 0 5px rgba(98, 0, 238, 0.5); +} + +body.dark-mode .form-control:focus { + border-color: #337ab7; + box-shadow: 0 0 5px rgba(98, 0, 238, 0.5); +} + +body.dark-mode .input-group-addon { + background-color: #444; + border-color: #444; + color: var(--dark-mode-text-color); +} + +body.dark-mode input[type="text"], +body.dark-mode input[type="file"], +body.dark-mode textarea, +body.dark-mode input[type="password"] { + background-color: var(--dark-mode-input-color); +} + +body.dark-mode .Xmce-widget, +body.dark-mode .Xmce-txt, +body.dark-mode .Xmce-ico { + color: var(--dark-mode-text-color) !important; + background-color: var(--dark-mode-primary-color) !important; + border-color: rgba(0,0,0,0) !important; +} + +body.dark-mode .Xmce-panel { + color: var(--dark-mode-text-color) !important; + background-color: var(--dark-mode-primary-color) !important; + border-color: #555 !important; +} + +body.dark-mode.Xmce-content-body { + background-color: var(--dark-mode-input-color) !important; + border-color: #555; +} + +/* Checkboxes */ +body.dark-mode input[type="checkbox"] { + color: var(--dark-mode-input-color); + background-color: var(--dark-mode-input-color); + border-color: #555; +} + +/* If you're using labels alongside checkboxes */ +body.dark-mode label { + color: var(--dark-mode-text-color); +} + +/* Hover State */ +body.dark-mode input[type="checkbox"]:hover, +body.dark-mode input[type="checkbox"]:focus { + border-color: #bb86fc; + outline: none; + /* Remove the default browser outline */ +} + +/* Checked State */ +body.dark-mode input[type="checkbox"]:checked { + background-color: #555; + border-color: #bb86fc; + /* A brighter border color for checked state */ +} + +body.dark-mode .panel { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .panel-default { + background-color: var(--dark-mode-primary-color); + border-color: var(--dark-mode-primary-color); +} + +body.dark-mode .panel-interior { + background-color: var(--dark-mode-body-color) !important; +} + +body.dark-mode .panel-default .panel-heading { + background-color: var(--dark-mode-highlight-color); + color: var(--dark-mode-text-color); + border-color: var(--dark-mode-divider); +} + +body.dark-mode .panel-default .panel-footer { + background-color: var(--dark-mode-highlight-color); + color: var(--dark-mode-text-color); + border-color: var(--dark-mode-divider); +} + +body.dark-mode .note-toolbar { + background-color: var(--dark-mode-primary-color) !important; + color: var(--dark-mode-text-color) !important; + border-color: var(--dark-mode-primary-color) !important; +} + +body.dark-mode .hashtag-btn { + color: var(--dark-mode-text-color); +} + +body.dark-mode .label { + color: var(--dark-mode-reverse-text-color); +} + +body.dark-mode .well { + background-color: #333; + border-color: #444; + color: var(--dark-mode-text-color); +} + +body.dark-mode .close { + color: var(--dark-mode-text-color); +} + +body.dark-mode .likestats { + color: var(--dark-mode-light-text-color); +} + +body.dark-mode .alert-success { + color: #d3e9d4; + background-color: #254119; + border-color: #254119; +} + +body.dark-mode .alert-info { + color: #c0e1f1; + background-color: #1b6082; + border-color: #1b6082; +} + + +body.dark-mode .alert-warning { + background-color: rgb(51, 39, 1); + border-color: rgb(51, 39, 1); + color: rgb(255, 218, 106); +} + +body.dark-mode .alert-danger { + background-color: rgb(44, 11, 14); + border-color: rgb(44, 11, 14); + color: rgb(234, 134, 143); +} + +/* Badge */ +body.dark-mode .badge { + background-color: #a5a5a5; + color: var(--dark-mode-primary-color); +} + +body.dark-mode .navbar .badge { + background-color: #a5a5a5; + color: var(--dark-mode-primary-color); +} + +body.dark-mode .navbar-default { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .navbar-default { + border-color: #000; +} + +body.dark-mode .navbar-default .navbar-nav>li>a { + color: var(--dark-mode-text-color); +} + +body.dark-mode .navbar-default .navbar-nav>li>a:hover, +body.dark-mode .navbar-default .navbar-nav>li>a:focus { + color: var(--dark-mode-text-color); + background-color: #555; +} + +body.dark-mode ul, +body.dark-mode ol { + color: var(--dark-mode-text-color); +} + +body.dark-mode li { + border-color: var(--dark-mode-divider); +} + +/* List Groups */ +body.dark-mode .list-group-item { + color: var(--dark-mode-text-color); + background-color: var(--dark-mode-body-color); + border: 1px solid var(--dark-mode-highlight-color); +} + +body.dark-mode .list-group-item.active, +body.dark-mode .list-group-item.active:hover, +body.dark-mode .list-group-item.active:focus { + /*color: var(--dark-mode-text-color);*/ + color: #ffffff; + background-color: #337ab7; + border-color: #5393d1; +} + + +body.dark-mode .list-group-item.sidebar-section:hover { + background-color: var(--dark-mode-primary-color) !important; +} + +body.dark-mode .sidebar-divider-padding { + background-color: var(--dark-mode-body-color); +} + +body.dark-mode .sidebar-item-divider { + background-color: var(--dark-mode-highlight-color); +} + +body.dark-mode .sidebar-item-smalldivider { + background-color: var(--dark-mode-highlight-color); +} + +/* If using list group with links */ +body.dark-mode .list-group-item:hover { + background-color: var(--dark-mode-highlight-color); +} + +body.dark-mode .list-group-item-heading { + color: var(--dark-mode-text-color); + /* Making headings more prominent */ +} + +body.dark-mode .list-group-item-text { + color: #b0b0b0; + /* Slightly muted text */ +} + +body.dark-mode a.list-group-item { + color: rgb(224, 224, 224); +} + + +body.dark-mode th { + font-weight: 300; +} + +/* + a.list-group-item:hover, + a.list-group-item:focus { + color: rgb(85, 85, 85); + } +*/ + +body.dark-mode .scrollbar::-webkit-scrollbar-thumb { + background-color: var(--dark-mode-divider) +} + +/* Pagination */ +body.dark-mode .pagination>li>a, +body.dark-mode .pagination>li>span { + color: var(--dark-mode-text-color); + background-color: var(--dark-mode-primary-color); + border: 1px solid var(--dark-mode-highlight-color); +} + +body.dark-mode .pagination>li>a:hover, +body.dark-mode .pagination>li>span:hover { + color: var(--dark-mode-text-color); + background-color: var(--dark-mode-highlight-color); + border-color: #444; +} + +body.dark-mode .pagination>.active>a, +body.dark-mode .pagination>.active>span, +body.dark-mode .pagination>.active>a:hover, +body.dark-mode .pagination>.active>span:hover, +body.dark-mode .pagination>.active>a:focus, +body.dark-mode .pagination>.active>span:focus { + color: var(--dark-mode-text-color); + background-color: #337ab7; + border-color: #5393d1; +} + +body.dark-mode .pagination>.disabled>span, +body.dark-mode .pagination>.disabled>span:hover, +body.dark-mode .pagination>.disabled>a, +body.dark-mode .pagination>.disabled>a:hover, +body.dark-mode .pagination>.disabled>a:focus { + color: #999999; + background-color: var(--dark-mode-primary-color); + border-color: var(--dark-mode-divider); + cursor: not-allowed; +} + +body.dark-mode .label>a, +body.dark-mode .label>a:hover { + color: var(--dark-mode-text-color); +} + + +/* Breadcrumbs */ +body.dark-mode .breadcrumb { + background-color: var(--dark-mode-primary-color); + color: var(--dark-mode-text-color); +} + +body.dark-mode .breadcrumb>li+li:before { + color: #999999; +} + +body.dark-mode a.button-link { + color: #999999 !important; +} + +body.dark-mode .table { + background-color: var(--dark-mode-primary-color); + border-color: var(--dark-mode-divider); +} + +body.dark-mode thead { + background-color: var(--dark-mode-highlight-color); +} +/* +body.dark-mode tr:hover { + background-color: var(--dark-mode-highlight-color); +} +*/ +/* Striped Table Rows */ +body.dark-mode .table-striped>tbody>tr:nth-of-type(odd) { + background-color: var(--dark-mode-primary-color); + /* Darker stripe for odd rows */ +} + +body.dark-mode .table-striped>tbody>tr:nth-of-type(even) { + background-color: var(--dark-mode-highlight-color); + /* Lighter stripe for even rows */ +} + +body.dark-mode .table th, +body.dark-mode .table td { + border-color: var(--dark-mode-divider); +} +body.dark-mode .table-bordered { + border: 0px; +} + +/* Target the first th of thead for top-left corner */ +body.dark-mode .table thead th:first-child { + border-top-left-radius: 4px; + /* Adjust this value as needed */ +} + +/* Target the last th of thead for top-right corner */ +body.dark-mode .table thead th:last-child { + border-top-right-radius: 4px; + /* Adjust this value as needed */ +} + +/* Step 1: Style the elements of the first row of every table */ +body.dark-mode .table>tbody>tr:first-child>td { + border-radius: 4px; + border-top-width: 0px; +} + +/* Step 2: Override that style for tables with a */ +body.dark-mode .table>thead+tbody>tr:first-child>td { + border-topXX: 0px; +} + + +body.dark-mode .table>thead>tr>th, +body.dark-mode .table>thead>tr>td { + border-bottom-width: 0px; + border-color: #666; + /* Making header borders slightly brighter */ +} + + +/* Default Button */ +body.dark-mode .btn-default { + background-color: #444; + border-color: #444; + color: var(--dark-mode-text-color); +} + +body.dark-mode .btn-default:hover, +body.dark-mode .btn-default:focus, +body.dark-mode .btn-default:active { + background-color: #555; + border-color: #444; +} + +/* Primary Button */ +body.dark-mode .btn-primary { + background-color: #337ab7; + border-color: #337ab7; + color: var(--dark-mode-text-color); +} + +body.dark-mode .btn-primary:hover, +body.dark-mode .btn-primary:focus, +body.dark-mode .btn-primary:active { + background-color: #5393d1; + border-color: #5393d1; +} + +/* Success Button */ +body.dark-mode .btn-success { + background-color: #388e3c; + border-color: #2e7d32; + color: var(--dark-mode-text-color); +} + +body.dark-mode .btn-success:hover, +body.dark-mode .btn-success:focus, +body.dark-mode .btn-success:active { + background-color: #2e7d32; + border-color: #1b5e20; +} + +/* Info Button */ +body.dark-mode .btn-info { + color: var(--dark-mode-reverse-text-color); + background-color: #3da8c0; + border-color: #3da8c0; +} + +body.dark-mode .btn-info:hover, +body.dark-mode .btn-info:focus, +body.dark-mode .btn-info:active { + background-color: #308a9e; + border-color: #308a9e; +} + +/* Warning Button */ +body.dark-mode .btn-warning { + background-color: rgb(245, 128, 62); + border-color: rgb(245, 128, 62); + color: var(--dark-mode-reverse-text-color); +} + +body.dark-mode .btn-warning:hover, +body.dark-mode .btn-warning:focus, +body.dark-mode .btn-warning:active { + background-color: rgb(245, 128, 62); + border-color: rgb(245, 128, 62); +} + +/* Danger Button */ +body.dark-mode .btn-danger { + background-color: #d32f2f; + border-color: #c62828; + color: var(--dark-mode-text-color); +} + +body.dark-mode .btn-danger:hover, +body.dark-mode .btn-danger:focus, +body.dark-mode .btn-danger:active { + background-color: #c62828; + border-color: #b71c1c; +} + +/* Dropdown Menus */ +body.dark-mode .dropdown-menu { + background-color: var(--dark-mode-primary-color); + border-color: var(--dark-mode-divider); +} + +body.dark-mode .dropdown-menu>li>a { + color: var(--dark-mode-text-color); +} + +body.dark-mode .dropdown-menu>li>a:hover, +body.dark-mode .dropdown-menu>li>a:focus { + color: var(--dark-mode-text-color); + background-color: var(--dark-mode-highlight-color); +} + +body.dark-mode .dropdown-menu>.active>a, +body.dark-mode .dropdown-menu>.active>a:hover, +body.dark-mode .dropdown-menu>.active>a:focus { + color: var(--dark-mode-text-color); + background-color: #6200ee; +} + +body.dark-mode .dropdown-menu>.disabled>a, +body.dark-mode .dropdown-menu>.disabled>a:hover, +body.dark-mode .dropdown-menu>.disabled>a:focus { + color: #999999; + background-color: transparent; +} + +body.dark-mode .divider { + background-color: #444; +} + +body.dark-mode .modal-content { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .modal-header { + background-color: var(--dark-mode-highlight-color); + border-color: var(--dark-mode-divider); +} + +body.dark-mode .modal-footer { + background-color: var(--dark-mode-primary-color); + border-color: var(--dark-mode-divider); +} + +body.dark-mode .chat-form { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .chat-message.received .chat-message-content, +body.dark-mode .chat-message.date .chat-message-content, +body.dark-mode .chat-timestamp-received, +body.dark-mode .chat-emoji-box { + background-color: rgb(200, 200, 200); + color: #333; +} +/* +body.dark-mode .chat-message.sent .chat-message-content { + background-color: rgb(5, 133, 148); + color: #333; +} +*/ +body.dark-mode #chat-unread-counter i { + color: rgb(200, 200, 200) !important; +} + +body.dark-mode .expanded-message { + border-style: none; +} + +body.dark-mode .dropdown-menu { + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .5); + box-shadow: 0 6px 12px rgba(0, 0, 0, .5); +} + +body.dark-mode .modal-header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +body.dark-mode .modal-footer { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +body.dark-mode .mobilebadge { + background-color: #d43f3a !important; + border: 0px; +} + +body.dark-mode .drawer__wrapper { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .thumbnail { + border: 0px; + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .alert-gray { + color: var(--dark-mode-text-color); + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .autocomplete-list-item:not(.no-hover):hover { + color: var(--dark-mode-text-color); +} +body.dark-mode .thread-attribution { + color: var(--dark-mode-light-text-color); +} + +body.dark-mode .hashtag-box-white { + background-color: var(--dark-mode-primary-color) !important; +} + +body.dark-mode .flatpickr-calendar * { + color: var(--dark-mode-text-color) !important; + fill: var(--dark-mode-text-color) !important; + background-color: var(--dark-mode-primary-color) !important; +} + +body.dark-mode .popover { + background-color: var(--dark-mode-primary-color) !important; + border-bottom-color: var(--dark-mode-primary-color) !important; + border: 1px solid var(--dark-mode-primary-color) !important +} + +body.dark-mode .popover-title { + background-color: var(--dark-mode-primary-color) !important; +} + +body.dark-mode .popover.bottom>.arrow:after { + border-bottom-color: var(--dark-mode-primary-color) !important; +} + +body.dark-mode .popover.top>.arrow:after { + border-top-color: var(--dark-mode-primary-color) !important; +} + +body.dark-mode .fc-list-event:hover * { + background-color: var(--dark-mode-body-color) !important; +} + +body.dark-mode .list-group-item-nohover:hover { + background-color: var(--dark-mode-body-color) !important; +} + +body.dark-mode .table-hover>tbody>tr:hover { + background-color: var(--dark-mode-body-color) !important; +} + +body.dark-mode .Xmce-btn.Xmce-active * { + background-color: var(--dark-mode-highlight-color) !important; +} + +body.dark-mode .subject { + font-weight: 400; +} + +body.dark-mode a.showvisited:visited { + /* visited link */ + color: #999999; +} + +body.dark-mode .select2-selection { + background-color: var(--dark-mode-primary-color) !important; + border-color: var(--dark-mode-divider); +} + +body.dark-mode .select2-dropdown * { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .select2-selection * { + color: var(--dark-mode-text-color) !important; +} + +body.dark-mode .select2-search__field { + border: 1px solid var(--dark-mode-divider) !important; +} + +body.dark-mode .select2-dropdown { + border: 1px solid var(--dark-mode-divider) !important; +} + +body.dark-mode .select2-results__options::-webkit-scrollbar, +body.dark-mode .autocompleteResults::-webkit-scrollbar { + /*-webkit-appearance: none;*/ + width: 6px; + height: 6px; + background-color: rgba(0, 0, 0, 0); +} + +body.dark-mode .select2-results__options::-webkit-scrollbar-thumb, +body.dark-mode .autocompleteResults::-webkit-scrollbar-thumb { + border-radius: 3px; + background-color: #ccc; +} + +/* +body.dark-mode .select2-selection__rendered:focus-visible { + outline:unset; +} +*/ + +body.dark-mode .user-content a span[style*="color"] { + color: #7da8d4 !important; +} +body.dark-mode .user-content *[style*="color"], +/* This works "color" and "background-color" properties */ +body.dark-mode .user-content *[style*="background"], +/* This gets the "background" property */ +body.dark-mode .user-content *[style*="COLOR"], +/* Style entries can be case sensitive. Some old messages use caps */ +body.dark-mode .user-content font { +/* HTML 4 tag used by a few older mssgs. It has different syntax */ + color: var(--dark-mode-text-color) !important; + /* For the selectors above, set all the text to the standard color */ + background-color: transparent !important; + /* and remove backgrounds so the Groups.io bkg shows through */ +} + +body.dark-mode .user-content a span { +/* User code typically adjusts link colors by putting a span inside an anchor tag */ + color: #7da8d4 !important; + background-color: transparent !important; +} + +body.dark-mode .toc li:before { + color: var(--dark-mode-text-color); +} + +body.dark-mode .attachment-box, +body.dark-mode .attachment-box:hover { + background-color: var(--dark-mode-primary-color); +} + +body.dark-mode .attachment-name, +body.dark-mode .attachment-name-hover { + background-color: var(--dark-mode-highlight-color); +} + +body.dark-mode .attachment-box:hover .attachment-icon, +body.dark-mode .attachment-box:hover .attachment-image { + opacity: unset; +} diff --git a/groups.io/g/MTFHRT/wiki/29602.html b/groups.io/g/MTFHRT/wiki/29602.html index b8b9a11f..6f38d904 100644 --- a/groups.io/g/MTFHRT/wiki/29602.html +++ b/groups.io/g/MTFHRT/wiki/29602.html @@ -6,7 +6,7 @@ - + @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774008.1713918438252779141"); + console.log("client_id:", "web.web08.236998.1714523377861077661"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774008.1713918438252779141" + client_id: "web.web08.236998.1714523377861077661" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { - + - - + + @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="30846.html"> + Home + </a> + </li> + + <li> + <a href="32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="29602/history.html"> - 265 revisions + 266 revisions </a>    <a href="29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -672,7 +1043,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919038&Signature=QzwdmdhXhABqHW%2F6ZcCUrnRvnYk%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523977&Signature=EQRRuU0iTM6vkjRNxk2QvLVmuf4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -688,10 +1059,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Hormone powders are sold not sterile, so any cleaning / sterilization efforts before terminal heat sterilization are futile. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919038&Signature=3ZsD7iwOK%2FToKXM3h6Hef%2FyJtJ8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523977&Signature=OSg7CS5h53aZnatCg8nDXDLW7Dk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919038&Signature=RcmgQshZxijfJHI00WdybYAKW1g%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523977&Signature=FIJmoXN1dRQMmYQTRyMNOVWM%2Fng%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919038&Signature=urfCj%2BmSL9D%2BJYSgiqO%2F3So%2FT%2FY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523977&Signature=ssKaDZFV%2BUjH1JmsCThkHiF04io%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -787,7 +1158,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Myth: <span style="background-color: #ff99cc;">decrease estrogen dosage post-op</span>. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.</p> <p>Myth: <span style="background-color: #ff99cc;">"estrogens" increase risk of blood clots, take Aspirin to counteract that</span>. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.</p> <p>Fallacy: <span style="background-color: #ff99cc;">stop "hormones" some time before SRS or another surgery, resume only some time later</span>. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.</p> -<p>Schizophrenic delusion: <span style="background-color: #ff99cc;">Chinese companies have been known to mix Ethinyl Estradiol into their hormone powders as a cheap way to boost efficacy</span>. The only way for end-users to check efficiacy is an usual blood test for estradiol level which ignores ethinylestradiol completely. Therefore, only a schizophrenic (literally) could produce this raving.</p> +<p>Schizophrenic delusion: <span style="background-color: #ff99cc;">Chinese companies have been known to mix Ethinyl Estradiol into their hormone powders as a cheap way to boost efficacy</span>. The only way for end-users to check efficacy is an usual blood test for estradiol level which ignores ethinylestradiol completely. Therefore, only a schizophrenic (literally) could produce this raving.</p> <p>Myth: <span style="background-color: #ff99cc;">libido and erections are signs of testosterone</span>. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.</p> <p>Myth: <span style="background-color: #ff99cc;">excess estrogen is converted to testosterone</span>. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly <span style="text-decoration: underline;"><a href="https://www.genome.jp/kegg-bin/show_pathway?hsa00140" target="_blank" rel="nofollow noopener">unidirectional</a></span>.</p> <p>Myth: <span style="background-color: #ff99cc;">if you take too much estradiol then SHBG will bind it and make it unusable</span>. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.</p> @@ -812,66 +1183,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="30846.html"> - Home - </a> - </li> - - <li> - <a href="32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -881,9 +1216,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -912,48 +1245,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -968,13 +1296,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -996,7 +1328,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1017,138 +1349,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1170,6 +1508,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30843/171363 b/groups.io/g/MTFHRT/wiki/29602/165198 similarity index 100% rename from groups.io/g/MTFHRT/wiki/30843/171363 rename to groups.io/g/MTFHRT/wiki/29602/165198 diff --git a/groups.io/g/MTFHRT/wiki/29602/165198.html b/groups.io/g/MTFHRT/wiki/29602/165198.html deleted file mode 100644 index 5e38708c..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165198.html +++ /dev/null @@ -1,1163 +0,0 @@ - - - <!DOCTYPE html> - <html lang="en-US"> - <head> - <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> - - <meta name="pinterest" content="nopin" /> - <meta name="pinterest" content="nohover" /> - - <meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" /> - <link rel="apple-touch-icon" sizes="57x57" href="https://groups.io/img/org.1/favicons/apple-icon-57x57.png"> - <link rel="apple-touch-icon" sizes="60x60" href="https://groups.io/img/org.1/favicons/apple-icon-60x60.png"> - <link rel="apple-touch-icon" sizes="72x72" href="https://groups.io/img/org.1/favicons/apple-icon-72x72.png"> - <link rel="apple-touch-icon" sizes="76x76" href="https://groups.io/img/org.1/favicons/apple-icon-76x76.png"> - <link rel="apple-touch-icon" sizes="114x114" href="https://groups.io/img/org.1/favicons/apple-icon-114x114.png"> - <link rel="apple-touch-icon" sizes="120x120" href="https://groups.io/img/org.1/favicons/apple-icon-120x120.png"> - <link rel="apple-touch-icon" sizes="144x144" href="https://groups.io/img/org.1/favicons/apple-icon-144x144.png"> - <link rel="apple-touch-icon" sizes="152x152" href="https://groups.io/img/org.1/favicons/apple-icon-152x152.png"> - <link rel="apple-touch-icon" sizes="180x180" href="https://groups.io/img/org.1/favicons/apple-icon-180x180.png"> - <link rel="icon" type="image/png" sizes="192x192" href="../../../../img/org.1/favicons/android-icon-192x192.png"> - <link rel="icon" type="image/png" sizes="32x32" href="../../../../img/org.1/favicons/favicon-32x32.png"> - <link rel="icon" type="image/png" sizes="96x96" href="../../../../img/org.1/favicons/favicon-96x96.png"> - <link rel="icon" type="image/png" sizes="16x16" href="../../../../img/org.1/favicons/favicon-16x16.png"> - <link rel="manifest" href="../../../../img/org.1/favicons/manifest.json"> - <meta name="msapplication-TileColor" content="#ffffff"> - <meta name="msapplication-TileImage" content="/ms-icon-144x144.png"> - - - - -<script> -/* stubs */ -const hapticsImpactHeavy = async () => { -}; -const hapticsImpactMedium = async () => { -}; -const hapticsImpactLight = async () => { -}; -const hapticsVibrate = async () => { -}; -const hapticsSelectionStart = async () => { -}; -const hapticsSelectionChanged = async () => { -}; -const hapticsSelectionEnd = async () => { -}; -</script> - - -<script> - - function setPullToRefresh() {} - - function gotoURL(inurl) { - window.location.href = inurl; - return; - } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); - if (isHTMX == true) { - document.body.addEventListener('htmx:afterSettle', f, {once: true}); - } else { - if (document.readyState !== 'loading') { - console.log('document is already ready, just execute code here'); - f(); - } else { - console.log('document was not ready, place code here'); - document.addEventListener('DOMContentLoaded', f, {once: true}); - } - } - } - - // stub - function logError(data, url, linenumber) { - console.log(data) - return; - } - var pushSubToken; - var ignoreErrors = false; - var lastError = ""; - - window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) { - let column; - let stack; - if (console && console.log) { - console.log("msg:", errorMessage); - console.log("url:", errorUrl); - console.log("line:", errorLine); - if (errorColumn !== undefined && errorObj != null) { - console.log("column:", errorColumn); - column = errorColumn; - } - if (errorObj !== undefined && errorObj != null) { - console.log("stack:", errorObj.stack); - stack = errorObj.stack; - } - console.log("client_id:", "web.web09.775166.1713918461071472582"); - console.log("last_error:", lastError); - } - if (errorUrl == "" || errorUrl === null) { - errorUrl = window.location.href; - } - if (errorMessage.includes("SecurityError:") == true) { - ignoreErrors = true; - } - if (ignoreErrors == true) { - console.log("cookies, disabled, ignoring"); - lastError = errorMessage; - return; - } - jQuery.ajax({ - type: 'POST', - url: '/jsclienterror', - data: { - msg: errorMessage, - url: errorUrl, - line: errorLine, - column: column, - stack: stack, - last_error: lastError, - client_id: "web.web09.775166.1713918461071472582" - }, - success: function() { - if (console && console.log) { - console.log('JS error report successful.'); - } - lastError = errorMessage; - }, - error: function() { - if (console && console.error) { - console.error('JS error report submission failed!'); - } - lastError = errorMessage; - } - }); - return true; - } - -</script> - - - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> - <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> - <script src="../../../../js/run_prettify.js"></script> - <title> - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/POftzXoyXIWn/China-Oestradiol-17-Heptanoate-CAS-4956-37-0-Estradiol-Enanthate-Door-to-Door-Service.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer. These pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity is used only for scientific experiments on rats and such. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or strip the outer paint from an aluminium can from beer or a soft drink with nail polish remover, then cut the can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/30843/171364 b/groups.io/g/MTFHRT/wiki/29602/165219 similarity index 100% rename from groups.io/g/MTFHRT/wiki/30843/171364 rename to groups.io/g/MTFHRT/wiki/29602/165219 diff --git a/groups.io/g/MTFHRT/wiki/29602/165219.html b/groups.io/g/MTFHRT/wiki/29602/165219.html deleted file mode 100644 index de028468..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165219.html +++ /dev/null @@ -1,1163 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/POftzXoyXIWn/China-Oestradiol-17-Heptanoate-CAS-4956-37-0-Estradiol-Enanthate-Door-to-Door-Service.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer. These pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity is used only for scientific experiments on rats and such. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/30843/171365 b/groups.io/g/MTFHRT/wiki/29602/165250 similarity index 100% rename from groups.io/g/MTFHRT/wiki/30843/171365 rename to groups.io/g/MTFHRT/wiki/29602/165250 diff --git a/groups.io/g/MTFHRT/wiki/29602/165250.html b/groups.io/g/MTFHRT/wiki/29602/165250.html deleted file mode 100644 index 0f164dc6..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165250.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/POftzXoyXIWn/China-Oestradiol-17-Heptanoate-CAS-4956-37-0-Estradiol-Enanthate-Door-to-Door-Service.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer. These pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity is used only for scientific experiments on rats and such. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/30843/171431 b/groups.io/g/MTFHRT/wiki/29602/165437 similarity index 100% rename from groups.io/g/MTFHRT/wiki/30843/171431 rename to groups.io/g/MTFHRT/wiki/29602/165437 diff --git a/groups.io/g/MTFHRT/wiki/29602/165437.html b/groups.io/g/MTFHRT/wiki/29602/165437.html deleted file mode 100644 index f57e4198..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165437.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer. These pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity is used only for scientific experiments on rats and such. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/30843/171432 b/groups.io/g/MTFHRT/wiki/29602/165467 similarity index 100% rename from groups.io/g/MTFHRT/wiki/30843/171432 rename to groups.io/g/MTFHRT/wiki/29602/165467 diff --git a/groups.io/g/MTFHRT/wiki/29602/165467.html b/groups.io/g/MTFHRT/wiki/29602/165467.html deleted file mode 100644 index 50c3eb90..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165467.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps this). These pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity is used only for scientific experiments on rats and such. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/32288/175560 b/groups.io/g/MTFHRT/wiki/29602/165469 similarity index 100% rename from groups.io/g/MTFHRT/wiki/32288/175560 rename to groups.io/g/MTFHRT/wiki/29602/165469 diff --git a/groups.io/g/MTFHRT/wiki/29602/165469.html b/groups.io/g/MTFHRT/wiki/29602/165469.html deleted file mode 100644 index 2995098e..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165469.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 or 2). These pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity is used only for scientific experiments on rats and such. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/34293/189320 b/groups.io/g/MTFHRT/wiki/29602/165470 similarity index 100% rename from groups.io/g/MTFHRT/wiki/34293/189320 rename to groups.io/g/MTFHRT/wiki/29602/165470 diff --git a/groups.io/g/MTFHRT/wiki/29602/165470.html b/groups.io/g/MTFHRT/wiki/29602/165470.html deleted file mode 100644 index 04fc874b..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165470.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 or 2). Vendors' pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity is used only for scientific experiments on rats and such. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/34293/189648 b/groups.io/g/MTFHRT/wiki/29602/165530 similarity index 100% rename from groups.io/g/MTFHRT/wiki/34293/189648 rename to groups.io/g/MTFHRT/wiki/29602/165530 diff --git a/groups.io/g/MTFHRT/wiki/29602/165530.html b/groups.io/g/MTFHRT/wiki/29602/165530.html deleted file mode 100644 index 211532c7..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165530.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and a spammer "Faithful". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 or 2). Vendors' pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity ("reference standard") is used only for calibration of measuring equipment and costs for example €353 for 100 mg. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/34293/201261 b/groups.io/g/MTFHRT/wiki/29602/165664 similarity index 100% rename from groups.io/g/MTFHRT/wiki/34293/201261 rename to groups.io/g/MTFHRT/wiki/29602/165664 diff --git a/groups.io/g/MTFHRT/wiki/29602/165664.html b/groups.io/g/MTFHRT/wiki/29602/165664.html deleted file mode 100644 index 391c300c..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165664.html +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and spammers "Faithful" and "Luoxing". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 or 2). Vendors' pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity ("reference standard") is used only for calibration of measuring equipment and costs for example €353 for 100 mg. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/34293/201262 b/groups.io/g/MTFHRT/wiki/29602/165830 similarity index 100% rename from groups.io/g/MTFHRT/wiki/34293/201262 rename to groups.io/g/MTFHRT/wiki/29602/165830 diff --git a/groups.io/g/MTFHRT/wiki/29602/165830.html b/groups.io/g/MTFHRT/wiki/29602/165830.html deleted file mode 100644 index 55caf5cd..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165830.html +++ /dev/null @@ -1,1165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

эта инструкция по-русски

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html
2) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and spammers "Faithful" and "Luoxing". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 or 2). Vendors' pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity ("reference standard") is used only for calibration of measuring equipment and costs for example €353 for 100 mg. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/34293/201265 b/groups.io/g/MTFHRT/wiki/29602/165840 similarity index 100% rename from groups.io/g/MTFHRT/wiki/34293/201265 rename to groups.io/g/MTFHRT/wiki/29602/165840 diff --git a/groups.io/g/MTFHRT/wiki/29602/165840.html b/groups.io/g/MTFHRT/wiki/29602/165840.html deleted file mode 100644 index 2d952288..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165840.html +++ /dev/null @@ -1,1165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

эта инструкция по-русски

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html
2) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and spammers "Faithful" and "Luoxing". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 or 2). Vendors' pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity ("reference standard") is used only for calibration of measuring equipment and costs for example €353 for 100 mg. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/29602/165842 b/groups.io/g/MTFHRT/wiki/29602/165842 new file mode 100644 index 00000000..51280cf4 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/29602/165842 @@ -0,0 +1 @@ +Too many requests, rate limited diff --git a/groups.io/g/MTFHRT/wiki/29602/165842.html b/groups.io/g/MTFHRT/wiki/29602/165842.html deleted file mode 100644 index 0077b4bb..00000000 --- a/groups.io/g/MTFHRT/wiki/29602/165842.html +++ /dev/null @@ -1,1165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - MTFHRT@groups.io | Wiki - - - - - - - - - - - - - - - - - - -
- - - -
- -
-
- - - - - - - - - - -
-
- -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- Last edited - - · - - 265 revisions - -    - - - -
-

-   -

-
- -
-
- - -

MtF HRT: Ultimate DIY

-

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

-

эта инструкция по-русски

-

-

Without gatekeepers

-

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

-

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

-

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

-

Be your own endocrinologist

-

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

-

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l.
In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

-

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

-

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

-

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

-

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

-

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

-

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp

-

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ Below I explain how you can cook injectable estradiol by yourself.

-

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

-

I advise everybody (not only MtF) to take a vitamins+minerals supplement like plain Centrum non-stop, all year round. If in USA then here or this. In Europe "One-a-Day" by Hungarian company "BiotechUSA" is cheaper in sports nutrition stores or Amazon.

-

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

-

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $76 (1 2 3a+3b) and is available not everywhere. In UK £89. In Australia $69. In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

-

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

-

In short: when it's about MtF HRT, doctors do not know better.

-

Cook your injectable estradiol by yourself

-

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you'll be able to buy ready-to-use vials from me after I return to Kiev - depends on the war. I have over 3300 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

-

Buy estradiol enanthate powder

-

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood. Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

-

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't.

-

Vendors I bought from:
1) https://aoksbio.en.made-in-china.com/product/gdnfPERUILkb/China-99-Purity-Oestradiol-17-Heptanoate-Powder-CAS-4956-37-0-with-Safe-Delivery-and-Good-Price.html
2) https://hbldbiotech.en.made-in-china.com/product/fdIAjtZoAGWq/China-Estradiol-Enanthate-CAS-4956-37-0-Large-Particle-or-Powder.html (later this seller was suspected to send not what ordered, so for now don't buy from them).

-

There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" and spammers "Faithful" and "Luoxing". Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol.

-

Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union.

-

Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 or 2). Vendors' pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (I gave zeros instead of phone number and wrote "private person" instead of company name) and use the "Get Latest Price" link, tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity ("reference standard") is used only for calibration of measuring equipment and costs for example €353 for 100 mg. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers to communicate via Whatsapp or other messengers, don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html

-

Vendors offer several payment options, "Alipay" or "trust insurance in Alibaba" allow payment with a card and take 3% fee.

-

If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

-

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

-

Equipment

-

Necessary

-

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

-

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

-

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

-

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120

-

https://www.aliexpress.com/wholesale?SearchText=scales+0.001g+diamond
(check all pages).

-

If the scales have slots for 4 batteries then insert only 2 at any one side.

-

Optional

-

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

-

You can buy a 129°C autoclave for $130, but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature, too much can burst a vial. Bead sterilizers not suitable.

-

American "homebrewing" bodybuilders were afraid that their anabolics would be "inactivated" during heat sterilization, so they started the filtering fad: they assumed (wrong) that 0.2 μm filtering sterilizes. Filtering is not a reliable sterilization. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE hydrophobic 0.22 μm 25 mm syringe filter and a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for a 10 ml Luer Lock syringe, a wide wooden plank/board, a 6 l (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100°C after filtering!

-

Unnecessary

-

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

-

Other raw materials and expendables

-

Vials, stoppers, caps

-

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/223836409810
https://www.aliexpress.com/item/32903943374.html
https://www.aliexpress.com/item/33024594919.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15

-

https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps

-

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

-

-

Oil

-

MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

-

Preservative (optional)

-

Optionally you can add a preservative (antibacterial): benzyl alcohol. You'll use up 7 ml for 30 years. If you are in USA then smallest bottle (20 ml) is $7 on eBay. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

-

Syringes for mixing

-

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

-

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

-

Mix

-

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

-

-

Two recipes I can recommend:

-

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

-

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

-

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Pour estradiol enanthate powder onto the funnel over the center of the circle on the scales until the scales show any number between 0.500 and 0.503
If you poured too much, take excess powder off with a knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

-

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

-

If some powder fell off, use knife tip to put most of it back into the bag.

-

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

-

Measure the MCT oil with a syringe and pour into the vial.

-

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

-

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

-

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

-

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be slightly less or slightly more than 100°C. Measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

-

Sterilize

-

For sterilization put the sealed vial into a pot with tap water, boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker then use it instead of a pot, else a pot is enough!

-

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

-

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

-

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

-

Begin a new vial

-

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

-

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

-

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

-

Keep

-

Keep the powder sealed airtight in a vial or in a bag with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), in standing position. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

-

Total price

-

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

-

20 g of estradiol enanthate powder $180 + Alipay/Alibaba fee 3%
Scales $14.26
10 vials with stoppers and caps $4.45
2 oz (60 ml) of MCT oil $5.99
20 ml of benzyl alcohol (preservative) $6.75
5 syringes 10 ml (for measuring MCT oil) $2.66
100 syringes for injections $14.94

-

20 g of estradiol enanthate powder will be enough to cook 39 vials which will last you 39*10/0.223*7/365= 33 years.

-

Initial expenses 180*1.03+14.26+4.45+5.99+6.75+2.66+14.94= $235

-

Total expenses during 33 years (180*1.03+14.26+4*4.45+7*5.99+6.75+2.66+18*14.94)/(33.5*12)= $1.34 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

-

Legal

-

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

-

Inject yourself

-

Syringes for injections

-

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

-

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

-

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

-

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

-

Or you can mail-order. Depending on country: USA (or search), Canada: 1 2, UK: 1 2 3, France: 1 2 3, Netherlands: 1 2 3, Germany, Italy, Spain: 1 2, Denmark, Finland, Mexico, Australia: 1 2, NZ, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3.

-

Needle fright

-

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

-

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day. 20 g will last you 33 months instead of 33 years, $5/month.

-

Dosage

-

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

-

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

-
-

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

-
-

That's on 4 times higher estradiol dosage than I advise.

-

How to inject

-

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

-

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

-

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

-
-

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

-
-

Also, you can read Introduction in a scientific article.

-

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

-

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

-

"Monitoring" unnecessary

-

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

-

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

-

Any estradiol level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

-

Myths and what not to do

-

Above I explained about some myths and fallacies. Some more:

-

Myth: discard a vial 30 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

-

Fallacy: use separate needles for drawing and injection. It's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule, it's where the myth of "needle blunting" originates. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers.

-

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

-

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

-

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

-

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

-

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

-

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

-

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

-

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

-

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

-

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

-

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

-

If you are wondering about real progesterone:

-

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

-

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

-

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

-

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

-

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

-

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it to be done right, Do It Yourself.

-
-

Another my how-to: voice.

-

Lena

-

- - -

- -
- - - -
-
-
-
- -
- - - -

-
- - - - - - - - - - - diff --git a/groups.io/g/MTFHRT/wiki/29602/165844.html b/groups.io/g/MTFHRT/wiki/29602/165844.html index 0e69491b..f84b19af 100644 --- a/groups.io/g/MTFHRT/wiki/29602/165844.html +++ b/groups.io/g/MTFHRT/wiki/29602/165844.html @@ -6,7 +6,7 @@ - + @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775113.1713918459871122950"); + console.log("client_id:", "web.web09.237884.1714523402184520262"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775113.1713918459871122950" + client_id: "web.web09.237884.1714523402184520262" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { - + - - + + @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=JhsRdi9r3rBcDsQ6Oaig4hxe%2FzM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=2D9vcXt%2FoB%2FSjITCY7Ls1is0kYw%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=1wXuCeGgbmVvWcNup9fh0iv42lQ%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=MrjRZF1pHVdxlnyXEaReILap4s8%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/165880.html b/groups.io/g/MTFHRT/wiki/29602/165880.html index a058c2c5..f452a1f5 100644 --- a/groups.io/g/MTFHRT/wiki/29602/165880.html +++ b/groups.io/g/MTFHRT/wiki/29602/165880.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775603.1713918459773720613"); + console.log("client_id:", "web.web08.238281.1714523402077069135"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775603.1713918459773720613" + client_id: "web.web08.238281.1714523402077069135" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=JhsRdi9r3rBcDsQ6Oaig4hxe%2FzM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=2D9vcXt%2FoB%2FSjITCY7Ls1is0kYw%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=1wXuCeGgbmVvWcNup9fh0iv42lQ%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524002&Signature=MrjRZF1pHVdxlnyXEaReILap4s8%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/165882.html b/groups.io/g/MTFHRT/wiki/29602/165882.html index fe636c1e..48364175 100644 --- a/groups.io/g/MTFHRT/wiki/29602/165882.html +++ b/groups.io/g/MTFHRT/wiki/29602/165882.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775105.1713918459672287324"); + console.log("client_id:", "web.web08.238275.1714523401942802347"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775105.1713918459672287324" + client_id: "web.web08.238275.1714523401942802347" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/165974.html b/groups.io/g/MTFHRT/wiki/29602/165974.html index d70c1332..be43e612 100644 --- a/groups.io/g/MTFHRT/wiki/29602/165974.html +++ b/groups.io/g/MTFHRT/wiki/29602/165974.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775103.1713918459572049218"); + console.log("client_id:", "web.web09.237860.1714523401856951517"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775103.1713918459572049218" + client_id: "web.web09.237860.1714523401856951517" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/165976.html b/groups.io/g/MTFHRT/wiki/29602/165976.html index 703a3596..075528b9 100644 --- a/groups.io/g/MTFHRT/wiki/29602/165976.html +++ b/groups.io/g/MTFHRT/wiki/29602/165976.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775098.1713918459472436815"); + console.log("client_id:", "web.web08.238253.1714523401747091744"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775098.1713918459472436815" + client_id: "web.web08.238253.1714523401747091744" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/165985.html b/groups.io/g/MTFHRT/wiki/29602/165985.html index 9f948830..844aafb6 100644 --- a/groups.io/g/MTFHRT/wiki/29602/165985.html +++ b/groups.io/g/MTFHRT/wiki/29602/165985.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775093.1713918459372138927"); + console.log("client_id:", "web.web09.237847.1714523401661150855"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775093.1713918459372138927" + client_id: "web.web09.237847.1714523401661150855" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water or collecting dust if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/165986.html b/groups.io/g/MTFHRT/wiki/29602/165986.html index 1c56e8e1..fbbac529 100644 --- a/groups.io/g/MTFHRT/wiki/29602/165986.html +++ b/groups.io/g/MTFHRT/wiki/29602/165986.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775587.1713918459273655428"); + console.log("client_id:", "web.web09.237845.1714523401575339812"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775587.1713918459273655428" + client_id: "web.web09.237845.1714523401575339812" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/166032.html b/groups.io/g/MTFHRT/wiki/29602/166032.html index 3b7542ef..88175f35 100644 --- a/groups.io/g/MTFHRT/wiki/29602/166032.html +++ b/groups.io/g/MTFHRT/wiki/29602/166032.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775089.1713918459171677645"); + console.log("client_id:", "web.web09.237843.1714523401487725691"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775089.1713918459171677645" + client_id: "web.web09.237843.1714523401487725691" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/166033.html b/groups.io/g/MTFHRT/wiki/29602/166033.html index b2183b02..d8166e56 100644 --- a/groups.io/g/MTFHRT/wiki/29602/166033.html +++ b/groups.io/g/MTFHRT/wiki/29602/166033.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775581.1713918459073580149"); + console.log("client_id:", "web.web09.237834.1714523401398946915"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775581.1713918459073580149" + client_id: "web.web09.237834.1714523401398946915" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=aFg1kwo7u9xK9ndSHZ4fV9dGvd4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=xUbDkICfTwF%2BWP3N%2Frdaynhj1n4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=PQHhJW1S0DisC17wscZSdZsxs2k%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919059&Signature=w3lkX9sEyUhp%2FobJauMEuLqYxzg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/167382.html b/groups.io/g/MTFHRT/wiki/29602/167382.html index c2593c29..6273f1e8 100644 --- a/groups.io/g/MTFHRT/wiki/29602/167382.html +++ b/groups.io/g/MTFHRT/wiki/29602/167382.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775075.1713918458972162573"); + console.log("client_id:", "web.web08.238235.1714523401290378208"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775075.1713918458972162573" + client_id: "web.web08.238235.1714523401290378208" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/167697.html b/groups.io/g/MTFHRT/wiki/29602/167697.html index c56a6711..6f1e1946 100644 --- a/groups.io/g/MTFHRT/wiki/29602/167697.html +++ b/groups.io/g/MTFHRT/wiki/29602/167697.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775564.1713918458873551062"); + console.log("client_id:", "web.web09.237828.1714523401201770825"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775564.1713918458873551062" + client_id: "web.web09.237828.1714523401201770825" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/167699.html b/groups.io/g/MTFHRT/wiki/29602/167699.html index 96ce01fc..b5231898 100644 --- a/groups.io/g/MTFHRT/wiki/29602/167699.html +++ b/groups.io/g/MTFHRT/wiki/29602/167699.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775060.1713918458771571410"); + console.log("client_id:", "web.web08.238228.1714523401104871767"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775060.1713918458771571410" + client_id: "web.web08.238228.1714523401104871767" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/167700.html b/groups.io/g/MTFHRT/wiki/29602/167700.html index 7fa5aeb1..01eb8812 100644 --- a/groups.io/g/MTFHRT/wiki/29602/167700.html +++ b/groups.io/g/MTFHRT/wiki/29602/167700.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775055.1713918458672700541"); + console.log("client_id:", "web.web08.238220.1714523401010480641"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775055.1713918458672700541" + client_id: "web.web08.238220.1714523401010480641" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5vG80QSXUtJ548d1ZqFPzY4sLEY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=V7ybqb%2FfKs%2BgPCtN3z7UniU3NqU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5ozDCXz4bSI9g9P02rp2KPqtIa4%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524001&Signature=5KcigR0HTlcC5Y3ujI5G5nhuzPE%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/167779.html b/groups.io/g/MTFHRT/wiki/29602/167779.html index d8497e7b..393027de 100644 --- a/groups.io/g/MTFHRT/wiki/29602/167779.html +++ b/groups.io/g/MTFHRT/wiki/29602/167779.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775547.1713918458574152857"); + console.log("client_id:", "web.web09.237811.1714523400923588681"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775547.1713918458574152857" + client_id: "web.web09.237811.1714523400923588681" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/168088.html b/groups.io/g/MTFHRT/wiki/29602/168088.html index b2737314..c40dbf89 100644 --- a/groups.io/g/MTFHRT/wiki/29602/168088.html +++ b/groups.io/g/MTFHRT/wiki/29602/168088.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775048.1713918458471982815"); + console.log("client_id:", "web.web09.237799.1714523400835388609"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775048.1713918458471982815" + client_id: "web.web09.237799.1714523400835388609" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/168292.html b/groups.io/g/MTFHRT/wiki/29602/168292.html index 30c75581..cd5a51c7 100644 --- a/groups.io/g/MTFHRT/wiki/29602/168292.html +++ b/groups.io/g/MTFHRT/wiki/29602/168292.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775046.1713918458371398851"); + console.log("client_id:", "web.web08.238199.1714523400739884139"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775046.1713918458371398851" + client_id: "web.web08.238199.1714523400739884139" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -673,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -797,66 +1168,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -866,9 +1201,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -897,48 +1230,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -953,13 +1281,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -981,7 +1313,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1002,138 +1334,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1155,6 +1493,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/168872.html b/groups.io/g/MTFHRT/wiki/29602/168872.html index 208e64d2..73dc4ef4 100644 --- a/groups.io/g/MTFHRT/wiki/29602/168872.html +++ b/groups.io/g/MTFHRT/wiki/29602/168872.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775041.1713918458272416552"); + console.log("client_id:", "web.web09.237792.1714523400651256420"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775041.1713918458272416552" + client_id: "web.web09.237792.1714523400651256420" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -688,10 +1059,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -798,66 +1169,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -867,9 +1202,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -898,48 +1231,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -954,13 +1282,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -982,7 +1314,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1003,138 +1335,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1156,6 +1494,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/169943.html b/groups.io/g/MTFHRT/wiki/29602/169943.html index 0eb92bfc..5aa2b04a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/169943.html +++ b/groups.io/g/MTFHRT/wiki/29602/169943.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775040.1713918458171500902"); + console.log("client_id:", "web.web08.238183.1714523400546672784"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775040.1713918458171500902" + client_id: "web.web08.238183.1714523400546672784" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -688,10 +1059,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -798,66 +1169,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -867,9 +1202,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -898,48 +1231,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -954,13 +1282,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -982,7 +1314,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1003,138 +1335,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1156,6 +1494,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/169996.html b/groups.io/g/MTFHRT/wiki/29602/169996.html index 90086fef..ef27f4ca 100644 --- a/groups.io/g/MTFHRT/wiki/29602/169996.html +++ b/groups.io/g/MTFHRT/wiki/29602/169996.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775036.1713918458071703395"); + console.log("client_id:", "web.web09.237774.1714523400454006518"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775036.1713918458071703395" + client_id: "web.web09.237774.1714523400454006518" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=7mV5X7aINgD0yqVdJBxzKe0GlBY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -688,10 +1059,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=GNG6peFGTuBJNP5S%2BZysHiTNElc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=Lp7TkKovOfNvD8UwiZ5AUL54WXE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919058&Signature=WEMZyumA34eMIxYsGmxUKfjzSy8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -798,66 +1169,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -867,9 +1202,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -898,48 +1231,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -954,13 +1282,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -982,7 +1314,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1003,138 +1335,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1156,6 +1494,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170001.html b/groups.io/g/MTFHRT/wiki/29602/170001.html index 24f47e7b..f684c639 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170001.html +++ b/groups.io/g/MTFHRT/wiki/29602/170001.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775525.1713918457974205968"); + console.log("client_id:", "web.web09.237762.1714523400363234211"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775525.1713918457974205968" + client_id: "web.web09.237762.1714523400363234211" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170019.html b/groups.io/g/MTFHRT/wiki/29602/170019.html index f527efa0..501dfcea 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170019.html +++ b/groups.io/g/MTFHRT/wiki/29602/170019.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775024.1713918457872020890"); + console.log("client_id:", "web.web09.237756.1714523400276670423"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775024.1713918457872020890" + client_id: "web.web09.237756.1714523400276670423" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170041.html b/groups.io/g/MTFHRT/wiki/29602/170041.html index 279f16b2..682a2a53 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170041.html +++ b/groups.io/g/MTFHRT/wiki/29602/170041.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775020.1713918457772181171"); + console.log("client_id:", "web.web09.237750.1714523400187858787"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775020.1713918457772181171" + client_id: "web.web09.237750.1714523400187858787" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170043.html b/groups.io/g/MTFHRT/wiki/29602/170043.html index 4a14050e..f0fa09f7 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170043.html +++ b/groups.io/g/MTFHRT/wiki/29602/170043.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775512.1713918457674341760"); + console.log("client_id:", "web.web08.238151.1714523400086369023"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775512.1713918457674341760" + client_id: "web.web08.238151.1714523400086369023" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170046.html b/groups.io/g/MTFHRT/wiki/29602/170046.html index a360f58b..952b4d1b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170046.html +++ b/groups.io/g/MTFHRT/wiki/29602/170046.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775012.1713918457571937874"); + console.log("client_id:", "web.web08.238146.1714523399991232100"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775012.1713918457571937874" + client_id: "web.web08.238146.1714523399991232100" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=Vz6WLddzDMA%2BqbRDDVVPHhTRVJ8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=v73lJwIPDPdgL3%2BeE%2BmF1nsRUwE%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=sx4PP3Z8PwYZz%2BMVHX3rnl29Wjc%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714524000&Signature=YxUf%2FfJFQDKWmWUI4vyPt%2Fmik8M%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170117.html b/groups.io/g/MTFHRT/wiki/29602/170117.html index ebd1d2e4..1a7cb058 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170117.html +++ b/groups.io/g/MTFHRT/wiki/29602/170117.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775503.1713918457474276183"); + console.log("client_id:", "web.web09.237736.1714523399906972776"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775503.1713918457474276183" + client_id: "web.web09.237736.1714523399906972776" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170292.html b/groups.io/g/MTFHRT/wiki/29602/170292.html index 8d4bb4b7..a010a359 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170292.html +++ b/groups.io/g/MTFHRT/wiki/29602/170292.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.775006.1713918457371344560"); + console.log("client_id:", "web.web08.238138.1714523399815635510"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.775006.1713918457371344560" + client_id: "web.web08.238138.1714523399815635510" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170474.html b/groups.io/g/MTFHRT/wiki/29602/170474.html index 4e8ec253..43f8c7cf 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170474.html +++ b/groups.io/g/MTFHRT/wiki/29602/170474.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774998.1713918457271745017"); + console.log("client_id:", "web.web09.237728.1714523399726604678"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774998.1713918457271745017" + client_id: "web.web09.237728.1714523399726604678" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170480.html b/groups.io/g/MTFHRT/wiki/29602/170480.html index 023e1f52..cf49523c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170480.html +++ b/groups.io/g/MTFHRT/wiki/29602/170480.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775490.1713918457173923221"); + console.log("client_id:", "web.web08.238131.1714523399634883672"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775490.1713918457173923221" + client_id: "web.web08.238131.1714523399634883672" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170493.html b/groups.io/g/MTFHRT/wiki/29602/170493.html index 4f814d84..32706255 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170493.html +++ b/groups.io/g/MTFHRT/wiki/29602/170493.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774990.1713918457071663923"); + console.log("client_id:", "web.web09.237723.1714523399545344620"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774990.1713918457071663923" + client_id: "web.web09.237723.1714523399545344620" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=kNJQWe4ZpUKgg23czrVXRWBlcp8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=yZECbI5cnTc%2Fn4vwmtd8rK1k6Ik%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=iARFXuD2baaJf3brgBa7NO2X01w%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919057&Signature=B6Vgu%2FIB4m2lS5Q9oJ8%2FT48ZxIc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170570.html b/groups.io/g/MTFHRT/wiki/29602/170570.html index f896901b..8c0f20cc 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170570.html +++ b/groups.io/g/MTFHRT/wiki/29602/170570.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775482.1713918456973533712"); + console.log("client_id:", "web.web09.237718.1714523399457919343"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775482.1713918456973533712" + client_id: "web.web09.237718.1714523399457919343" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170572.html b/groups.io/g/MTFHRT/wiki/29602/170572.html index 8bf13e62..ab38b998 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170572.html +++ b/groups.io/g/MTFHRT/wiki/29602/170572.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775472.1713918456874009401"); + console.log("client_id:", "web.web08.238116.1714523399366770459"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775472.1713918456874009401" + client_id: "web.web08.238116.1714523399366770459" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170644.html b/groups.io/g/MTFHRT/wiki/29602/170644.html index a74dddc2..c0674300 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170644.html +++ b/groups.io/g/MTFHRT/wiki/29602/170644.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775469.1713918456774355671"); + console.log("client_id:", "web.web08.238110.1714523399273456819"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775469.1713918456774355671" + client_id: "web.web08.238110.1714523399273456819" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170646.html b/groups.io/g/MTFHRT/wiki/29602/170646.html index 555348c8..db9a3380 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170646.html +++ b/groups.io/g/MTFHRT/wiki/29602/170646.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774970.1713918456672403615"); + console.log("client_id:", "web.web09.237706.1714523399187721576"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774970.1713918456672403615" + client_id: "web.web09.237706.1714523399187721576" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170647.html b/groups.io/g/MTFHRT/wiki/29602/170647.html index 224d3e27..fa25f25f 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170647.html +++ b/groups.io/g/MTFHRT/wiki/29602/170647.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774967.1713918456571583496"); + console.log("client_id:", "web.web08.238107.1714523399087762348"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774967.1713918456571583496" + client_id: "web.web08.238107.1714523399087762348" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/170730.html b/groups.io/g/MTFHRT/wiki/29602/170730.html index 2fd44b65..87683608 100644 --- a/groups.io/g/MTFHRT/wiki/29602/170730.html +++ b/groups.io/g/MTFHRT/wiki/29602/170730.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775457.1713918456473671896"); + console.log("client_id:", "web.web08.238104.1714523398989870316"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775457.1713918456473671896" + client_id: "web.web08.238104.1714523398989870316" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=0ES7yDRp53llne6QA4OH4qdqTm0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=Gam6YXc2ulrEhL19iypWl%2BBvaf8%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=80gPebD6hxnyRmPM4uYh0lM5qhA%3D" class="myimg-responsive"/></p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> <h3><a name="Preservative-28optional29"></a>Preservative (optional)</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523999&Signature=f6cXTq62uCcUR4aa%2Bv12RQPmFfI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -799,66 +1170,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -868,9 +1203,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -899,48 +1232,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -955,13 +1283,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -983,7 +1315,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1004,138 +1336,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1157,6 +1495,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171102.html b/groups.io/g/MTFHRT/wiki/29602/171102.html index baeec6ca..35dfaef3 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171102.html +++ b/groups.io/g/MTFHRT/wiki/29602/171102.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774939.1713918456373270570"); + console.log("client_id:", "web.web09.237694.1714523398904114559"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774939.1713918456373270570" + client_id: "web.web09.237694.1714523398904114559" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -800,66 +1171,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -869,9 +1204,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -900,48 +1233,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -956,13 +1284,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -984,7 +1316,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1005,138 +1337,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1158,6 +1496,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171375.html b/groups.io/g/MTFHRT/wiki/29602/171375.html index 68e7d00c..b009bec0 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171375.html +++ b/groups.io/g/MTFHRT/wiki/29602/171375.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775431.1713918456274176484"); + console.log("client_id:", "web.web08.238094.1714523398808158593"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775431.1713918456274176484" + client_id: "web.web08.238094.1714523398808158593" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -800,66 +1171,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -869,9 +1204,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -900,48 +1233,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -956,13 +1284,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -984,7 +1316,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1005,138 +1337,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1158,6 +1496,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171433.html b/groups.io/g/MTFHRT/wiki/29602/171433.html index dbec4ad2..7dcbe334 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171433.html +++ b/groups.io/g/MTFHRT/wiki/29602/171433.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774931.1713918456171837537"); + console.log("client_id:", "web.web09.237690.1714523398722272869"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774931.1713918456171837537" + client_id: "web.web09.237690.1714523398722272869" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -674,7 +1045,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -689,10 +1060,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -800,66 +1171,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -869,9 +1204,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -900,48 +1233,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -956,13 +1284,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -984,7 +1316,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1005,138 +1337,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1158,6 +1496,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171603.html b/groups.io/g/MTFHRT/wiki/29602/171603.html index 0cfddd99..027ce74f 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171603.html +++ b/groups.io/g/MTFHRT/wiki/29602/171603.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775427.1713918456074609740"); + console.log("client_id:", "web.web08.238089.1714523398624548345"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775427.1713918456074609740" + client_id: "web.web08.238089.1714523398624548345" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=UG%2FVaHgLUyeuC03dKuCAiz3sTYU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=wflHQ2RBPY4u2vWyECs99KQjS00%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=gaRbKTXIcKXa0%2Fli6kSnIxOG8Ak%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919056&Signature=iY%2BluSH5WqucERo%2BhzyyVoirOyw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171634.html b/groups.io/g/MTFHRT/wiki/29602/171634.html index 62ca44c3..170319df 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171634.html +++ b/groups.io/g/MTFHRT/wiki/29602/171634.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775420.1713918455974072892"); + console.log("client_id:", "web.web08.238085.1714523398512965238"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775420.1713918455974072892" + client_id: "web.web08.238085.1714523398512965238" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171787.html b/groups.io/g/MTFHRT/wiki/29602/171787.html index c32d6e1a..2bae4bb8 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171787.html +++ b/groups.io/g/MTFHRT/wiki/29602/171787.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774922.1713918455872016608"); + console.log("client_id:", "web.web08.238071.1714523398418918443"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774922.1713918455872016608" + client_id: "web.web08.238071.1714523398418918443" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171799.html b/groups.io/g/MTFHRT/wiki/29602/171799.html index c301971f..d315e608 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171799.html +++ b/groups.io/g/MTFHRT/wiki/29602/171799.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775412.1713918455773161220"); + console.log("client_id:", "web.web09.237661.1714523398323939686"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775412.1713918455773161220" + client_id: "web.web09.237661.1714523398323939686" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171800.html b/groups.io/g/MTFHRT/wiki/29602/171800.html index a83c007d..a2851722 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171800.html +++ b/groups.io/g/MTFHRT/wiki/29602/171800.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775407.1713918455673567450"); + console.log("client_id:", "web.web08.238058.1714523398227872643"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775407.1713918455673567450" + client_id: "web.web08.238058.1714523398227872643" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171816.html b/groups.io/g/MTFHRT/wiki/29602/171816.html index b5e3d3a6..2c3cc774 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171816.html +++ b/groups.io/g/MTFHRT/wiki/29602/171816.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775405.1713918455574040060"); + console.log("client_id:", "web.web08.238051.1714523398131917535"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775405.1713918455574040060" + client_id: "web.web08.238051.1714523398131917535" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171845.html b/groups.io/g/MTFHRT/wiki/29602/171845.html index 36605ca7..080d1781 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171845.html +++ b/groups.io/g/MTFHRT/wiki/29602/171845.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774907.1713918455472108056"); + console.log("client_id:", "web.web08.238048.1714523398031561857"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774907.1713918455472108056" + client_id: "web.web08.238048.1714523398031561857" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=KjtXiAOtRxpb94bN0EbHtAQ6rQ0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=ZjJHDBvYrpCCZ6MlT0gMjPtSsjg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=jqIGgGgzKGMY6xXOVyNPdLiW4aU%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523998&Signature=%2BajznwfloYApO7PF9tVnmmyJu18%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171848.html b/groups.io/g/MTFHRT/wiki/29602/171848.html index d8ac3f54..02ce9272 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171848.html +++ b/groups.io/g/MTFHRT/wiki/29602/171848.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775402.1713918455373817892"); + console.log("client_id:", "web.web09.237635.1714523397943640728"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775402.1713918455373817892" + client_id: "web.web09.237635.1714523397943640728" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171933.html b/groups.io/g/MTFHRT/wiki/29602/171933.html index 6e53cbce..4a346c4b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171933.html +++ b/groups.io/g/MTFHRT/wiki/29602/171933.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774901.1713918455271332807"); + console.log("client_id:", "web.web08.238029.1714523397846766331"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774901.1713918455271332807" + client_id: "web.web08.238029.1714523397846766331" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/32903943374.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/32903943374.html</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171989.html b/groups.io/g/MTFHRT/wiki/29602/171989.html index 423e9659..f256dc0b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171989.html +++ b/groups.io/g/MTFHRT/wiki/29602/171989.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774891.1713918455171352327"); + console.log("client_id:", "web.web09.237623.1714523397758414577"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774891.1713918455171352327" + client_id: "web.web09.237623.1714523397758414577" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/171993.html b/groups.io/g/MTFHRT/wiki/29602/171993.html index 9042e303..d40f9e03 100644 --- a/groups.io/g/MTFHRT/wiki/29602/171993.html +++ b/groups.io/g/MTFHRT/wiki/29602/171993.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774887.1713918455072432318"); + console.log("client_id:", "web.web09.237611.1714523397661120424"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774887.1713918455072432318" + client_id: "web.web09.237611.1714523397661120424" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172034.html b/groups.io/g/MTFHRT/wiki/29602/172034.html index 4c78f95c..943d6320 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172034.html +++ b/groups.io/g/MTFHRT/wiki/29602/172034.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775380.1713918454973433547"); + console.log("client_id:", "web.web09.237594.1714523397553841881"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775380.1713918454973433547" + client_id: "web.web09.237594.1714523397553841881" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=e8hlqAWuLmfR%2B4LERivjeH5KEhw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=478ioho%2BNfCxyvDX%2BLgZyODODPY%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=PQklFCj07VkQTknR3aXLxVvppwA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919055&Signature=XbLERFvqWGFAi1OJjT3dAqMYWik%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172036.html b/groups.io/g/MTFHRT/wiki/29602/172036.html index 06335c98..abed7d64 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172036.html +++ b/groups.io/g/MTFHRT/wiki/29602/172036.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774879.1713918454872453187"); + console.log("client_id:", "web.web09.237588.1714523397447400928"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774879.1713918454872453187" + client_id: "web.web09.237588.1714523397447400928" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172154.html b/groups.io/g/MTFHRT/wiki/29602/172154.html index 7839fc04..6040c262 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172154.html +++ b/groups.io/g/MTFHRT/wiki/29602/172154.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775367.1713918454774219655"); + console.log("client_id:", "web.web08.237987.1714523397348440140"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775367.1713918454774219655" + client_id: "web.web08.237987.1714523397348440140" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <p>If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.</p> <h2><a name="Mix"></a>Mix</h2> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172157.html b/groups.io/g/MTFHRT/wiki/29602/172157.html index 084bffed..bfb1eec5 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172157.html +++ b/groups.io/g/MTFHRT/wiki/29602/172157.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774868.1713918454671404262"); + console.log("client_id:", "web.web08.237979.1714523397250355838"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774868.1713918454671404262" + client_id: "web.web08.237979.1714523397250355838" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172161.html b/groups.io/g/MTFHRT/wiki/29602/172161.html index 8564a624..cd8d4a79 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172161.html +++ b/groups.io/g/MTFHRT/wiki/29602/172161.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774863.1713918454572032055"); + console.log("client_id:", "web.web08.237972.1714523397157196239"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774863.1713918454572032055" + client_id: "web.web08.237972.1714523397157196239" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172176.html b/groups.io/g/MTFHRT/wiki/29602/172176.html index 7547dfb2..f57ad6e4 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172176.html +++ b/groups.io/g/MTFHRT/wiki/29602/172176.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774855.1713918454471868539"); + console.log("client_id:", "web.web08.237963.1714523397039613379"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774855.1713918454471868539" + client_id: "web.web08.237963.1714523397039613379" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=kS2wekS1zIhVBBBfSwCAbdTIpE4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=SUbG%2BP8TcY9MDo5Py4EfjNVuxuQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=lvfpM6wJsiOZ4nD9TsD9tBkcPLQ%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523997&Signature=RfLfyQHcm403fSRYE85PWlCuIHg%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172555.html b/groups.io/g/MTFHRT/wiki/29602/172555.html index bbeafa3a..f3d99e00 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172555.html +++ b/groups.io/g/MTFHRT/wiki/29602/172555.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775345.1713918454373668718"); + console.log("client_id:", "web.web09.237558.1714523396946250174"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775345.1713918454373668718" + client_id: "web.web09.237558.1714523396946250174" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172560.html b/groups.io/g/MTFHRT/wiki/29602/172560.html index e6c34cf7..915c42a7 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172560.html +++ b/groups.io/g/MTFHRT/wiki/29602/172560.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775341.1713918454273610024"); + console.log("client_id:", "web.web08.237954.1714523396846849747"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775341.1713918454273610024" + client_id: "web.web08.237954.1714523396846849747" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172567.html b/groups.io/g/MTFHRT/wiki/29602/172567.html index 07a2fcea..8a4d8d75 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172567.html +++ b/groups.io/g/MTFHRT/wiki/29602/172567.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775336.1713918454173637370"); + console.log("client_id:", "web.web08.237946.1714523396749356268"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775336.1713918454173637370" + client_id: "web.web08.237946.1714523396749356268" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172748.html b/groups.io/g/MTFHRT/wiki/29602/172748.html index b57f92d1..670eca5d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172748.html +++ b/groups.io/g/MTFHRT/wiki/29602/172748.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774835.1713918454071602550"); + console.log("client_id:", "web.web08.237941.1714523396650350489"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774835.1713918454071602550" + client_id: "web.web08.237941.1714523396650350489" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=fDS%2F1rphD7cTXWkuTbIEuurnEdE%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=4taH2TCiDPCtUAQwXoH%2FbJb6BUo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=LY3LY4A0B4HIcNNcMLD9CIFZ4QY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919054&Signature=mn3wqCEtEtZNKEmlqk7wfrfkdMw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/172772.html b/groups.io/g/MTFHRT/wiki/29602/172772.html index be0335bd..31d060c8 100644 --- a/groups.io/g/MTFHRT/wiki/29602/172772.html +++ b/groups.io/g/MTFHRT/wiki/29602/172772.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775323.1713918453973516943"); + console.log("client_id:", "web.web09.237533.1714523396560756408"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775323.1713918453973516943" + client_id: "web.web09.237533.1714523396560756408" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173017.html b/groups.io/g/MTFHRT/wiki/29602/173017.html index c7e137e3..a51784ac 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173017.html +++ b/groups.io/g/MTFHRT/wiki/29602/173017.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775318.1713918453873317059"); + console.log("client_id:", "web.web08.237930.1714523396456079517"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775318.1713918453873317059" + client_id: "web.web08.237930.1714523396456079517" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173018.html b/groups.io/g/MTFHRT/wiki/29602/173018.html index 8f2fd83d..0d90addb 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173018.html +++ b/groups.io/g/MTFHRT/wiki/29602/173018.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774817.1713918453771288070"); + console.log("client_id:", "web.web09.237518.1714523396363617979"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774817.1713918453771288070" + client_id: "web.web09.237518.1714523396363617979" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173019.html b/groups.io/g/MTFHRT/wiki/29602/173019.html index 4a70bfb4..9a42b140 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173019.html +++ b/groups.io/g/MTFHRT/wiki/29602/173019.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775305.1713918453674063907"); + console.log("client_id:", "web.web08.237917.1714523396270217613"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775305.1713918453674063907" + client_id: "web.web08.237917.1714523396270217613" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173224.html b/groups.io/g/MTFHRT/wiki/29602/173224.html index 727faf63..9cfb2e9e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173224.html +++ b/groups.io/g/MTFHRT/wiki/29602/173224.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775301.1713918453573994064"); + console.log("client_id:", "web.web09.237511.1714523396179504143"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775301.1713918453573994064" + client_id: "web.web09.237511.1714523396179504143" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173225.html b/groups.io/g/MTFHRT/wiki/29602/173225.html index caa2f0f4..09a78c1b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173225.html +++ b/groups.io/g/MTFHRT/wiki/29602/173225.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775294.1713918453474182952"); + console.log("client_id:", "web.web08.237912.1714523396085618490"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775294.1713918453474182952" + client_id: "web.web08.237912.1714523396085618490" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173240.html b/groups.io/g/MTFHRT/wiki/29602/173240.html index 5784d255..1669c105 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173240.html +++ b/groups.io/g/MTFHRT/wiki/29602/173240.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774793.1713918453371798046"); + console.log("client_id:", "web.web09.237502.1714523395998390377"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774793.1713918453371798046" + client_id: "web.web09.237502.1714523395998390377" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=efzaTvvUl6HnS20Qancpl22lviM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=iauri9PV%2FFs8ZuS%2BNYhe%2BtgeCpU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=ftI57CKXudd9V9w7kcJ6JKSVtoY%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523996&Signature=%2BD%2BQQ%2B3QVpXS9JWLwYCqnBpyOQc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173241.html b/groups.io/g/MTFHRT/wiki/29602/173241.html index de433df5..7af9728d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173241.html +++ b/groups.io/g/MTFHRT/wiki/29602/173241.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774790.1713918453271437080"); + console.log("client_id:", "web.web09.237494.1714523395906877925"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774790.1713918453271437080" + client_id: "web.web09.237494.1714523395906877925" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173242.html b/groups.io/g/MTFHRT/wiki/29602/173242.html index f18cbdac..992e4e5e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173242.html +++ b/groups.io/g/MTFHRT/wiki/29602/173242.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775285.1713918453174333653"); + console.log("client_id:", "web.web09.237489.1714523395819653152"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775285.1713918453174333653" + client_id: "web.web09.237489.1714523395819653152" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173359.html b/groups.io/g/MTFHRT/wiki/29602/173359.html index 493417f0..075c8734 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173359.html +++ b/groups.io/g/MTFHRT/wiki/29602/173359.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774786.1713918453071883686"); + console.log("client_id:", "web.web08.237884.1714523395713876834"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774786.1713918453071883686" + client_id: "web.web08.237884.1714523395713876834" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XE7VV%2FL6fPwPNNPS0P%2Fw8i5zoLM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=YznhalUHzkTQKT9epR9JW9%2FM80E%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=ME%2FoIETNY4AhDMy58lTLEEZH%2BAk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919053&Signature=XdUwOHvqLYZyCrMHm%2BqnhZdok18%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173385.html b/groups.io/g/MTFHRT/wiki/29602/173385.html index 4cfee96c..3f2fc3e6 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173385.html +++ b/groups.io/g/MTFHRT/wiki/29602/173385.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775280.1713918452974215667"); + console.log("client_id:", "web.web09.237473.1714523395624824001"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775280.1713918452974215667" + client_id: "web.web09.237473.1714523395624824001" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173450.html b/groups.io/g/MTFHRT/wiki/29602/173450.html index 6f9c84b4..ce196c2e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173450.html +++ b/groups.io/g/MTFHRT/wiki/29602/173450.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775277.1713918452873488918"); + console.log("client_id:", "web.web08.237870.1714523395529676173"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775277.1713918452873488918" + client_id: "web.web08.237870.1714523395529676173" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173566.html b/groups.io/g/MTFHRT/wiki/29602/173566.html index 4245187b..6d8ec179 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173566.html +++ b/groups.io/g/MTFHRT/wiki/29602/173566.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775271.1713918452774238300"); + console.log("client_id:", "web.web09.237456.1714523395438682002"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775271.1713918452774238300" + client_id: "web.web09.237456.1714523395438682002" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173659.html b/groups.io/g/MTFHRT/wiki/29602/173659.html index 42189481..78c95608 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173659.html +++ b/groups.io/g/MTFHRT/wiki/29602/173659.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774768.1713918452672211378"); + console.log("client_id:", "web.web08.237856.1714523395337039561"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774768.1713918452672211378" + client_id: "web.web08.237856.1714523395337039561" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173669.html b/groups.io/g/MTFHRT/wiki/29602/173669.html index 2ed29501..6e66b24c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173669.html +++ b/groups.io/g/MTFHRT/wiki/29602/173669.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774759.1713918452572933481"); + console.log("client_id:", "web.web09.237450.1714523395247906195"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774759.1713918452572933481" + client_id: "web.web09.237450.1714523395247906195" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173845.html b/groups.io/g/MTFHRT/wiki/29602/173845.html index 8bf98d0f..0f6bf7c9 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173845.html +++ b/groups.io/g/MTFHRT/wiki/29602/173845.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775254.1713918452473708397"); + console.log("client_id:", "web.web08.237840.1714523395153187443"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775254.1713918452473708397" + client_id: "web.web08.237840.1714523395153187443" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/173933.html b/groups.io/g/MTFHRT/wiki/29602/173933.html index 2baa867c..a318404b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/173933.html +++ b/groups.io/g/MTFHRT/wiki/29602/173933.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774753.1713918452371375366"); + console.log("client_id:", "web.web09.237431.1714523395063818218"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774753.1713918452371375366" + client_id: "web.web09.237431.1714523395063818218" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=ecRlTufT8XcFINksEE0BTRvAjg0%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=dX6VIlGUhzEpSCorx6Jbpkk%2FArs%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=0Q9Vn%2BA%2FxrKzYT%2B2eq3iwvraTao%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523995&Signature=pF7q6%2BNVFC%2F1PTX3LVkaGxQCehY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/174038.html b/groups.io/g/MTFHRT/wiki/29602/174038.html index a0770f11..5aea9aa2 100644 --- a/groups.io/g/MTFHRT/wiki/29602/174038.html +++ b/groups.io/g/MTFHRT/wiki/29602/174038.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775245.1713918452273992803"); + console.log("client_id:", "web.web09.237427.1714523394976240777"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775245.1713918452273992803" + client_id: "web.web09.237427.1714523394976240777" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/174146.html b/groups.io/g/MTFHRT/wiki/29602/174146.html index eb0c65e8..98ec038f 100644 --- a/groups.io/g/MTFHRT/wiki/29602/174146.html +++ b/groups.io/g/MTFHRT/wiki/29602/174146.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775242.1713918452173747687"); + console.log("client_id:", "web.web08.237819.1714523394878662523"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775242.1713918452173747687" + client_id: "web.web08.237819.1714523394878662523" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -675,7 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -690,10 +1061,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -705,7 +1076,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175306.html b/groups.io/g/MTFHRT/wiki/29602/175306.html index 57b525d1..9b8e7ac1 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175306.html +++ b/groups.io/g/MTFHRT/wiki/29602/175306.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774737.1713918452071401423"); + console.log("client_id:", "web.web09.237415.1714523394788742610"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774737.1713918452071401423" + client_id: "web.web09.237415.1714523394788742610" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=uRTSVG%2FDVeClmegV8SnfXqqDRwM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=lfqHRv7MOBfTUKhPIisiKoI%2BauQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=gZiuB3xPZ3J%2Fbzr98B%2BJPfQzC5I%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919052&Signature=4NRXq8jBkBXWxp%2Bw8kTLNTo8Wco%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -801,66 +1172,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -870,9 +1205,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -901,48 +1234,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -957,13 +1285,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -985,7 +1317,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1006,138 +1338,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1159,6 +1497,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175308.html b/groups.io/g/MTFHRT/wiki/29602/175308.html index 576bcd01..41288b89 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175308.html +++ b/groups.io/g/MTFHRT/wiki/29602/175308.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774735.1713918451971490534"); + console.log("client_id:", "web.web08.237813.1714523394695952742"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774735.1713918451971490534" + client_id: "web.web08.237813.1714523394695952742" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175309.html b/groups.io/g/MTFHRT/wiki/29602/175309.html index d6102f4c..377f8fa9 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175309.html +++ b/groups.io/g/MTFHRT/wiki/29602/175309.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775219.1713918451873967409"); + console.log("client_id:", "web.web09.237405.1714523394606180954"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775219.1713918451873967409" + client_id: "web.web09.237405.1714523394606180954" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175312.html b/groups.io/g/MTFHRT/wiki/29602/175312.html index faa3d421..dd6f010a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175312.html +++ b/groups.io/g/MTFHRT/wiki/29602/175312.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775215.1713918451773795985"); + console.log("client_id:", "web.web08.237804.1714523394508513498"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775215.1713918451773795985" + client_id: "web.web08.237804.1714523394508513498" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175559.html b/groups.io/g/MTFHRT/wiki/29602/175559.html index 7a971810..f81de4aa 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175559.html +++ b/groups.io/g/MTFHRT/wiki/29602/175559.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775212.1713918451674569737"); + console.log("client_id:", "web.web08.237798.1714523394413603738"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775212.1713918451674569737" + client_id: "web.web08.237798.1714523394413603738" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175562.html b/groups.io/g/MTFHRT/wiki/29602/175562.html index 5c2b973f..e3e2d18a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175562.html +++ b/groups.io/g/MTFHRT/wiki/29602/175562.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775209.1713918451574359432"); + console.log("client_id:", "web.web09.237392.1714523394326263754"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775209.1713918451574359432" + client_id: "web.web09.237392.1714523394326263754" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175563.html b/groups.io/g/MTFHRT/wiki/29602/175563.html index ba3ff6de..748b115b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175563.html +++ b/groups.io/g/MTFHRT/wiki/29602/175563.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775205.1713918451474804722"); + console.log("client_id:", "web.web08.237791.1714523394230564565"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775205.1713918451474804722" + client_id: "web.web08.237791.1714523394230564565" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175671.html b/groups.io/g/MTFHRT/wiki/29602/175671.html index 1f622583..e16e155b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175671.html +++ b/groups.io/g/MTFHRT/wiki/29602/175671.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774706.1713918451371673272"); + console.log("client_id:", "web.web09.237386.1714523394141073475"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774706.1713918451371673272" + client_id: "web.web09.237386.1714523394141073475" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175689.html b/groups.io/g/MTFHRT/wiki/29602/175689.html index cea7b864..ec90fdbd 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175689.html +++ b/groups.io/g/MTFHRT/wiki/29602/175689.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775199.1713918451273594097"); + console.log("client_id:", "web.web08.237787.1714523394046478204"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775199.1713918451273594097" + client_id: "web.web08.237787.1714523394046478204" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=VgqS1kH%2FOzaCTumSl3vvZWIsSnk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=wmOKZwze27SGu5qNkUXobrW7BSU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=oFmY7LLMm4gtYmJ112Douzzq0WM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523994&Signature=D27JZakEcRq705ZhvW%2BanQwkHJA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175730.html b/groups.io/g/MTFHRT/wiki/29602/175730.html index 7349651d..a9c6088e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175730.html +++ b/groups.io/g/MTFHRT/wiki/29602/175730.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774700.1713918451171701140"); + console.log("client_id:", "web.web09.237379.1714523393957181472"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774700.1713918451171701140" + client_id: "web.web09.237379.1714523393957181472" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175908.html b/groups.io/g/MTFHRT/wiki/29602/175908.html index a7ee5021..cf1faf56 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175908.html +++ b/groups.io/g/MTFHRT/wiki/29602/175908.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775192.1713918451073988454"); + console.log("client_id:", "web.web09.237371.1714523393866665851"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775192.1713918451073988454" + client_id: "web.web09.237371.1714523393866665851" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=h%2Fkl8lOEG3JqOVJeWfjoNQKBQNA%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=lJYhr6Fvf6Mx69PZ3fUTCxQuZdo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=6EmJQkDVrDzyFA%2Bkm%2FHYDoRLBoA%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919051&Signature=MNg%2BzVC3coyh2yZwvFTJpUH7Mzk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -802,66 +1173,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -871,9 +1206,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -902,48 +1235,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -958,13 +1286,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -986,7 +1318,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1007,138 +1339,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1160,6 +1498,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175930.html b/groups.io/g/MTFHRT/wiki/29602/175930.html index dde5e306..7329f8e3 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175930.html +++ b/groups.io/g/MTFHRT/wiki/29602/175930.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775180.1713918450973528247"); + console.log("client_id:", "web.web08.237767.1714523393772764480"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775180.1713918450973528247" + client_id: "web.web08.237767.1714523393772764480" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/175991.html b/groups.io/g/MTFHRT/wiki/29602/175991.html index f7aacbce..9f045df9 100644 --- a/groups.io/g/MTFHRT/wiki/29602/175991.html +++ b/groups.io/g/MTFHRT/wiki/29602/175991.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775173.1713918450873787105"); + console.log("client_id:", "web.web08.237760.1714523393677347966"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775173.1713918450873787105" + client_id: "web.web08.237760.1714523393677347966" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176625.html b/groups.io/g/MTFHRT/wiki/29602/176625.html index 8aaf39fb..79c189b4 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176625.html +++ b/groups.io/g/MTFHRT/wiki/29602/176625.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774672.1713918450771739138"); + console.log("client_id:", "web.web08.237758.1714523393583620404"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774672.1713918450771739138" + client_id: "web.web08.237758.1714523393583620404" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176627.html b/groups.io/g/MTFHRT/wiki/29602/176627.html index ced21505..2fcd6809 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176627.html +++ b/groups.io/g/MTFHRT/wiki/29602/176627.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775167.1713918450673971989"); + console.log("client_id:", "web.web08.237750.1714523393484431323"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775167.1713918450673971989" + client_id: "web.web08.237750.1714523393484431323" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176633.html b/groups.io/g/MTFHRT/wiki/29602/176633.html index 523349eb..3c0e21e0 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176633.html +++ b/groups.io/g/MTFHRT/wiki/29602/176633.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774667.1713918450571881947"); + console.log("client_id:", "web.web09.237342.1714523393394655557"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774667.1713918450571881947" + client_id: "web.web09.237342.1714523393394655557" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176690.html b/groups.io/g/MTFHRT/wiki/29602/176690.html index e65e0544..83f478ea 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176690.html +++ b/groups.io/g/MTFHRT/wiki/29602/176690.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775160.1713918450474050663"); + console.log("client_id:", "web.web09.237339.1714523393304509642"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775160.1713918450474050663" + client_id: "web.web09.237339.1714523393304509642" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176779.html b/groups.io/g/MTFHRT/wiki/29602/176779.html index f4a9e3bc..e2076e7d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176779.html +++ b/groups.io/g/MTFHRT/wiki/29602/176779.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774659.1713918450371287892"); + console.log("client_id:", "web.web08.237739.1714523393210922131"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774659.1713918450371287892" + client_id: "web.web08.237739.1714523393210922131" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176862.html b/groups.io/g/MTFHRT/wiki/29602/176862.html index 1679a83a..f66f1ede 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176862.html +++ b/groups.io/g/MTFHRT/wiki/29602/176862.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775151.1713918450273791724"); + console.log("client_id:", "web.web09.237334.1714523393123452489"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775151.1713918450273791724" + client_id: "web.web09.237334.1714523393123452489" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176863.html b/groups.io/g/MTFHRT/wiki/29602/176863.html index a7b4cf03..86e0fe23 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176863.html +++ b/groups.io/g/MTFHRT/wiki/29602/176863.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775147.1713918450173960822"); + console.log("client_id:", "web.web08.237730.1714523393027357314"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775147.1713918450173960822" + client_id: "web.web08.237730.1714523393027357314" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=QsOXd3bmjQHpek7R9LSm0VA7a0w%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=P%2FNNawNxoY4Ql0chqb0W%2B2UA0bI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=GtyI15NgrGMl1AdraNZUs5kr1sM%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523993&Signature=NbsaorqOf6qpYtyV0lfoPGat4Lo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176870.html b/groups.io/g/MTFHRT/wiki/29602/176870.html index 3fbe7e52..720c32ff 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176870.html +++ b/groups.io/g/MTFHRT/wiki/29602/176870.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774645.1713918450071573185"); + console.log("client_id:", "web.web09.237324.1714523392937386901"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774645.1713918450071573185" + client_id: "web.web09.237324.1714523392937386901" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=xk3%2FqKqZSQ0nKr3IPrKcGygeNpw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=ir60Vn8aUep4jDChi%2Bw%2FiLu1mm0%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=wTA5gZh9ZZGwExuvutcyC%2BeW8vE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919050&Signature=11sxjUsIOzb%2FrT9mV0iZZlHMvf0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/176939.html b/groups.io/g/MTFHRT/wiki/29602/176939.html index db34125d..118bab81 100644 --- a/groups.io/g/MTFHRT/wiki/29602/176939.html +++ b/groups.io/g/MTFHRT/wiki/29602/176939.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774629.1713918449972139536"); + console.log("client_id:", "web.web08.237726.1714523392840478224"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774629.1713918449972139536" + client_id: "web.web08.237726.1714523392840478224" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/177139.html b/groups.io/g/MTFHRT/wiki/29602/177139.html index 661cb515..fb35eb95 100644 --- a/groups.io/g/MTFHRT/wiki/29602/177139.html +++ b/groups.io/g/MTFHRT/wiki/29602/177139.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775120.1713918449874167103"); + console.log("client_id:", "web.web09.237307.1714523392751090048"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775120.1713918449874167103" + client_id: "web.web09.237307.1714523392751090048" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/177140.html b/groups.io/g/MTFHRT/wiki/29602/177140.html index 8a7073a1..6764535b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/177140.html +++ b/groups.io/g/MTFHRT/wiki/29602/177140.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775114.1713918449773977489"); + console.log("client_id:", "web.web08.237704.1714523392652973190"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775114.1713918449773977489" + client_id: "web.web08.237704.1714523392652973190" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/178199.html b/groups.io/g/MTFHRT/wiki/29602/178199.html index 70769900..b7f09294 100644 --- a/groups.io/g/MTFHRT/wiki/29602/178199.html +++ b/groups.io/g/MTFHRT/wiki/29602/178199.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774611.1713918449671692473"); + console.log("client_id:", "web.web09.237297.1714523392561113838"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774611.1713918449671692473" + client_id: "web.web09.237297.1714523392561113838" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/178236.html b/groups.io/g/MTFHRT/wiki/29602/178236.html index 2bda2b63..89d7c7e0 100644 --- a/groups.io/g/MTFHRT/wiki/29602/178236.html +++ b/groups.io/g/MTFHRT/wiki/29602/178236.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775104.1713918449574066544"); + console.log("client_id:", "web.web08.237687.1714523392465772398"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775104.1713918449574066544" + client_id: "web.web08.237687.1714523392465772398" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/178516.html b/groups.io/g/MTFHRT/wiki/29602/178516.html index 13a5362c..22c71e7c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/178516.html +++ b/groups.io/g/MTFHRT/wiki/29602/178516.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774599.1713918449471940776"); + console.log("client_id:", "web.web09.237276.1714523392375043589"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774599.1713918449471940776" + client_id: "web.web09.237276.1714523392375043589" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added, not "Pure C8") - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/178517.html b/groups.io/g/MTFHRT/wiki/29602/178517.html index 069ab6bb..6f836a85 100644 --- a/groups.io/g/MTFHRT/wiki/29602/178517.html +++ b/groups.io/g/MTFHRT/wiki/29602/178517.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775088.1713918449373642384"); + console.log("client_id:", "web.web09.237272.1714523392285434987"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775088.1713918449373642384" + client_id: "web.web09.237272.1714523392285434987" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/178526.html b/groups.io/g/MTFHRT/wiki/29602/178526.html index 511f9d20..13fe1c42 100644 --- a/groups.io/g/MTFHRT/wiki/29602/178526.html +++ b/groups.io/g/MTFHRT/wiki/29602/178526.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775082.1713918449274286816"); + console.log("client_id:", "web.web08.237670.1714523392180082329"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775082.1713918449274286816" + client_id: "web.web08.237670.1714523392180082329" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/179227.html b/groups.io/g/MTFHRT/wiki/29602/179227.html index 1d5c7721..e86e0563 100644 --- a/groups.io/g/MTFHRT/wiki/29602/179227.html +++ b/groups.io/g/MTFHRT/wiki/29602/179227.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774583.1713918449191253664"); + console.log("client_id:", "web.web09.237264.1714523392088758557"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774583.1713918449191253664" + client_id: "web.web09.237264.1714523392088758557" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22VIC10%20000%22" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG%20000%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/de_DE/?ObjectPath=/Shops/171448/Products/%22BKMA%20000%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%20000%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/179444.html b/groups.io/g/MTFHRT/wiki/29602/179444.html index 6372f4aa..9aa1c5c2 100644 --- a/groups.io/g/MTFHRT/wiki/29602/179444.html +++ b/groups.io/g/MTFHRT/wiki/29602/179444.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775072.1713918449107316788"); + console.log("client_id:", "web.web08.237660.1714523391987608109"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775072.1713918449107316788" + client_id: "web.web08.237660.1714523391987608109" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=R%2B7ViozGxWw0f7efMjtnT4HV49Q%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=YWk%2F%2B5Lvc%2Bf4Ywd0PTLQFHlxcrg%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=dhyg15hIpYz297iM%2F3Yf9AqjP7w%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523992&Signature=IFrUliUYGqJkBJRp3H4e3N%2Fxc48%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -803,66 +1174,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -872,9 +1207,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -903,48 +1236,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -959,13 +1287,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -987,7 +1319,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1008,138 +1340,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1161,6 +1499,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/181040.html b/groups.io/g/MTFHRT/wiki/29602/181040.html index 2a12911a..0e772196 100644 --- a/groups.io/g/MTFHRT/wiki/29602/181040.html +++ b/groups.io/g/MTFHRT/wiki/29602/181040.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774574.1713918449031170772"); + console.log("client_id:", "web.web09.237254.1714523391898035141"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774574.1713918449031170772" + client_id: "web.web09.237254.1714523391898035141" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=lne2wSO0%2BYARJ2iNCqR%2FeabBo0s%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=tjI39GkxBQSg5izxEFYJVtvHiEI%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=WTR%2BoR7G5Vq%2B7oSttprUuqcU0TM%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919049&Signature=pQTAo%2Bhg3mzhYSqS9RfT2hpSabo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/181092.html b/groups.io/g/MTFHRT/wiki/29602/181092.html index ccfaf870..92aee1fa 100644 --- a/groups.io/g/MTFHRT/wiki/29602/181092.html +++ b/groups.io/g/MTFHRT/wiki/29602/181092.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774569.1713918448948540761"); + console.log("client_id:", "web.web09.237247.1714523391810092083"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774569.1713918448948540761" + client_id: "web.web09.237247.1714523391810092083" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/lab-supplies/rls-10ml-molded-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://ezvialz.com/vial-samples/1149-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-pk-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://ezvialz.com/20mm-vial-stoppers/1105-20mm-round-bottom-vial-stopper-sample-pack-of-10-pieces.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://ezvialz.com/20mm-center-tear-vial-seals/978-20mm-center-tear-vial-seals-dusty-pink-pk-of-100.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/181266.html b/groups.io/g/MTFHRT/wiki/29602/181266.html index 04811470..77ff37e7 100644 --- a/groups.io/g/MTFHRT/wiki/29602/181266.html +++ b/groups.io/g/MTFHRT/wiki/29602/181266.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774556.1713918448876320072"); + console.log("client_id:", "web.web09.237239.1714523391716147009"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774556.1713918448876320072" + client_id: "web.web09.237239.1714523391716147009" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>.</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/181781.html b/groups.io/g/MTFHRT/wiki/29602/181781.html index fee62ff1..f223dd65 100644 --- a/groups.io/g/MTFHRT/wiki/29602/181781.html +++ b/groups.io/g/MTFHRT/wiki/29602/181781.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774551.1713918448801237642"); + console.log("client_id:", "web.web08.237640.1714523391610300694"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774551.1713918448801237642" + client_id: "web.web08.237640.1714523391610300694" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/183064.html b/groups.io/g/MTFHRT/wiki/29602/183064.html index be820c08..f7e77b70 100644 --- a/groups.io/g/MTFHRT/wiki/29602/183064.html +++ b/groups.io/g/MTFHRT/wiki/29602/183064.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775041.1713918448715255630"); + console.log("client_id:", "web.web08.237635.1714523391515680065"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775041.1713918448715255630" + client_id: "web.web08.237635.1714523391515680065" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">stoppers</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/184065.html b/groups.io/g/MTFHRT/wiki/29602/184065.html index 3af2eec6..11046a7c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/184065.html +++ b/groups.io/g/MTFHRT/wiki/29602/184065.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775038.1713918448624312129"); + console.log("client_id:", "web.web09.237228.1714523391422507094"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775038.1713918448624312129" + client_id: "web.web09.237228.1714523391422507094" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -804,66 +1175,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -873,9 +1208,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -904,48 +1237,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -960,13 +1288,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -988,7 +1320,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1009,138 +1341,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1162,6 +1500,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/184355.html b/groups.io/g/MTFHRT/wiki/29602/184355.html index c0789300..a932c13e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/184355.html +++ b/groups.io/g/MTFHRT/wiki/29602/184355.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774538.1713918448544575062"); + console.log("client_id:", "web.web08.237628.1714523391325609773"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774538.1713918448544575062" + client_id: "web.web08.237628.1714523391325609773" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/184356.html b/groups.io/g/MTFHRT/wiki/29602/184356.html index 30d830c6..b7589a90 100644 --- a/groups.io/g/MTFHRT/wiki/29602/184356.html +++ b/groups.io/g/MTFHRT/wiki/29602/184356.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775032.1713918448457146330"); + console.log("client_id:", "web.web09.237222.1714523391234972975"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775032.1713918448457146330" + client_id: "web.web09.237222.1714523391234972975" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/184675.html b/groups.io/g/MTFHRT/wiki/29602/184675.html index 853932ea..5dd946d6 100644 --- a/groups.io/g/MTFHRT/wiki/29602/184675.html +++ b/groups.io/g/MTFHRT/wiki/29602/184675.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775028.1713918448370559030"); + console.log("client_id:", "web.web09.237219.1714523391144877561"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775028.1713918448370559030" + client_id: "web.web09.237219.1714523391144877561" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <h3><a name="Oil"></a>Oil</h3> <p>MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle <a href="https://www.ebay.com/sch/i.html?_nkw=mct+oil&_sacat=0&LH_BIN=1&_sop=15&_fcid=1&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on eBay</a> for $6 including shipping. Check prices also on Amazon. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).</p> @@ -700,7 +1071,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -805,66 +1176,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -874,9 +1209,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -905,48 +1238,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -961,13 +1289,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -989,7 +1321,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1010,138 +1342,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1163,6 +1501,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/184793.html b/groups.io/g/MTFHRT/wiki/29602/184793.html index 16549825..c895d4f1 100644 --- a/groups.io/g/MTFHRT/wiki/29602/184793.html +++ b/groups.io/g/MTFHRT/wiki/29602/184793.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774529.1713918448295087286"); + console.log("client_id:", "web.web08.237614.1714523391052869976"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774529.1713918448295087286" + client_id: "web.web08.237614.1714523391052869976" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=21uG706uPSNnW2w%2FxTgofzUvnN4%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=1QibDdDK7SzXujnT4H2ZLPGf37k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sp3%2BaTyM7BhrCpNvmXprXnLOcJE%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials made in USA <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523991&Signature=sg13HGNXepvZdbOpT5RRnwgWnWA%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/184817.html b/groups.io/g/MTFHRT/wiki/29602/184817.html index 93a0712d..00af75f5 100644 --- a/groups.io/g/MTFHRT/wiki/29602/184817.html +++ b/groups.io/g/MTFHRT/wiki/29602/184817.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775022.1713918448210021187"); + console.log("client_id:", "web.web09.237209.1714523390958596469"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775022.1713918448210021187" + client_id: "web.web09.237209.1714523390958596469" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials made in USA <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/185552.html b/groups.io/g/MTFHRT/wiki/29602/185552.html index 9dd26a5f..01ef7570 100644 --- a/groups.io/g/MTFHRT/wiki/29602/185552.html +++ b/groups.io/g/MTFHRT/wiki/29602/185552.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774522.1713918448130176431"); + console.log("client_id:", "web.web08.237609.1714523390862621082"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774522.1713918448130176431" + client_id: "web.web08.237609.1714523390862621082" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials made in USA <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/185742.html b/groups.io/g/MTFHRT/wiki/29602/185742.html index eddf1a12..cfb43953 100644 --- a/groups.io/g/MTFHRT/wiki/29602/185742.html +++ b/groups.io/g/MTFHRT/wiki/29602/185742.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775015.1713918448053441552"); + console.log("client_id:", "web.web08.237608.1714523390764598919"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775015.1713918448053441552" + client_id: "web.web08.237608.1714523390764598919" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=xp%2FSrRw2lxbcCgLkI8P8TiksdfY%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=j4x6h6ica3GcffulkYbo6snu%2B8k%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Ih1z%2FQ8xgypaysBrU1CtnLJPx7s%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919048&Signature=Z3jtxyGw6N2nqmUcUidAS%2BNOFCw%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/185743.html b/groups.io/g/MTFHRT/wiki/29602/185743.html index 5a28a10b..cb001122 100644 --- a/groups.io/g/MTFHRT/wiki/29602/185743.html +++ b/groups.io/g/MTFHRT/wiki/29602/185743.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775009.1713918447973773560"); + console.log("client_id:", "web.web09.237201.1714523390676978284"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775009.1713918447973773560" + client_id: "web.web09.237201.1714523390676978284" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/185980.html b/groups.io/g/MTFHRT/wiki/29602/185980.html index 5cfa4bfa..5cde9969 100644 --- a/groups.io/g/MTFHRT/wiki/29602/185980.html +++ b/groups.io/g/MTFHRT/wiki/29602/185980.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.775003.1713918447891239057"); + console.log("client_id:", "web.web08.237601.1714523390584297156"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.775003.1713918447891239057" + client_id: "web.web08.237601.1714523390584297156" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/186269.html b/groups.io/g/MTFHRT/wiki/29602/186269.html index b9ccb2e2..b5b0a0aa 100644 --- a/groups.io/g/MTFHRT/wiki/29602/186269.html +++ b/groups.io/g/MTFHRT/wiki/29602/186269.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774504.1713918447813670347"); + console.log("client_id:", "web.web08.237597.1714523390489800769"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774504.1713918447813670347" + client_id: "web.web08.237597.1714523390489800769" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/186348.html b/groups.io/g/MTFHRT/wiki/29602/186348.html index 0b74204b..742616b2 100644 --- a/groups.io/g/MTFHRT/wiki/29602/186348.html +++ b/groups.io/g/MTFHRT/wiki/29602/186348.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774993.1713918447737025378"); + console.log("client_id:", "web.web08.237595.1714523390390047684"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774993.1713918447737025378" + client_id: "web.web08.237595.1714523390390047684" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/186514.html b/groups.io/g/MTFHRT/wiki/29602/186514.html index 5f9d095e..ee0275a9 100644 --- a/groups.io/g/MTFHRT/wiki/29602/186514.html +++ b/groups.io/g/MTFHRT/wiki/29602/186514.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774991.1713918447656340918"); + console.log("client_id:", "web.web09.237188.1714523390299278481"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774991.1713918447656340918" + client_id: "web.web09.237188.1714523390299278481" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/186633.html b/groups.io/g/MTFHRT/wiki/29602/186633.html index e3506541..654a847b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/186633.html +++ b/groups.io/g/MTFHRT/wiki/29602/186633.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774494.1713918447581931726"); + console.log("client_id:", "web.web09.237185.1714523390209025514"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774494.1713918447581931726" + client_id: "web.web09.237185.1714523390209025514" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/186634.html b/groups.io/g/MTFHRT/wiki/29602/186634.html index d6b2ac4b..3f05eb0e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/186634.html +++ b/groups.io/g/MTFHRT/wiki/29602/186634.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774486.1713918447500526832"); + console.log("client_id:", "web.web08.237583.1714523390114438557"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774486.1713918447500526832" + client_id: "web.web08.237583.1714523390114438557" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/186944.html b/groups.io/g/MTFHRT/wiki/29602/186944.html index eee1d369..b52edcfe 100644 --- a/groups.io/g/MTFHRT/wiki/29602/186944.html +++ b/groups.io/g/MTFHRT/wiki/29602/186944.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774977.1713918447416143344"); + console.log("client_id:", "web.web08.237579.1714523390022501117"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774977.1713918447416143344" + client_id: "web.web08.237579.1714523390022501117" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=HcGIysMBvjJuc7c79YY31VKq%2F0c%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=SbDjJfLv0Zl3zpaCqqkfP44uW4I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=mzNJqTWKOvEdmoA2FcrLycCB2SA%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523990&Signature=W%2FbxxkzfhwAEuwGYYRi%2B7t29NZc%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/186993.html b/groups.io/g/MTFHRT/wiki/29602/186993.html index 230d2e67..362f861d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/186993.html +++ b/groups.io/g/MTFHRT/wiki/29602/186993.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774476.1713918447337235082"); + console.log("client_id:", "web.web09.237171.1714523389932866884"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774476.1713918447337235082" + client_id: "web.web09.237171.1714523389932866884" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187032.html b/groups.io/g/MTFHRT/wiki/29602/187032.html index dd5696d3..1dcc7ef6 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187032.html +++ b/groups.io/g/MTFHRT/wiki/29602/187032.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774967.1713918447244072961"); + console.log("client_id:", "web.web08.237569.1714523389831297406"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774967.1713918447244072961" + client_id: "web.web08.237569.1714523389831297406" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187071.html b/groups.io/g/MTFHRT/wiki/29602/187071.html index 733b193c..14a364e1 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187071.html +++ b/groups.io/g/MTFHRT/wiki/29602/187071.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774469.1713918447169955538"); + console.log("client_id:", "web.web09.237162.1714523389737796197"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774469.1713918447169955538" + client_id: "web.web09.237162.1714523389737796197" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187072.html b/groups.io/g/MTFHRT/wiki/29602/187072.html index 03a1a1f8..2d5ad7ff 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187072.html +++ b/groups.io/g/MTFHRT/wiki/29602/187072.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774463.1713918447098857832"); + console.log("client_id:", "web.web08.237558.1714523389641632346"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774463.1713918447098857832" + client_id: "web.web08.237558.1714523389641632346" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187073.html b/groups.io/g/MTFHRT/wiki/29602/187073.html index db5359d8..f67ce82a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187073.html +++ b/groups.io/g/MTFHRT/wiki/29602/187073.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774455.1713918447024443907"); + console.log("client_id:", "web.web08.237548.1714523389546896757"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774455.1713918447024443907" + client_id: "web.web08.237548.1714523389546896757" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=gxST6XHfucoW%2BNp7N5oF5zW%2Btw8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=YixJ9OkTxutsAsRyik7StFyDk1c%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/223836409810" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/223836409810</a><br/><a href="https://www.aliexpress.com/item/33024594919.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/33024594919.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=H3kRdkkW8TC6tb1B9wwrQXDwkio%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919047&Signature=7p0EVUgXzwgbznt9VSlGzLwzdmo%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187215.html b/groups.io/g/MTFHRT/wiki/29602/187215.html index db447e59..40dbea96 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187215.html +++ b/groups.io/g/MTFHRT/wiki/29602/187215.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774935.1713918446943651909"); + console.log("client_id:", "web.web09.237141.1714523389451083355"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774935.1713918446943651909" + client_id: "web.web09.237141.1714523389451083355" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187225.html b/groups.io/g/MTFHRT/wiki/29602/187225.html index 5e3046c9..dd851e2e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187225.html +++ b/groups.io/g/MTFHRT/wiki/29602/187225.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774927.1713918446865215445"); + console.log("client_id:", "web.web08.237540.1714523389345652516"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774927.1713918446865215445" + client_id: "web.web08.237540.1714523389345652516" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187258.html b/groups.io/g/MTFHRT/wiki/29602/187258.html index eb568c8e..07dd3993 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187258.html +++ b/groups.io/g/MTFHRT/wiki/29602/187258.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774428.1713918446785271110"); + console.log("client_id:", "web.web09.237134.1714523389255609460"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774428.1713918446785271110" + client_id: "web.web09.237134.1714523389255609460" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187259.html b/groups.io/g/MTFHRT/wiki/29602/187259.html index c7aeca1c..bdfeb6cd 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187259.html +++ b/groups.io/g/MTFHRT/wiki/29602/187259.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774425.1713918446713704124"); + console.log("client_id:", "web.web08.237532.1714523389159951084"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774425.1713918446713704124" + client_id: "web.web08.237532.1714523389159951084" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187324.html b/groups.io/g/MTFHRT/wiki/29602/187324.html index 87ca0149..a6f7b7b7 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187324.html +++ b/groups.io/g/MTFHRT/wiki/29602/187324.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774919.1713918446636332478"); + console.log("client_id:", "web.web09.237124.1714523389070227407"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774919.1713918446636332478" + client_id: "web.web09.237124.1714523389070227407" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=KZH2qFBx4blQxpofSLTMw%2FyQlQM%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=pdUT0U7BUnstqKu3MIQjCpHrC6I%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=becQ%2B%2Bna0uLWzxnDWup3gEznmbg%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a>, and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523989&Signature=t%2F0F5Dxx3R1FTn0UKPDoo9DRK1o%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187370.html b/groups.io/g/MTFHRT/wiki/29602/187370.html index 16b13b3f..af6da2f8 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187370.html +++ b/groups.io/g/MTFHRT/wiki/29602/187370.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774420.1713918446558449285"); + console.log("client_id:", "web.web09.237120.1714523388980587673"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774420.1713918446558449285" + client_id: "web.web09.237120.1714523388980587673" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">on ebay</a> or Amazon and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187371.html b/groups.io/g/MTFHRT/wiki/29602/187371.html index a1d65317..c513137d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187371.html +++ b/groups.io/g/MTFHRT/wiki/29602/187371.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774914.1713918446478418813"); + console.log("client_id:", "web.web09.237113.1714523388887076390"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774914.1713918446478418813" + client_id: "web.web09.237113.1714523388887076390" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187424.html b/groups.io/g/MTFHRT/wiki/29602/187424.html index 9320382a..475b1aee 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187424.html +++ b/groups.io/g/MTFHRT/wiki/29602/187424.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774416.1713918446403767819"); + console.log("client_id:", "web.web08.237512.1714523388789254945"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774416.1713918446403767819" + client_id: "web.web08.237512.1714523388789254945" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187581.html b/groups.io/g/MTFHRT/wiki/29602/187581.html index 1363ae6c..a259e714 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187581.html +++ b/groups.io/g/MTFHRT/wiki/29602/187581.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774410.1713918446328747940"); + console.log("client_id:", "web.web08.237509.1714523388694445826"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774410.1713918446328747940" + client_id: "web.web08.237509.1714523388694445826" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187590.html b/groups.io/g/MTFHRT/wiki/29602/187590.html index b41f9ceb..b79b6088 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187590.html +++ b/groups.io/g/MTFHRT/wiki/29602/187590.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774900.1713918446248465260"); + console.log("client_id:", "web.web08.237507.1714523388603105001"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774900.1713918446248465260" + client_id: "web.web08.237507.1714523388603105001" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187593.html b/groups.io/g/MTFHRT/wiki/29602/187593.html index 7164ebb8..eb44828b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187593.html +++ b/groups.io/g/MTFHRT/wiki/29602/187593.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774892.1713918446141874440"); + console.log("client_id:", "web.web09.237100.1714523388511865670"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774892.1713918446141874440" + client_id: "web.web09.237100.1714523388511865670" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187707.html b/groups.io/g/MTFHRT/wiki/29602/187707.html index 2b877800..71df0dbe 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187707.html +++ b/groups.io/g/MTFHRT/wiki/29602/187707.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774394.1713918446062069568"); + console.log("client_id:", "web.web08.237502.1714523388412253722"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774394.1713918446062069568" + client_id: "web.web08.237502.1714523388412253722" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187775.html b/groups.io/g/MTFHRT/wiki/29602/187775.html index 58784bed..75b8657c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187775.html +++ b/groups.io/g/MTFHRT/wiki/29602/187775.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774392.1713918445983911852"); + console.log("client_id:", "web.web09.237096.1714523388324692477"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774392.1713918445983911852" + client_id: "web.web09.237096.1714523388324692477" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=fHm74Zki9ytH9Sqdrc%2F1DBSneMs%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=w3s9FL9m6BfqXU80PJOGuSqcpTU%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=bOD0dnfvKDAI6EvXCy1EUG3ezkE%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919046&Signature=xQsGLCWS7QgEb8Yvylb2ujXAzVY%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187810.html b/groups.io/g/MTFHRT/wiki/29602/187810.html index f2707024..ef66e251 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187810.html +++ b/groups.io/g/MTFHRT/wiki/29602/187810.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774885.1713918445905449631"); + console.log("client_id:", "web.web08.237495.1714523388226786992"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774885.1713918445905449631" + client_id: "web.web08.237495.1714523388226786992" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187811.html b/groups.io/g/MTFHRT/wiki/29602/187811.html index 01728b77..e99ceafd 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187811.html +++ b/groups.io/g/MTFHRT/wiki/29602/187811.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774386.1713918445825121168"); + console.log("client_id:", "web.web09.237087.1714523388139476448"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774386.1713918445825121168" + client_id: "web.web09.237087.1714523388139476448" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187839.html b/groups.io/g/MTFHRT/wiki/29602/187839.html index f96c391c..3e365f6c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187839.html +++ b/groups.io/g/MTFHRT/wiki/29602/187839.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774879.1713918445751488494"); + console.log("client_id:", "web.web09.237082.1714523388049128089"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774879.1713918445751488494" + client_id: "web.web09.237082.1714523388049128089" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=R6%2BUQu%2FwrOEE7Qi8N4YBUkVxSRk%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=G3vX1rcwXm1f%2B%2FmPY%2FekntkpcdQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=nqOyI4BjlNfMiucYZWlDgPwbULI%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523988&Signature=%2B5uOfd9zCMUnoUXMk%2BAh%2Fl1Bhow%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187840.html b/groups.io/g/MTFHRT/wiki/29602/187840.html index 7a512cbc..0e48dc7d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187840.html +++ b/groups.io/g/MTFHRT/wiki/29602/187840.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774382.1713918445659621710"); + console.log("client_id:", "web.web08.237481.1714523387952664036"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774382.1713918445659621710" + client_id: "web.web08.237481.1714523387952664036" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187847.html b/groups.io/g/MTFHRT/wiki/29602/187847.html index b3100986..c8db3d5a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187847.html +++ b/groups.io/g/MTFHRT/wiki/29602/187847.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774874.1713918445584779418"); + console.log("client_id:", "web.web09.237075.1714523387862734374"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774874.1713918445584779418" + client_id: "web.web09.237075.1714523387862734374" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -685,10 +1056,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -701,7 +1072,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -806,66 +1177,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -875,9 +1210,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -906,48 +1239,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -962,13 +1290,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -990,7 +1322,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1011,138 +1343,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1164,6 +1502,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/187896.html b/groups.io/g/MTFHRT/wiki/29602/187896.html index a1d17860..dd5a9195 100644 --- a/groups.io/g/MTFHRT/wiki/29602/187896.html +++ b/groups.io/g/MTFHRT/wiki/29602/187896.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774374.1713918445509809788"); + console.log("client_id:", "web.web08.237475.1714523387768524465"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774374.1713918445509809788" + client_id: "web.web08.237475.1714523387768524465" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188033.html b/groups.io/g/MTFHRT/wiki/29602/188033.html index 63c434d6..472ef995 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188033.html +++ b/groups.io/g/MTFHRT/wiki/29602/188033.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774864.1713918445432805014"); + console.log("client_id:", "web.web09.237068.1714523387677746778"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774864.1713918445432805014" + client_id: "web.web09.237068.1714523387677746778" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188034.html b/groups.io/g/MTFHRT/wiki/29602/188034.html index 427dcaa4..788d8987 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188034.html +++ b/groups.io/g/MTFHRT/wiki/29602/188034.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774860.1713918445354357780"); + console.log("client_id:", "web.web08.237465.1714523387583156075"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774860.1713918445354357780" + client_id: "web.web08.237465.1714523387583156075" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188214.html b/groups.io/g/MTFHRT/wiki/29602/188214.html index f692a9e8..eda83aeb 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188214.html +++ b/groups.io/g/MTFHRT/wiki/29602/188214.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774358.1713918445278072489"); + console.log("client_id:", "web.web09.237059.1714523387491102279"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774358.1713918445278072489" + client_id: "web.web09.237059.1714523387491102279" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188232.html b/groups.io/g/MTFHRT/wiki/29602/188232.html index c7ed2cf4..87a759ec 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188232.html +++ b/groups.io/g/MTFHRT/wiki/29602/188232.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774845.1713918445200615334"); + console.log("client_id:", "web.web08.237459.1714523387392863431"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774845.1713918445200615334" + client_id: "web.web08.237459.1714523387392863431" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188240.html b/groups.io/g/MTFHRT/wiki/29602/188240.html index c0df0f15..4f8b2870 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188240.html +++ b/groups.io/g/MTFHRT/wiki/29602/188240.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774836.1713918445121680678"); + console.log("client_id:", "web.web08.237452.1714523387295030660"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774836.1713918445121680678" + client_id: "web.web08.237452.1714523387295030660" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In Europe you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188243.html b/groups.io/g/MTFHRT/wiki/29602/188243.html index ae8429fe..b92faa73 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188243.html +++ b/groups.io/g/MTFHRT/wiki/29602/188243.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774336.1713918445045865080"); + console.log("client_id:", "web.web09.237047.1714523387203955868"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774336.1713918445045865080" + client_id: "web.web09.237047.1714523387203955868" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=ahQhdECEo9hSTNwIwLqWR9SU5TU%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=5qK7Kfk2A6RhbGBm8ffMvg2YFQk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=2HqzTJdmgakdlYImeLrHabfFWbs%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety", just waste of money following prejudices.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919045&Signature=7KQWnJA%2B6jzWAuhVbE2nUmkYWH4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188266.html b/groups.io/g/MTFHRT/wiki/29602/188266.html index a2be9fc6..b609f8ef 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188266.html +++ b/groups.io/g/MTFHRT/wiki/29602/188266.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774332.1713918444971143908"); + console.log("client_id:", "web.web08.237449.1714523387109526108"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774332.1713918444971143908" + client_id: "web.web08.237449.1714523387109526108" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188385.html b/groups.io/g/MTFHRT/wiki/29602/188385.html index 2d5adfd2..7fba2157 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188385.html +++ b/groups.io/g/MTFHRT/wiki/29602/188385.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774329.1713918444895885944"); + console.log("client_id:", "web.web09.237042.1714523387015067131"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774329.1713918444895885944" + client_id: "web.web09.237042.1714523387015067131" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=IvTrGz5MOqNFUDbkmua7vNoNRVw%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=MVzUODlSHTr2JkBCFF%2BWOrTQA0s%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=QfYTh5BB703xUgXSOwWNqi6GZ4Q%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523987&Signature=w96vqEdri1jhk3AprAa4AygBjK0%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188427.html b/groups.io/g/MTFHRT/wiki/29602/188427.html index 6a9e473c..efff0863 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188427.html +++ b/groups.io/g/MTFHRT/wiki/29602/188427.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774818.1713918444817841362"); + console.log("client_id:", "web.web08.237440.1714523386911437609"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774818.1713918444817841362" + client_id: "web.web08.237440.1714523386911437609" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/188484.html b/groups.io/g/MTFHRT/wiki/29602/188484.html index fd43f885..b8f7d206 100644 --- a/groups.io/g/MTFHRT/wiki/29602/188484.html +++ b/groups.io/g/MTFHRT/wiki/29602/188484.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774306.1713918444742306032"); + console.log("client_id:", "web.web09.237034.1714523386817236585"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774306.1713918444742306032" + client_id: "web.web09.237034.1714523386817236585" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/189123.html b/groups.io/g/MTFHRT/wiki/29602/189123.html index 33f0f79f..76ae48bf 100644 --- a/groups.io/g/MTFHRT/wiki/29602/189123.html +++ b/groups.io/g/MTFHRT/wiki/29602/189123.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774299.1713918444668005098"); + console.log("client_id:", "web.web08.237434.1714523386708663077"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774299.1713918444668005098" + client_id: "web.web08.237434.1714523386708663077" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -807,66 +1178,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -876,9 +1211,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -907,48 +1240,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -963,13 +1291,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -991,7 +1323,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1012,138 +1344,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1165,6 +1503,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/189321.html b/groups.io/g/MTFHRT/wiki/29602/189321.html index 830272db..9f453090 100644 --- a/groups.io/g/MTFHRT/wiki/29602/189321.html +++ b/groups.io/g/MTFHRT/wiki/29602/189321.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774288.1713918444591951626"); + console.log("client_id:", "web.web09.237028.1714523386618143005"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774288.1713918444591951626" + client_id: "web.web09.237028.1714523386618143005" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener">эта инструкция по-русски</a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -808,66 +1179,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -877,9 +1212,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -908,48 +1241,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -964,13 +1292,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -992,7 +1324,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1013,138 +1345,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1166,6 +1504,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/189646.html b/groups.io/g/MTFHRT/wiki/29602/189646.html index 2db39a57..451303bb 100644 --- a/groups.io/g/MTFHRT/wiki/29602/189646.html +++ b/groups.io/g/MTFHRT/wiki/29602/189646.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774285.1713918444518577173"); + console.log("client_id:", "web.web08.237424.1714523386503563658"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774285.1713918444518577173" + client_id: "web.web08.237424.1714523386503563658" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/item/4000586480263.html</a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener">mites</a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/185908326110</a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener">https://www.aliexpress.us/item/2251832717628622.html</a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener">vials</a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener">1</a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener">2</a>,  <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener">caps</a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a> and <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a> in one shop, or <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a>. In UK <a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a>. In USA <a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener">BA</a>, <a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a> or <a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener">here</a> or (the cheapest) <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a>. In Canada <a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener">stoppers</a>+<a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener">BA</a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener">eBay</a> or <a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a> and buy <a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -808,66 +1179,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -877,9 +1212,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -908,48 +1241,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -964,13 +1292,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -992,7 +1324,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1013,138 +1345,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1166,6 +1504,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/189647.html b/groups.io/g/MTFHRT/wiki/29602/189647.html index 7554b7e8..661628af 100644 --- a/groups.io/g/MTFHRT/wiki/29602/189647.html +++ b/groups.io/g/MTFHRT/wiki/29602/189647.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774778.1713918444431817015"); + console.log("client_id:", "web.web09.237014.1714523386410892974"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774778.1713918444431817015" + client_id: "web.web09.237014.1714523386410892974" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -808,66 +1179,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -877,9 +1212,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -908,48 +1241,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -964,13 +1292,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -992,7 +1324,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1013,138 +1345,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1166,6 +1504,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/189700.html b/groups.io/g/MTFHRT/wiki/29602/189700.html index ee634f92..ae1ed80f 100644 --- a/groups.io/g/MTFHRT/wiki/29602/189700.html +++ b/groups.io/g/MTFHRT/wiki/29602/189700.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774279.1713918444355368485"); + console.log("client_id:", "web.web08.237415.1714523386308428309"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774279.1713918444355368485" + client_id: "web.web08.237415.1714523386308428309" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -808,66 +1179,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -877,9 +1212,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -908,48 +1241,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -964,13 +1292,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -992,7 +1324,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1013,138 +1345,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1166,6 +1504,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/189952.html b/groups.io/g/MTFHRT/wiki/29602/189952.html index 5f406b5a..00f0efc4 100644 --- a/groups.io/g/MTFHRT/wiki/29602/189952.html +++ b/groups.io/g/MTFHRT/wiki/29602/189952.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774769.1713918444274332994"); + console.log("client_id:", "web.web09.237010.1714523386214903318"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774769.1713918444274332994" + client_id: "web.web09.237010.1714523386214903318" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -670,7 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -686,10 +1057,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -702,7 +1073,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -808,66 +1179,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -877,9 +1212,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -908,48 +1241,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -964,13 +1292,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -992,7 +1324,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1013,138 +1345,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1166,6 +1504,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190227.html b/groups.io/g/MTFHRT/wiki/29602/190227.html index f99fd67b..2bd5a802 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190227.html +++ b/groups.io/g/MTFHRT/wiki/29602/190227.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774267.1713918444196971329"); + console.log("client_id:", "web.web08.237412.1714523386113249350"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774267.1713918444196971329" + client_id: "web.web08.237412.1714523386113249350" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -809,66 +1180,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -878,9 +1213,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -909,48 +1242,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -965,13 +1293,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -993,7 +1325,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1014,138 +1346,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1167,6 +1505,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190628.html b/groups.io/g/MTFHRT/wiki/29602/190628.html index 6429bac5..51bcbdb4 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190628.html +++ b/groups.io/g/MTFHRT/wiki/29602/190628.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774264.1713918444121202965"); + console.log("client_id:", "web.web09.237004.1714523386021797553"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774264.1713918444121202965" + client_id: "web.web09.237004.1714523386021797553" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=U2vCPVdHyRjUqandh%2FITM9tr6yo%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=6gOyfdkAbk0nasdvC%2FoC0S0K2bQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=KMuomK4Yyw8%2BxeNN%2FCU04TB6%2F4w%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523986&Signature=vlYT%2FykAYzm1Y9zLBU2iMCgpUXM%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -809,66 +1180,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -878,9 +1213,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -909,48 +1242,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -965,13 +1293,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -993,7 +1325,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1014,138 +1346,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1167,6 +1505,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190629.html b/groups.io/g/MTFHRT/wiki/29602/190629.html index 79198b86..57e8a924 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190629.html +++ b/groups.io/g/MTFHRT/wiki/29602/190629.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774758.1713918444040530332"); + console.log("client_id:", "web.web09.236998.1714523385928061403"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774758.1713918444040530332" + client_id: "web.web09.236998.1714523385928061403" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=qCM0eMXYCdtO4PCBoM9ZcSI84O8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=ujPNe98lBYjeqwIu98UC%2Fw5mGTQ%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=T%2BeOxLCwOL%2FGLvLrtKL7PUq%2Bpts%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919044&Signature=WuDdsEwG%2F1%2FgymYzI%2B2LCuMB77o%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -809,66 +1180,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -878,9 +1213,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -909,48 +1242,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -965,13 +1293,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -993,7 +1325,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1014,138 +1346,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1167,6 +1505,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190846.html b/groups.io/g/MTFHRT/wiki/29602/190846.html index 75f6e7be..9cc874f2 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190846.html +++ b/groups.io/g/MTFHRT/wiki/29602/190846.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774260.1713918443963783580"); + console.log("client_id:", "web.web09.236992.1714523385837446230"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774260.1713918443963783580" + client_id: "web.web09.236992.1714523385837446230" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -809,66 +1180,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -878,9 +1213,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -909,48 +1242,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -965,13 +1293,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -993,7 +1325,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1014,138 +1346,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1167,6 +1505,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190847.html b/groups.io/g/MTFHRT/wiki/29602/190847.html index 76b4cd32..de4e8ae2 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190847.html +++ b/groups.io/g/MTFHRT/wiki/29602/190847.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774750.1713918443884728713"); + console.log("client_id:", "web.web08.237386.1714523385740908070"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774750.1713918443884728713" + client_id: "web.web08.237386.1714523385740908070" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190872.html b/groups.io/g/MTFHRT/wiki/29602/190872.html index 5e05513e..3bcc3d08 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190872.html +++ b/groups.io/g/MTFHRT/wiki/29602/190872.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774250.1713918443806589690"); + console.log("client_id:", "web.web09.236974.1714523385649991163"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774250.1713918443806589690" + client_id: "web.web09.236974.1714523385649991163" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190915.html b/groups.io/g/MTFHRT/wiki/29602/190915.html index fb790e93..f1b0435d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190915.html +++ b/groups.io/g/MTFHRT/wiki/29602/190915.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774744.1713918443719813910"); + console.log("client_id:", "web.web08.237368.1714523385552282337"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774744.1713918443719813910" + client_id: "web.web08.237368.1714523385552282337" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/190942.html b/groups.io/g/MTFHRT/wiki/29602/190942.html index 3ac14449..c2e2afca 100644 --- a/groups.io/g/MTFHRT/wiki/29602/190942.html +++ b/groups.io/g/MTFHRT/wiki/29602/190942.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774244.1713918443640159234"); + console.log("client_id:", "web.web08.237359.1714523385452864755"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774244.1713918443640159234" + client_id: "web.web08.237359.1714523385452864755" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/191406.html b/groups.io/g/MTFHRT/wiki/29602/191406.html index 1a2cee69..82a6d026 100644 --- a/groups.io/g/MTFHRT/wiki/29602/191406.html +++ b/groups.io/g/MTFHRT/wiki/29602/191406.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774241.1713918443551776740"); + console.log("client_id:", "web.web08.237355.1714523385349696846"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774241.1713918443551776740" + client_id: "web.web08.237355.1714523385349696846" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/191417.html b/groups.io/g/MTFHRT/wiki/29602/191417.html index 66720b0e..6b6eee90 100644 --- a/groups.io/g/MTFHRT/wiki/29602/191417.html +++ b/groups.io/g/MTFHRT/wiki/29602/191417.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774737.1713918443471033565"); + console.log("client_id:", "web.web09.236945.1714523385257710275"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774737.1713918443471033565" + client_id: "web.web09.236945.1714523385257710275" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/191626.html b/groups.io/g/MTFHRT/wiki/29602/191626.html index edd2535d..fae97f0b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/191626.html +++ b/groups.io/g/MTFHRT/wiki/29602/191626.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774734.1713918443385879135"); + console.log("client_id:", "web.web08.237343.1714523385160598600"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774734.1713918443385879135" + client_id: "web.web08.237343.1714523385160598600" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/192624.html b/groups.io/g/MTFHRT/wiki/29602/192624.html index 14d2c747..0df2218f 100644 --- a/groups.io/g/MTFHRT/wiki/29602/192624.html +++ b/groups.io/g/MTFHRT/wiki/29602/192624.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774730.1713918443302447136"); + console.log("client_id:", "web.web08.237341.1714523385063480564"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774730.1713918443302447136" + client_id: "web.web08.237341.1714523385063480564" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=AKJ%2BFeYfFISBUYx0D4%2F8rPiXAL4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=MkwKWerE67P%2FaRqVK5za9cWm234%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=P89S%2FgJTtYCt%2BiOlHoKcprtcxlo%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523985&Signature=20PSobKVvlCTrO46j1X9unYOBYo%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/193627.html b/groups.io/g/MTFHRT/wiki/29602/193627.html index 5a14b393..a99ec17a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/193627.html +++ b/groups.io/g/MTFHRT/wiki/29602/193627.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774726.1713918443218153132"); + console.log("client_id:", "web.web09.236934.1714523384968275668"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774726.1713918443218153132" + client_id: "web.web09.236934.1714523384968275668" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/194218.html b/groups.io/g/MTFHRT/wiki/29602/194218.html index b935139b..d59125fa 100644 --- a/groups.io/g/MTFHRT/wiki/29602/194218.html +++ b/groups.io/g/MTFHRT/wiki/29602/194218.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774723.1713918443139585127"); + console.log("client_id:", "web.web08.237335.1714523384861514417"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774723.1713918443139585127" + client_id: "web.web08.237335.1714523384861514417" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/194253.html b/groups.io/g/MTFHRT/wiki/29602/194253.html index 3088f9e7..50a955c4 100644 --- a/groups.io/g/MTFHRT/wiki/29602/194253.html +++ b/groups.io/g/MTFHRT/wiki/29602/194253.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774226.1713918443062608745"); + console.log("client_id:", "web.web09.236923.1714523384770257958"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774226.1713918443062608745" + client_id: "web.web09.236923.1714523384770257958" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/194629.html b/groups.io/g/MTFHRT/wiki/29602/194629.html index 12e68beb..bc0390e1 100644 --- a/groups.io/g/MTFHRT/wiki/29602/194629.html +++ b/groups.io/g/MTFHRT/wiki/29602/194629.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774224.1713918442986883832"); + console.log("client_id:", "web.web08.237318.1714523384667436976"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774224.1713918442986883832" + client_id: "web.web08.237318.1714523384667436976" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=1B%2Ff05j2BIBgqX3DVIGXcPdqLhg%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=Gs5jBs7AxzzRVtMEYdBiXyVvUlo%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=VbkNgC4C%2BF202mtT27CGNnvTu8A%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919043&Signature=8ONNF4xFWGqJZMynT1cBv45rUo0%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/194635.html b/groups.io/g/MTFHRT/wiki/29602/194635.html index 98b2e8d9..b6105c5c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/194635.html +++ b/groups.io/g/MTFHRT/wiki/29602/194635.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774718.1713918442906818354"); + console.log("client_id:", "web.web09.236911.1714523384579859760"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774718.1713918442906818354" + client_id: "web.web09.236911.1714523384579859760" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/194867.html b/groups.io/g/MTFHRT/wiki/29602/194867.html index 79e91338..11f670e9 100644 --- a/groups.io/g/MTFHRT/wiki/29602/194867.html +++ b/groups.io/g/MTFHRT/wiki/29602/194867.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774716.1713918442830619635"); + console.log("client_id:", "web.web09.236905.1714523384491843190"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774716.1713918442830619635" + client_id: "web.web09.236905.1714523384491843190" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/194939.html b/groups.io/g/MTFHRT/wiki/29602/194939.html index e9e92e47..f9e69f4f 100644 --- a/groups.io/g/MTFHRT/wiki/29602/194939.html +++ b/groups.io/g/MTFHRT/wiki/29602/194939.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774215.1713918442754815136"); + console.log("client_id:", "web.web09.236899.1714523384399617103"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774215.1713918442754815136" + client_id: "web.web09.236899.1714523384399617103" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>).</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/195405.html b/groups.io/g/MTFHRT/wiki/29602/195405.html index 7c85ea23..4ba7ad62 100644 --- a/groups.io/g/MTFHRT/wiki/29602/195405.html +++ b/groups.io/g/MTFHRT/wiki/29602/195405.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774210.1713918442679716716"); + console.log("client_id:", "web.web08.237299.1714523384300610375"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774210.1713918442679716716" + client_id: "web.web08.237299.1714523384300610375" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vials+10ml+stoppers+caps</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/195973.html b/groups.io/g/MTFHRT/wiki/29602/195973.html index 4fc7a44b..09bb5d68 100644 --- a/groups.io/g/MTFHRT/wiki/29602/195973.html +++ b/groups.io/g/MTFHRT/wiki/29602/195973.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774703.1713918442597048526"); + console.log("client_id:", "web.web08.237294.1714523384204172433"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774703.1713918442597048526" + client_id: "web.web08.237294.1714523384204172433" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/195986.html b/groups.io/g/MTFHRT/wiki/29602/195986.html index c6a29fec..44fc4b49 100644 --- a/groups.io/g/MTFHRT/wiki/29602/195986.html +++ b/groups.io/g/MTFHRT/wiki/29602/195986.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774202.1713918442519209515"); + console.log("client_id:", "web.web09.236890.1714523384114391652"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774202.1713918442519209515" + client_id: "web.web09.236890.1714523384114391652" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/196048.html b/groups.io/g/MTFHRT/wiki/29602/196048.html index 605cd5fa..306cf2ea 100644 --- a/groups.io/g/MTFHRT/wiki/29602/196048.html +++ b/groups.io/g/MTFHRT/wiki/29602/196048.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774695.1713918442436296701"); + console.log("client_id:", "web.web08.237290.1714523384019792621"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774695.1713918442436296701" + client_id: "web.web08.237290.1714523384019792621" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PdETn4HB%2Bz1pPhenr6ZBIays6%2B4%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=PwQvAduZx9U6wQK8027ZtV1kHRk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=uA%2FtZ1vQ67YQ8cjkWEzvT8BEp50%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523984&Signature=sTC7Wz2z4nmS1vtE8ULFmngt%2FeI%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/196085.html b/groups.io/g/MTFHRT/wiki/29602/196085.html index 35e60567..6d3ed333 100644 --- a/groups.io/g/MTFHRT/wiki/29602/196085.html +++ b/groups.io/g/MTFHRT/wiki/29602/196085.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774198.1713918442358211234"); + console.log("client_id:", "web.web09.236880.1714523383927786682"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774198.1713918442358211234" + client_id: "web.web09.236880.1714523383927786682" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/196597.html b/groups.io/g/MTFHRT/wiki/29602/196597.html index c3c7a14e..3b94936c 100644 --- a/groups.io/g/MTFHRT/wiki/29602/196597.html +++ b/groups.io/g/MTFHRT/wiki/29602/196597.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774691.1713918442274853582"); + console.log("client_id:", "web.web09.236875.1714523383835733768"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774691.1713918442274853582" + client_id: "web.web09.236875.1714523383835733768" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197239.html b/groups.io/g/MTFHRT/wiki/29602/197239.html index e1815cd9..f131aa9d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197239.html +++ b/groups.io/g/MTFHRT/wiki/29602/197239.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774191.1713918442194199178"); + console.log("client_id:", "web.web09.236870.1714523383744930602"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774191.1713918442194199178" + client_id: "web.web09.236870.1714523383744930602" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197796.html b/groups.io/g/MTFHRT/wiki/29602/197796.html index a2e0c4e7..3e0e2ca8 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197796.html +++ b/groups.io/g/MTFHRT/wiki/29602/197796.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774187.1713918442118795892"); + console.log("client_id:", "web.web08.237269.1714523383632871158"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774187.1713918442118795892" + client_id: "web.web08.237269.1714523383632871158" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or (the cheapest) <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials on <a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+sterile&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=240" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">eBay</span></a> or <span style="text-decoration: underline;"><a href="https://www.amazon.com/Depyrogenated-Sterile-Clear-Borosillicate-Glass/dp/B077KFKKJM/" target="_blank" rel="nofollow noopener">Amazon</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197814.html b/groups.io/g/MTFHRT/wiki/29602/197814.html index b8f5ba8b..5b3cd2ed 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197814.html +++ b/groups.io/g/MTFHRT/wiki/29602/197814.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774680.1713918442040840260"); + console.log("client_id:", "web.web09.236858.1714523383542696956"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774680.1713918442040840260" + client_id: "web.web09.236858.1714523383542696956" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=ZkrYjTFLVRFBsPk2T%2Beh6Dtdme8%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=pxwqs%2FxvOaVAAgEqdlqcphAKk3g%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=B3pmrFm3nXbY1M1CpA%2FKuYv1%2BVk%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">sealed vials</a></span>+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919042&Signature=hII4IgS9ywj1erMW%2BVpSLNq8Xl4%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197818.html b/groups.io/g/MTFHRT/wiki/29602/197818.html index 3edb92d6..3549b074 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197818.html +++ b/groups.io/g/MTFHRT/wiki/29602/197818.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774181.1713918441964035054"); + console.log("client_id:", "web.web08.237257.1714523383438586475"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774181.1713918441964035054" + client_id: "web.web08.237257.1714523383438586475" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197828.html b/groups.io/g/MTFHRT/wiki/29602/197828.html index dbfee0d5..78e10741 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197828.html +++ b/groups.io/g/MTFHRT/wiki/29602/197828.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774675.1713918441886588240"); + console.log("client_id:", "web.web09.236845.1714523383348964577"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774675.1713918441886588240" + client_id: "web.web09.236845.1714523383348964577" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197829.html b/groups.io/g/MTFHRT/wiki/29602/197829.html index 160c025c..3db922ee 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197829.html +++ b/groups.io/g/MTFHRT/wiki/29602/197829.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774671.1713918441805510709"); + console.log("client_id:", "web.web08.237244.1714523383249544019"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774671.1713918441805510709" + client_id: "web.web08.237244.1714523383249544019" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197830.html b/groups.io/g/MTFHRT/wiki/29602/197830.html index fc356bb0..1acc5c9d 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197830.html +++ b/groups.io/g/MTFHRT/wiki/29602/197830.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774175.1713918441729987735"); + console.log("client_id:", "web.web09.236838.1714523383158398164"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774175.1713918441729987735" + client_id: "web.web09.236838.1714523383158398164" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/197997.html b/groups.io/g/MTFHRT/wiki/29602/197997.html index 2adf0226..283148d4 100644 --- a/groups.io/g/MTFHRT/wiki/29602/197997.html +++ b/groups.io/g/MTFHRT/wiki/29602/197997.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774667.1713918441651766213"); + console.log("client_id:", "web.web09.236835.1714523383068772022"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774667.1713918441651766213" + client_id: "web.web09.236835.1714523383068772022" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=4ABK5CBHitZkYbnFjaxdRCbXlF0%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=dLmwZ1iT8vpeDD8pb5hp79Eerjc%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=0mzQBn70yaN%2BGMvBZqliEalvxZM%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523983&Signature=MBVC8fMgHuPu8XOWLLG6MEC3Y1U%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/198070.html b/groups.io/g/MTFHRT/wiki/29602/198070.html index 8aed654c..5b61e6d3 100644 --- a/groups.io/g/MTFHRT/wiki/29602/198070.html +++ b/groups.io/g/MTFHRT/wiki/29602/198070.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774662.1713918441570873922"); + console.log("client_id:", "web.web09.236831.1714523382971234373"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774662.1713918441570873922" + client_id: "web.web09.236831.1714523382971234373" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/198075.html b/groups.io/g/MTFHRT/wiki/29602/198075.html index d8a79f8b..009e202a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/198075.html +++ b/groups.io/g/MTFHRT/wiki/29602/198075.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774659.1713918441488904114"); + console.log("client_id:", "web.web08.237229.1714523382873201190"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774659.1713918441488904114" + client_id: "web.web08.237229.1714523382873201190" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/198774.html b/groups.io/g/MTFHRT/wiki/29602/198774.html index 90870cd8..d13d10e3 100644 --- a/groups.io/g/MTFHRT/wiki/29602/198774.html +++ b/groups.io/g/MTFHRT/wiki/29602/198774.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774160.1713918441410265211"); + console.log("client_id:", "web.web08.237224.1714523382775643471"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774160.1713918441410265211" + client_id: "web.web08.237224.1714523382775643471" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/199148.html b/groups.io/g/MTFHRT/wiki/29602/199148.html index 69bc32fd..9344b30b 100644 --- a/groups.io/g/MTFHRT/wiki/29602/199148.html +++ b/groups.io/g/MTFHRT/wiki/29602/199148.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774652.1713918441330386366"); + console.log("client_id:", "web.web09.236819.1714523382684572223"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774652.1713918441330386366" + client_id: "web.web09.236819.1714523382684572223" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -810,66 +1181,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -879,9 +1214,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -910,48 +1243,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -966,13 +1294,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -994,7 +1326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1015,138 +1347,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1168,6 +1506,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/199960.html b/groups.io/g/MTFHRT/wiki/29602/199960.html index 1cefacc9..07c70f27 100644 --- a/groups.io/g/MTFHRT/wiki/29602/199960.html +++ b/groups.io/g/MTFHRT/wiki/29602/199960.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774156.1713918441248614026"); + console.log("client_id:", "web.web08.237218.1714523382578411888"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774156.1713918441248614026" + client_id: "web.web08.237218.1714523382578411888" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -811,66 +1182,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -880,9 +1215,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -911,48 +1244,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -967,13 +1295,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -995,7 +1327,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1016,138 +1348,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1169,6 +1507,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/201192.html b/groups.io/g/MTFHRT/wiki/29602/201192.html index 7663f84e..0a595423 100644 --- a/groups.io/g/MTFHRT/wiki/29602/201192.html +++ b/groups.io/g/MTFHRT/wiki/29602/201192.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774154.1713918441174371915"); + console.log("client_id:", "web.web09.236809.1714523382477996667"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774154.1713918441174371915" + client_id: "web.web09.236809.1714523382477996667" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -811,66 +1182,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -880,9 +1215,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -911,48 +1244,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -967,13 +1295,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -995,7 +1327,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1016,138 +1348,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1169,6 +1507,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/201237.html b/groups.io/g/MTFHRT/wiki/29602/201237.html index 38c55405..172487e1 100644 --- a/groups.io/g/MTFHRT/wiki/29602/201237.html +++ b/groups.io/g/MTFHRT/wiki/29602/201237.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774643.1713918441093333522"); + console.log("client_id:", "web.web08.237208.1714523382379302732"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774643.1713918441093333522" + client_id: "web.web08.237208.1714523382379302732" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -811,66 +1182,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -880,9 +1215,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -911,48 +1244,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -967,13 +1295,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -995,7 +1327,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1016,138 +1348,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1169,6 +1507,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/202979.html b/groups.io/g/MTFHRT/wiki/29602/202979.html index 60ecee9d..85fe147e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/202979.html +++ b/groups.io/g/MTFHRT/wiki/29602/202979.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774145.1713918441015755354"); + console.log("client_id:", "web.web08.237203.1714523382279618208"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774145.1713918441015755354" + client_id: "web.web08.237203.1714523382279618208" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -671,7 +1042,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=aVDKX9J7Z18iH2WG8z8zhTb1VjA%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -687,10 +1058,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=DWJZJgJ78NT4LeYVycW0z3jYAfk%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=XPDuNsnICCDYkM7whJb5KYsj3Tc%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -703,7 +1074,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919041&Signature=2Y7uT4JZgzZe704AGUR5fbHYPZ8%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -811,66 +1182,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -880,9 +1215,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -911,48 +1244,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -967,13 +1295,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -995,7 +1327,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1016,138 +1348,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1169,6 +1507,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/203230.html b/groups.io/g/MTFHRT/wiki/29602/203230.html index 36ae2e09..68ff342e 100644 --- a/groups.io/g/MTFHRT/wiki/29602/203230.html +++ b/groups.io/g/MTFHRT/wiki/29602/203230.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774635.1713918440933482173"); + console.log("client_id:", "web.web09.236797.1714523382189829445"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774635.1713918440933482173" + client_id: "web.web09.236797.1714523382189829445" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Ultimate DIY</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,32 +927,75 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="../30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="../30846.html"> + Home + </a> + </li> + + <li> + <a href="../32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="../34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="../29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> Last edited <script id="timedispupdated29602"> - $('#timedispupdated29602').replaceWith(DisplayShortTime(1713169488373935500, false + $('#timedispupdated29602').replaceWith(DisplayShortTime(1714463966229202489, false )); </script> · <a href="history.html"> - 265 revisions + 266 revisions </a>    <a href="../29602.html"> <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <p style="text-align: center;"><span style="font-size: 24pt;">MtF HRT: Ultimate DIY</span></p> <p>Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.</p> <p style="text-align: right;"><a href="https://groups.io/g/TGrus/wiki/Ultimate-DIY" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">эта инструкция по-русски</span></a></p> @@ -672,7 +1043,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Equipment"></a>Equipment</h2> <h3><a name="Necessary"></a>Necessary</h3> <p>The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).</p> -<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919040&Signature=0F5fTNI6532cH8a3K8az%2FbqWjsI%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> +<p>If you buy ready-to-use scales then they must look exactly like this:<br/><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13908/354x254.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=BCAKtE9hKKMentySoHE8YMuZsjU%3D" align="right" class="myimg-responsive"/><span style="text-decoration: underline;"><a href="https://www.ebay.com/itm/363747240371" target="_blank" rel="nofollow noopener">https://www.ebay.com/itm/363747240371</a></span><br/><a href="https://www.aliexpress.com/item/4000586480263.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/item/4000586480263.html</span></a></p> <p>Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.</p> <p>Search for other sellers:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1</span></a></p> <p><a href="https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1</span></a></p> @@ -688,10 +1059,10 @@ function createAlert(msg, isError, autoClose, noClose) { <p>Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and <a href="https://en.wikipedia.org/wiki/House_dust_mite" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">mites</span></a>) if never washed. Water - bacteria - pyrogens. Hormone powders are sold not sterile, so any cleaning / sterilization efforts before terminal heat sterilization are futile. Don't try to improve this technology: it protects you from mistakes and unexpected problems.</p> <h2><a name="Other-raw-materials-and-expendables"></a>Other raw materials and expendables</h2> <h3><a name="Vials2C-stoppers2C-caps"></a>Vials, stoppers, caps</h3> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919040&Signature=vDO5I2hCyG1DldEGAoVtQzrP%2Fmw%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13965/s-l300.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=7sFQVWYKEnVu3hUOZOx6eMaJlo4%3D" align="right" class="myimg-responsive"/>Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:<br/><a href="https://www.ebay.com/itm/185908326110" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/itm/185908326110</span></a><br/><a href="https://www.aliexpress.us/item/2251832717628622.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.us/item/2251832717628622.html</span></a><br/>Flat septa are not suitable instead of stoppers. Search:<br/><a href="https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1</span></a></p> <p><a href="https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap</span></a></p> <p>After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must <strong>not</strong> have tear-off weak place on one side like this:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919040&Signature=HC%2BR%2Bzb4uwhYCttQTXkbsOAoOYg%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13909/cap-tear-off.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=CQ6LPeW%2Btez3MxBrNukXwj8OA5E%3D" class="myimg-responsive"/></p> <p>In EU you can buy <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/VIC010-001NS" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>, stoppers <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22STG20-%200001%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">1</span></a> or <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/STR20-0001" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a>, <a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BKMA%2020-GO%22" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a>, <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22BA%200020%22" target="_blank" rel="nofollow noopener">benzyl alcohol</a></span> and <span style="text-decoration: underline;"><a href="https://lab-supply-shop.com/epages/171448.sf/en_GB/?ObjectPath=/Shops/171448/Products/%22MCT%201L%22" target="_blank" rel="nofollow noopener">MCT oil</a></span> in one shop, or (cheaper) <a href="https://www.glas-shop.com/glasprodukte/injektionsflascheninfusionsflaschen/injektionsflaschenklarglas5100ml/injektionsflasche-klarglas-10ml.php" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/injektionsstopfeneinzeln20mmrotausbrombutyl.php" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.glas-shop.com/verschluesse2/verschluesse-fuer-injektionsflaschen/boerdelkappe-2025-x-74-mm-mittel-abriss-gruen.php" target="_blank" rel="nofollow noopener">caps</a></span>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/Mikikit-Clear-Glass-Bottle-Transparent/dp/B09TPLQQRB/" target="_blank" rel="nofollow noopener">here</a></span>, or <a href="https://www.amazon.es/gp/product/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>, or <span style="text-decoration: underline;"><a href="https://www.amazon.de/-/en/H566EJW15X19NTIP4/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener">here</a></span>. In UK <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">here</a></span> or <a href="https://www.amazon.co.uk/Mikikit-10ml-Clear-Glass-Bottle/dp/B09TFPB6SR/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>. In USA <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/vials/open/rls-10ml-tubular-clear-glass-serum-vials-qty-1.html" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/butyl-rubber-stoppers-for-vials-20mm-gray.html" target="_blank" rel="nofollow noopener">stoppers</a></span>+<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/lab-supplies/20mm-standard-aluminum-seal-please-click-to-view-all-colors.html" target="_blank" rel="nofollow noopener">caps</a></span> (<span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/usp-oils/mct-60-40-caprylic-c8-capric-c10-oil.html" target="_blank" rel="nofollow noopener">oil</a></span>, <a href="https://www.medical-and-lab-supplies.com/chemicals-solvents/benzyl-alcohol-usp.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>, <span style="text-decoration: underline;"><a href="https://www.medical-and-lab-supplies.com/medical-supplies/syringes-and-needles/diabetic-syringes/aimsco-maxicomfort-diabetic-insulin-syringes.html" target="_blank" rel="nofollow noopener">syringes</a></span>) or <span style="text-decoration: underline;"><a href="https://lemelange.com/unsterilevialwide10ml20mm.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://lemelange.com/20-mm-vial-stoppers-grey.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://lemelange.com/20mmaluminumringwithcentertearout.aspx" target="_blank" rel="nofollow noopener">caps</a></span> or <a href="https://qcvialz.com/vial-samples/316-10ml-clear-shorty-serum-vials-iso-10r-24x45mm-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">vials</span></a>+<a href="https://qcvialz.com/vial-stopper-samples/319-20mm-round-bottom-vial-stopper-sample-pack-of-10.html" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://qcvialz.com/superior-flip-cap-vial-seals/482-light-blue-20mm-superior-flip-cap-vial-seals-pack-of-10pc.html" target="_blank" rel="nofollow noopener">caps</a></span> or <span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/110-10-ML-Unsealed-Clear-Vial.aspx" target="_blank" rel="nofollow noopener">vials</a></span>+<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/store/p/38-Grey-Butyl-Stopper.aspx" target="_blank" rel="nofollow noopener">stoppers</a></span>+<a href="https://www.gpzmedlab.com/store/p/102-Aluminum-Seal-Center-Tear-Out.aspx" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">caps</span></a> (<span style="text-decoration: underline;"><a href="https://www.gpzmedlab.com/easy-touch-1-cc-insulin-syringe-with-28-g-x-1-2-needle-100-count.aspx" target="_blank" rel="nofollow noopener">syringes</a></span>) or <a href="https://www.premiumvials.com/10ml-glass-bottle-with-lid-transparent-vial-b-10pcs/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a> or sealed vials(<span style="text-decoration: underline;"><a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener">1</a></span> <a href="https://www.amazon.com/10ml-Sterile-Vial-Blue-Flip/dp/B07JD49TK2/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">2</span></a> <a href="https://www.amazon.com/Biocomma-Aluminum-Caps%EF%BC%8CPenicillin-Transparent-Borosilicate/dp/B09W5HM7R6/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">3</span></a> <a href="https://www.amazon.com/Empty-Borosillicate-Sealed-Sterile-Serum/dp/B005DIPY32/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">4</span></a> <a href="https://www.amazon.com/5-10ml-Empty-Sealed-Sterile-Vials/dp/B009CC0KMA/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">5</span></a> <a href="https://www.amazon.com/Molded-Sterile-Clear-Vials-Black/dp/B07KVCL4YF/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">6</span></a>)+<a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">new caps</span></a>. In Canada <span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/10ml-vials-clear/products/10ml-vial-22mm-x-50mm-clear?variant=8081524817966" target="_blank" rel="nofollow noopener">vials</a></span>+<a href="https://canadianmedhealthsupplies.ca/collections/all-rubber-stoppers/products/20mm-rubber-stopper-grey?variant=8081553915950" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">stoppers</span></a>+<span style="text-decoration: underline;"><a href="https://canadianmedhealthsupplies.ca/collections/20mm-flip-off-cap-flip-off/products/20mm-white-flip-off-cap-flip-off" target="_blank" rel="nofollow noopener">caps</a></span> (<a href="https://canadianmedhealthsupplies.ca/collections/solvents/products/benzyl-alcohol" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">BA</span></a>). In Mexico <a href="https://varienvases.mx/products/antibiotico-10ml-con-tapon-y-casquillo?variant=42526677467355" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">here</span></a>.</p> <p>If you are paranoid and believe incompetent <a href="https://issuepedia.org/Sufficiently_advanced_incompetence_is_indistinguishable_from_malice" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">or</span></a> deceitful slander about this guide then you can buy washed sealed sterile empty vials from <a href="https://www.ebay.com/sch/257835/i.html?_dkr=1&iconV2Request=true&_blrs=recall_filtering&_ssn=texlabsupplyinternational&_oac=1&_ipg=240&_fcid=1&LH_BIN=1&_sop=15" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">USA</span></a> or <span style="text-decoration: underline;"><a href="https://www.ebay.co.uk/itm/333152620103" target="_blank" rel="nofollow noopener">UK</a></span> and buy <span style="text-decoration: underline;"><a href="https://www.amazon.com/20MM-13MM-Single-Seals-Eco-Green/dp/B094Q5VVTH/" target="_blank" rel="nofollow noopener">new caps</a></span> or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.</p> <h3><a name="Oil"></a>Oil</h3> @@ -704,7 +1075,7 @@ function createAlert(msg, isError, autoClose, noClose) { <h2><a name="Mix"></a>Mix</h2> <p>(See below for an alternate way without a funnel).</p> <p>Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:</p> -<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1713919040&Signature=oXY4lCz60DYyLp%2BweupwUGRWcys%3D" class="myimg-responsive"/></p> +<p><img src="https://s3-us-west-1.amazonaws.com/groupsiowikiimages/4415/13910/cone.jpg?AWSAccessKeyId=AKIAJECNKOVMCCU3ATNQ&Expires=1714523982&Signature=qBifQG%2FclMqnNomYXbQXTO3r5qY%3D" class="myimg-responsive"/></p> <p>Two recipes I can recommend:</p> <p>1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm<sup><small>3</small></sup>),<br/>benzyl alcohol (preservative - antibacterial) 0.2 ml,<br/>MCT oil 10-0.2-0.5/1.1= 9.35 ml.</p> <p>2) 0.5 g of estradiol enanthate,<br/>MCT oil 10-0.5/1.1= 9.55 ml.</p> @@ -812,66 +1183,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="../30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="../30846.html"> - Home - </a> - </li> - - <li> - <a href="../32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="../34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="../29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -881,9 +1216,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -912,48 +1245,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -968,13 +1296,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -996,7 +1328,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -1017,138 +1349,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1170,6 +1508,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/29602/204015.html b/groups.io/g/MTFHRT/wiki/29602/204015.html new file mode 100644 index 00000000..7a6c729c --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/29602/204015.html @@ -0,0 +1,1533 @@ + + + <!DOCTYPE html> + <html lang="en-US"> + <head> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <meta name="pinterest" content="nopin" /> + <meta name="pinterest" content="nohover" /> + + <meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" /> + <link rel="apple-touch-icon" sizes="57x57" href="https://groups.io/img/org.1/favicons/apple-icon-57x57.png"> + <link rel="apple-touch-icon" sizes="60x60" href="https://groups.io/img/org.1/favicons/apple-icon-60x60.png"> + <link rel="apple-touch-icon" sizes="72x72" href="https://groups.io/img/org.1/favicons/apple-icon-72x72.png"> + <link rel="apple-touch-icon" sizes="76x76" href="https://groups.io/img/org.1/favicons/apple-icon-76x76.png"> + <link rel="apple-touch-icon" sizes="114x114" href="https://groups.io/img/org.1/favicons/apple-icon-114x114.png"> + <link rel="apple-touch-icon" sizes="120x120" href="https://groups.io/img/org.1/favicons/apple-icon-120x120.png"> + <link rel="apple-touch-icon" sizes="144x144" href="https://groups.io/img/org.1/favicons/apple-icon-144x144.png"> + <link rel="apple-touch-icon" sizes="152x152" href="https://groups.io/img/org.1/favicons/apple-icon-152x152.png"> + <link rel="apple-touch-icon" sizes="180x180" href="https://groups.io/img/org.1/favicons/apple-icon-180x180.png"> + <link rel="icon" type="image/png" sizes="192x192" href="../../../../img/org.1/favicons/android-icon-192x192.png"> + <link rel="icon" type="image/png" sizes="32x32" href="../../../../img/org.1/favicons/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="96x96" href="../../../../img/org.1/favicons/favicon-96x96.png"> + <link rel="icon" type="image/png" sizes="16x16" href="../../../../img/org.1/favicons/favicon-16x16.png"> + <link rel="manifest" href="../../../../img/org.1/favicons/manifest.json"> + <meta name="msapplication-TileColor" content="#ffffff"> + <meta name="msapplication-TileImage" content="/ms-icon-144x144.png"> + + + + +<script> +/* stubs */ +const hapticsImpactHeavy = async () => { +}; +const hapticsImpactMedium = async () => { +}; +const hapticsImpactLight = async () => { +}; +const hapticsVibrate = async () => { +}; +const hapticsSelectionStart = async () => { +}; +const hapticsSelectionChanged = async () => { +}; +const hapticsSelectionEnd = async () => { +}; +</script> + + +<script> + + function setPullToRefresh() {} + + function gotoURL(inurl) { + window.location.href = inurl; + return; + } + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); + if (isHTMX == true) { + document.body.addEventListener('htmx:afterSettle', f, {once: true}); + } else { + if (document.readyState !== 'loading') { + console.log('document is already ready, just execute code here'); + f(); + } else { + console.log('document was not ready, place code here'); + document.addEventListener('DOMContentLoaded', f, {once: true}); + } + } + } + + // stub + function logError(data, url, linenumber) { + console.log(data) + return; + } + var pushSubToken; + var ignoreErrors = false; + var lastError = ""; + + window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) { + let column; + let stack; + if (console && console.log) { + console.log("msg:", errorMessage); + console.log("url:", errorUrl); + console.log("line:", errorLine); + if (errorColumn !== undefined && errorObj != null) { + console.log("column:", errorColumn); + column = errorColumn; + } + if (errorObj !== undefined && errorObj != null) { + console.log("stack:", errorObj.stack); + stack = errorObj.stack; + } + console.log("client_id:", "web.web08.237199.1714523382093620013"); + console.log("last_error:", lastError); + console.log("stack:", stack); + } + if (errorUrl == "" || errorUrl === null) { + errorUrl = window.location.href; + } + if (errorMessage.includes("SecurityError:") == true) { + ignoreErrors = true; + } + if (ignoreErrors == true) { + console.log("cookies, disabled, ignoring"); + lastError = errorMessage; + return; + } + jQuery.ajax({ + type: 'POST', + url: '/jsclienterror', + data: { + msg: errorMessage, + url: errorUrl, + line: errorLine, + column: column, + stack: stack, + last_error: lastError, + client_id: "web.web08.237199.1714523382093620013" + }, + success: function() { + if (console && console.log) { + console.log('JS error report successful.'); + } + lastError = errorMessage; + }, + error: function() { + if (console && console.error) { + console.error('JS error report submission failed!'); + } + lastError = errorMessage; + } + }); + return true; + } + +</script> + + + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> + <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> + <script src="../../../../js/run_prettify.js"></script> + <title> + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 266 revisions + +    + + + +
+ +
+
+ +
+
+ + +

MtF HRT: Ultimate DIY

+

Here I describe Do-It-Yourself hormonal treatment for male-to-female transsexuals/transgender: be your own gatekeeper, endocrinologist, pharmacist and nurse. Cook injectable estradiol by yourself. Safer, more effective and unbelievably cheaper than relying on medical professionals.

+

эта инструкция по-русски

+

+

Without gatekeepers

+

Endocrinologists usually require a letter/referral from gatekeepers: psychotherapists, psychologists, sexologists or psychiatrists. Not because endocrinologists care for you, but because they care for themselves: they fear that you regret and sue them for causing you bodily harm. There isn't a medical examination, blood or psychological test able to prove or disprove presence or absence of transsexualism in each separate person. Statistics is meaningless when the question is whether you'll regret social transition or not. So, gatekeepers make appearances of "examination" and stall you for long time while milking you (or insurance/taxpayers) for money.

+

Medical professionals routinely make mistakes in both directions: approve crazy people and unnecessarily delay transsexuals who'll not regret.

+

If you obtain or make hormones without prescription, you'll have nobody but yourself to blame if you regret social consequences of your decision to take hormones.

+

Be your own endocrinologist

+

Endocrinologists treat mostly diabetes and problems with thyroid. For that endos prescribe multiple blood tests and adjust meds dosages to drive blood glucose or T4 level into "normal range". Endos are used to such approach, it keeps them busy and paid. With the only goal to maximize quantity of doctor visits paid by patients or insurance, gangs of American endos write guidelines how to treat transsexuals: with same approach. All the numbers in such guidelines and all the bogeyman stories about side effects of estradiol are bullshit.

+

"Normal range" is from measurements of 90% of healthy people: 5% of lowest and 5% of highest results are discounted. Normal range of estradiol for pregnancy is up to 40000 pg/ml = 147000 pmol/l. In a group of 86 pregnant women estradiol level was up to 75137 pg/ml = 275753 pmol/l: http://cebp.aacrjournals.org/content/12/5/452.figures-only . Pregnant women don't drop dead from such estradiol level, so you wouldn't even if your peak reaches 5000 pg/ml.

+

It's even darker than that: the numbers in guidelines are chosen deliberately low to force transsexuals to pay for more doctor visits to beg for more estradiol.

+

Doctors also recall the mantra in their gospels (textbooks) about estrogens: dosage the less the better, stop as soon as possible. They never realize that this mantra was written in the fear of uterine cancer. And that you haven't an uterus.

+

Currently lifetime breast cancer risk for cis-women in North America is 13% because of hundreds of monthly hormonal cycles. Doctors believe "the more estrogen, the more breast cancer risk". But statistically, every pregnancy decreases the woman's breast cancer risk though during pregnancy blood estradiol level increases in hundred times. Explanation of this seeming contradiction: because every pregnancy decreases cumulative number of menstrual cycles. In more detail: At one phase of hormonal cycle ductal epithelium in milk glands proliferates (proliferation is tissue growth by cell division), at another phase apoptosis comes (tissue shrinking by cell suicide). Each cell division (mitosis) carries risk of mutation. Mutations cause cancer. Before advent of contraceptives, breast cancer was a disease of celibate nuns. A woman was pregnant, then breastfeeding for few years (that also usually suppresses menstruations), then quickly :) impregnated again and so on until death or menopause. Then a woman had few menstruations during her whole life. If you don't make monthly cycles then your breast cancer risk is as low as men's, no matter how high estradiol level.

+

Giving MtF low estrogen dosage alone doesn't work. So, doctors prescribe antiandrogens: spironolactone (dangerous and mostly ineffective) or cyproterone acetate (harmful, dangerous, counterproductive) or GnRH superagonists such as Lupron or Zoladex (insanely expensive) or bicalutamide (expensive, and very few endos heard of it, side effects listed in package insert seem dangerous though really they aren't). Doctors love to prescribe expensive meds because doctors' fee seems less significant in comparison. Most likely you'd be prescribed spironolactone or cyproterone acetate, so your doctor is hazardous for your health.

+

Why not to give more estradiol? Because largest estradiol pills nowadays are 2 mg. One pill a day according to the gospel (package insert) does nothing for MtF. No doctor would prescribe more than 4 pills a day. Medical school is cramming huge amount of info. Doctors aren't used to dig for numbers and to think by themselves. They blindly believe other doctors' opinions. No doctor managed to dig for numbers and calculate: birth control pills prescribed to over hundred million women contain ethinylestradiol 0.03 mg/day which affects liver and blood clotting 500 times stronger than oral estradiol, so risk from oral estradiol 0.03*500= 15 mg/day is considered acceptable. But estradiol 15 mg/day is 8 pills per day - seems too much for doctors. Simple arithmetic is alien science for them.
I'm an engineer, I'm not afraid of arithmetic. :) And I study MtF HRT in depth since 1989. In Italy ethinylestradiol 1000 mcg = 1 mg pills are available, so doctors there prescribe 2 such pills per day to MtF. That's as dangerous as oral estradiol 2*500= 1000 mg/day. And? Nobody notices. I conclude that oral estradiol 20 mg/day is okay.

+

MtF HRT with an estrogen without antiandrogens is called "monotherapy". Oral estradiol 20 mg/day (10 mg twice a day) suppresses testosterone production by testicles completely, so antiandrogens are unnecessary. You can mail-order estradiol pills from abroad, though expensive:
https://www.inhousepharmacy.vu/p-166-estrofem-2mg.aspx
https://www.inhousepharmacy.vu/p-2073-estradiol-2mg.aspx
https://www.inhousepharmacy.vu/p-1866-estrofem-tablets-2mg.asp
https://www.inhousepharmacy.vu/p-112680811-estradiol-tablets-2mg-epic-pharma-usa.aspx

+

Only 5% of swallowed estradiol reaches blood. Sublingually (under the tongue) or subbuccally (between a lip and a gum) gives better absorption, but I don't believe that more than in 1.5 times, can cause mood swings and soon becomes too inconvenient. Transdermal patches and gels with estradiol are even more expensive than pills. One more way to deliver estradiol is injections, 100% absorption. If the solution is concentrated then you can use insulin syringes. Estradiol valerate (EV) 40 mg/ml 0.18 ml every 5 days or estradiol enanthate (EEn) 50 mg/ml 0.22 ml weekly is as effective as oral estradiol 20 mg/day, but is cheaper. Factory-made injectable EV is available without prescription https://www.inhousepharmacy.vu/p-99900888-ar-estradiol-valerate-40mgml.aspx (though often out of stock, "expected" date is a lie: they just increase it). I make a copy 15 times cheaper than that, and I make EEn suitable for injections every 7 or 10 days: http://lena.kiev.ua/EV/ . Below I explain how you can cook injectable estradiol by yourself.

+

If you had male pattern baldness then add finasteride 0.05 - 0.1 mg (1/100 - 1/50 of a 5 mg pill) once a day, available in InHousePharmacy or AllDayChemist or DragonOrdnance or from me as an addition to ready-to-use injectable EV or EEn. Don't take dutasteride because of possible mental side effects (also, dutasteride accumulates in blood and continues to give side effects for months after stopping it). Finasteride is necessary despite complete suppression of testosterone production by testicles by injectable estradiol or/and surgical removal of testicles because of DHEA production by adrenals. Finasteride blocks DHEA->T->DHT conversion inside hair follicle cells which is unnoticed by blood tests.

+

I advise everybody (not only MtF) to take a vitamins+minerals supplement like this non-stop, all year round.

+

It really is that simple after you throw out all the bullshit about "physiological" or "target" levels and learn all the details which side effects are real and which aren't.

+

Why I chose this dosage to advise for monotherapy: with it I can be sure that it's enough for any MtF without blood tests. Different people on the same dosage get blood estradiol level differing in up to 10 times. Sensitivity of different people for the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. In USA a blood test without prescription costs $79 (1 2a+2b 3 4) and is available not everywhere. In UK £39 or £89. In Australia $69. In Canada $200 (1+2). In Netherlands €55. In Sweden $90 (1+2). In many countries only with prescription, and doctors refuse to prescribe tests for meds they didn't prescribe. My or DIY injectables without blood tests are cheaper than lower dosage with several blood tests. And no time wasted on determining barely enough dosage.

+

I don't believe that beginning from lower estradiol dosage (possible safely only with addition of bicalutamide) gives better results. Doctors love to begin from low estrogen dosage with lots of blood tests because this keeps them busy and paid. So they claim that it's allegedly better. Doctors in other countries parrot that. There isn't any evidence. People repeat doctors' claims.

+

In short: when it's about MtF HRT, doctors do not know better.

+

Cook your injectable estradiol by yourself

+

If you are attentive and diligent then you can make injectable estradiol by yourself (for yourself only) as I described below. If you are afraid or unsure then you can buy ready-to-use vials from me. I have over 3500 satisfied customers. I lost count how many times I was called lifesaver, fairy godmother, angel, godsend, saint.

+

May be you heard claims that I advocate unsafe, insufficient stirilization. Those scientifically-appearing (at first glance) claims (mentioning standards and quoting articles) were published as a marketing tool, to denigrate a competitor (me). Noone of my 3500 customers complained of infection. Why? Because actually it's the opposite: terminal heat sterilization is more reliable than filtering + aseptic procedures. I explained details to the disparager, she ignored explanations, never replied and didn't take down the belittling. I explained details below in the Equipment, Sterilize sections of this guide and separate explanation linked from Myths, but people who believe the marketing slander never read.

+

Buy estradiol enanthate powder

+

Don't buy estradiol valerate because it's inferior: requires injections every 5 days and either lower concentration (more oil to inject) or addition of a solvent (benzyl benzoate) which costs money and sometimes causes allergy. Both estradiol valerate and estradiol enanthate are converted to the same estradiol in blood, spleen and lymph nodes (in leukocytes: by carboxylesterase 1 in monocytes and macrophages and carboxylesterase 2 in plasma cells). Estradiol enanthate is absorbed into blood slower, that gives more stable blood estradiol level and allows longer time between injections.

+

Most of substances used by Western pharmaceutical manufacturers comes from chemical factories in China. There are vendors in China selling the same substances to anybody (private persons too), no questions asked. Testosterone is a controlled substance, estradiol isn't. Such vendors are not manufacturers of estradiol powder, just resellers/traders/retail. You'll never know who was the manufacturer (perhaps 1 2 3 4 5).

+

If in USA then you can buy EEn powder here (shipping $15).

+

In other countries currently I advise cheaper (for EEn powder quantities 20 g or less) vendor DragonOrdnance shipping from China. EEn powder from him was tested, it's the real thing. Also, he has multiple testimonials for anabolics and testosterone on bodybuilder forums. Shipping $50. "Stealth shipping" means that there may be (or not) also something else in the parcel besides the hidden bag with EEn powder, don't throw out anything. Descriptions on the parcel and on the bag inside are lies to fool Customs. Order 5, 10 or 20 g, and also 100 ml (minimal order) of MCT oil and 100 ml of benzyl alcohol. How to distinguish: the alcohol has an odor. Try coupon code: TransDIY
If you haven't crypto then you can buy LTC (Litecoin) or BTC (Bitcoin) directly to the vendor's wallet address using for example Paybis (or if in USA then you can use CashApp, perhaps not Paypal). Or you can pay with a card or local bank transfer via TransferWise (more fees).

+

A similar vendor PurplePanda has higher prices for MCT oil and benzyl alcohol.

+

If you have mild needle phobia and more money then you can buy 10 or 20 g of longer-acting (3-4 weeks) estradiol undecylate CAS 3571-53-7 from PurplePanda or hbldbiotech or hhd-pharm. I bought 1 kg EV from Hbldbiotech and 1 kg EEn from Aoksbio, got the real thing. But few of those many who bought 10-20 g EEn from them are dissatisfied: lost parcels, refused by Customs, not EEn at all (dissolves in water or doesn't dissolve in MCT oil). If the website redirects to the vendor's home page then use a VPN or proxy, for example a free browser extension browsec, country in the free list for example Netherlands. There are other vendors there, but it's a gamble: some sellers send unrelated white powder (not a hormone at all). Don't use a dishonest vendor "Vanz" (their another company name is "Wuhan Yiruo") and spammers "Faithful", "Luoxing", "Jiangsu Aimi", "Jiangsu Kaihuida", "Hebei Mingyi", "Xian Shunyi", "Shanxi Lianxu", "Shandong Xishun", "Jinan Future Chemical", "Guangzhou LingYue", "Zhejiang Aiyi", "Jinlan pharm"/royalpharms. Elsewhere I saw negative reviews about: "Wison". Don't use sellers touting anabolics etc. for bodybuilders on their main page: you don't want to get testosterone instead of estradiol. "Gzbiocar" seems suspicious for me. Salespeople on made-in-china use nicknames or European-sounding aliases, same was on Alibaba. You'll see a real Chinese name only if you pay via Western Union. Vendors' pages are full of mistakes and lies, including photos of manufacturing plants (they manufacture few substances if any but sell hundreds), numbers, prices and minimal order (MOQ). Register (type zeros instead of phone number and "private person" instead of company name) and after that use the "Get Latest Price" link (if you want EEn), tell them your requirement "Estradiol Enanthate (Estradiol Heptanoate) CAS 4956-37-0, I prefer powder with large particle size (not micronized)" and ask for price for quantity 20 g with the cheapest shipping. If the vendor answers with "FOB" price then that means not including shipping, ask again for cheapest shipping fee. Don't ask for CoA (certificate of analysis), it'd be fake. Really you'll get slightly better than 98% purity according to USP and similar standards for pharmaceuticals for humans, there isn't estradiol powder with any worse purity (manufacturers of veterinarian pharmaceuticals get the same purity); better purity ("reference standard") is used only for calibration of measuring equipment and costs for example €353 for 100 mg. Cheapest shipping gives also least chances of problems with Customs. The (separate) "forwarding" company they use knows what to lie on the Customs declaration; you may find also papers about an unrelated benign substance like vitamin C - also to fool Customs. Ignore offers/requests to communicate via Whatsapp or other messengers (never give them your number/nickname), don't reply to emails, reply to the vendor only via https://membercenter.made-in-china.com/message/index.html . Vendors offer several payment options, some vendors take payment via Alibaba (allows to pay with card and takes 3% fee). "Aoksbio" accepts Western Union, Bitcoin and SWIFT (wire/bank transfer), same total price for 10 and 20 g, so order 20 g. If you pay with bank transfer then "Aoksbio" may ask for your ID with the same name as in your bank account (if other payment options then ID is not required). If Western Union (WU) then you tell "Aoksbio" the 10-digit number WU gives you and sender name you gave to WU. If the vendor ignores your requirement and sends you micronized powder then it's suitable but more difficult to work with because clings to everything.

+

Please join this [MTFHRT] group (you must both "confirm" your email address with the link you'll be emailed and email an intro about yourself to moderators) and post prices and your experiences in detail, ask questions.

+

Equipment

+

Necessary

+

The only necessary equipment is cheap ($7 - $15) pocket 0.001 g (1 mg) scales (or DIY balance scales you can make from a long narrow wooden plank, 2 small nails and 2 syringes, one of them with 0.5 ml water as a precise weight).

+

If you buy ready-to-use scales then they must look exactly like this:
https://www.ebay.com/itm/363747240371
https://www.aliexpress.com/item/4000586480263.html

+

Newer models are not suitable because they attempt to appear more precise and stable by ignoring small weight changes.

+

Search for other sellers:
https://www.ebay.com/sch/i.html?_nkw=scale+0.001&_sacat=0&_blrs=recall_filtering&LH_BIN=1&_sop=15&_ipg=120&_oac=1

+

https://www.ebay.com/sch/i.html?_nkw=scale+digital+diamond&_sacat=0&LH_BIN=1&_sop=15&_blrs=recall_filtering&_ipg=120&_oac=1

+

https://www.aliexpress.com/wholesale?SearchText=scale+0.001+diamond
(check all pages).

+

If the scales have slots for 4 batteries then insert only 2 at any one side.

+

If you want fast shipping of 0.001 g scales within USA, these model and seller ($50) are okay. Can be bought cheaper on Amazon, model name may be different, but must look exactly same (only color may differ). In UK here. In Mexico here.

+

If you already have 0.01 g (not 0.1 g) scales then you may use them: precision 2% is enough as you make injectable for yourself only. In USA these model and seller ($7) are okay, fast shipping. In UK these or similar. In EU these.

+

Optional

+

The vials are designed to be sealed with rubber stoppers and aluminium caps using a tool (crimper, $36). But you can crimp a cap without a crimper: by hand using a piece of metal like a spoon handle.

+

You can buy a 129°C autoclave for $170 (1 2 3), but it's not really necessary as you make vials for yourself only. 121°C was necessary for obsolete reusable syringes with fresh blood of another patient because hepatitis B virus can survive 100°C for short time if in blood. You are not dealing with fresh blood, so 100°C (water boiling in a pot) is enough. I use an autoclave just for customers' peace of mind. At first I sold kits with EV powder, solvent, preservative and instructions how to mix and sterilize in a pot, multiple people including myself sterilized at 100°C, never a problem. If you live at significant altitude (like in Denver "mile high city") then likely you already have a pressure cooker. I advise against dry heat sterilizers and ovens because of too uneven temperature: too much can burst a vial, more than 135°C damages estradiol. Bead sterilizers not suitable. In USA you can buy a 15 PSI pressure cooker for $76, in UK £40, in EU €50, in other countries a pressure cooker with pressure 15 PSI = 100 kPa is more difficult to find: most sellers don't advertise pressure because it's less, so temperature is less than 121°C.

+

Years ago American "homebrewing" bodybuilders extracted trenbolone (an anabolic) from subcutaneous pellets for cattle. Trenbolone changes color and perhaps partially decomposes if heated. So, for sterilization they used filtering instead of heat. When Chinese companies began to sell anabolics and testosterone powders to anybody, bodybuilders continued to use only filtering for sterilization though testosterone (as well as estradiol) endures heating up to 275°F=135°C (but not more) without "deactivation" bodybuilders still fear. Terminal heat sterilization (of already mixed solution in sealed vials) became taboo for them though filtering is not a reliable sterilization: small bacteria, fungal spores, viruses can penetrate 0.2 μm filters. Thankfully, solutions of steroid esters in oils with BA, BB are not nutritious for bacteria: no water; three chemical elements C, H, O are not enough for bacterial growth. I can understand filtering for intravenous infusions liters per day (in ICU), but for our subcutaneous injections 1 ml/month filtering doesn't make sense, terminal heat sterilization is more reliable and easier than aseptic procedures. There were multiple complaints that some EV ampules made by pharmaceutical factories in India are fake. I think not deliberately fake but just incompetent technologists and managers: they mixed in a tank in an air-conditioned cold (to limit bacteria) room without solvent for not enough time, then undissolved powder got stuck in a filter. If you are paranoid and insist on following the filtering fad then wait several days until every last clump of powder finishes dissolving in a vial, then use a PTFE or PVDF 0.22 μm syringe filter (not hydrophilic, better 25 or 33 mm), a 10 ml Luer Lock syringe and optionally a homemade filtering rig, I made mine (for paranoid customers, I don't filter what I inject into myself) from 4 stacks of books, a piece of plywood/MDF with a hole for the syringe, a wide wooden plank/board, a 6 L (1.5 gallon) plastic bottle with water as a weight, the plank slightly tilted and leaning on a wall for stability. And anyway sterilize the sealed vial you filtered into at 100-130°C after filtering!

+

Unnecessary

+

Unnecessary: beaker, mixer/stirrer, room with controlled airflow, depyrogenation. My technology: terminal heat sterilization (after the vials are sealed); measure and mix in each vial separately, so no glassware to wash with water  or collecting dust (skin flakes and mites) if never washed. Water - bacteria - pyrogens. Hormone powders are sold not sterile, so any cleaning / sterilization efforts before terminal heat sterilization are futile. Don't try to improve this technology: it protects you from mistakes and unexpected problems.

+

Other raw materials and expendables

+

Vials, stoppers, caps

+

Buy 10 clear glass vials 10 ml each with 20 mm grey (butyl rubber) stoppers and aluminium caps. Caps may be bare aluminium or painted, with plastic tops or all-metal. Screw-on and all-plastic caps are not suitable. Stoppers must have this shape:
https://www.ebay.com/itm/185908326110
https://www.aliexpress.us/item/2251832717628622.html
Flat septa are not suitable instead of stoppers. Search:
https://www.ebay.com/sch/i.html?_nkw=vial+10ml+stopper+cap&_sacat=0&LH_TitleDesc=0&LH_BIN=1&_sop=15&_oac=1

+

https://www.aliexpress.com/wholesale?SearchText=vial+10ml+stopper+cap

+

After you remove central part of the cap, most of the cap must remain and hold the rubber stopper at place. Caps must not have tear-off weak place on one side like this:

+

+

In EU you can buy vials, stoppers 1 or 2, caps, benzyl alcohol and MCT oil in one shop, or (cheaper) vials+stoppers+caps, or here, or here, or here. In UK here or here. In USA vials+stoppers+caps (oil, BA, syringes) or vials+stoppers+caps or vials+stoppers+caps or vials+stoppers+caps (syringes) or here or sealed vials(1 2 3 4 5 6)+new caps. In Canada vials+stoppers+caps (BA). In Mexico here.

+

If you are paranoid and believe incompetent or deceitful slander about this guide then you can buy washed sealed sterile empty vials from USA or UK and buy new caps or carefully unbend crimped caps with a small flat screwdriver. Really it'd not improve "safety". But in USA and UK these vials are cheaper if you want fast shipping.

+

Oil

+

MCT oil (liquid, not powder, not in capsules, without flavor added) made from a mix of C8 (caprylic) and C10 (capric) fatty acids (not C8 only) - cheapest bottle you can find, in a local sports nutrition store or mail-order, but not the "Dr.Adorable" brand and must not contain the word "fractionated" in description. MCT oil made from coconut oil unlikely to cause allergy, but made from palm kernel oil or "palm derived" even less likely. It's the only ingredient with somewhat limited shelf life: roughly 5 years as rumored though bottles are usually marked with arbitrary shelf life 2 years. You'll use up 10 ml per year. In USA you can mail-order a 2 oz (60 ml) sample bottle on eBay for $6 including shipping. Check prices also on Amazon. In EU here. In local stores smallest bottle can be 400 ml, roughly $13. MCT oil is marketed as a food supplement to be taken 15 ml/day, taken orally is rapidly absorbed. You'll inject 500 times less, so any purity is okay (it's really all the same purity despite some dishonest sellers' claims).

+

Preservative

+

If you can, add a preservative (antibacterial): benzyl alcohol. You'll use up 8 ml for 30 years. If you buy EEn powder from DragonOrdnance then buy also benzyl alcohol and MCT oil there in the same order, likely that'd be cheaper. Else usually cheaper on eBay. Look also for companies selling ingredients for perfumes, cosmetics, soap crafting, for example in Europe here (they also sell MCT oil under another name), or here (and oil), or here, or here, or here. In Australia here. In Canada here. In USA here. If you don't add the preservative then make sure that each time you draw from a sterilized vial, you take a new syringe. I inject myself with estradiol enanthate in MCT oil without preservative because of my allergy.

+

Syringes for mixing

+

Measure MCT oil with a 10 ml (or 5 ml) syringe. If you can find an all-plastic syringe without (usually black) rubber at the inner end of the plunger then one syringe will last you forever. Else likely you'll have to take a new disposable syringe every time you cook a few vials (up to 5 years apart) because the oil very slowly spoils that rubber. Vial stoppers are made from resistant rubber.

+

If you add a preservative then use one of syringes you bought for injections (see below) to measure 0.2 ml.

+

Mix

+

(See below for an alternate way without a funnel).

+

Make a small funnel from a piece of foil (the thicker foil the better; shinier side inside), hold it folded with a small piece of sticky tape. If you have only thin foil then perhaps strengthen it by wide sticky tape on another side (or try to strip the outer paint from a few different beer or soft drink aluminium cans with nail polish remover, then cut a clean can with scissors). May be use something conical to wrap the foil around before cutting off unneeded parts. The hole at the pointy end of the funnel must be slightly (not much) smaller than the opening in the vial. Use this funnel to weigh up estradiol enanthate powder and to pour the powder into a vial. The funnel I'm using at the center, unfolded piece of foil from my previous funnel at the left, a funnel in a vial at the right:

+

+

Two recipes I can recommend:

+

1) 500 mg = 0.5 g of estradiol enanthate (density 1.1 g/cm3),
benzyl alcohol (preservative - antibacterial) 0.2 ml,
MCT oil 10-0.2-0.5/1.1= 9.35 ml.

+

2) 0.5 g of estradiol enanthate,
MCT oil 10-0.5/1.1= 9.55 ml.

+

If you see that this amount of the mix doesn't fit entirely in the wide part of the vial and goes into narrower vial neck then these Chinese vials are too small, then after complete dissolution use an insulin syringe to throw out 1 ml of the solution, and make next vials with 8 ml, recipes:
1) 0.4 g of estradiol enanthate,
benzyl alcohol 0.16 ml,
MCT oil 8-0.16-0.4/1.1= 7.5 ml;
2) 0.4 g of estradiol enanthate,
MCT oil 8-0.4/1.1= 7.65 ml.

+

Sit comfortably at a table, put the scales onto the center of a sheet of blank paper ("landscape" orientation: width more than height). Put the funnel onto the circle on the scales, pointy side to the left (as at the center of the photo above). Turn the scales on, wait for 0.000
Take estradiol enanthate powder from the bag on the tip of a small knife, pour onto the funnel over the center of the circle on the scales until the scales show any number between 0.501 and 0.503
If you poured too much, take excess powder off with the knife tip. Don't fuss over part of powder which may fall off through the pointy end of the funnel or elsewhere, it's what the paper sheet is for.

+

Take an empty vial with fingers of left hand, put the vial hole to the pointy end of the funnel. Lightly press the funnel into the vial with left index finger (it's the most tricky part: you must prevent the funnel from falling off the vial and spilling the powder, but you must press lightly to not crumple the foil). Carefully rotate the vial upright together with the funnel over the paper sheet while continuing holding the funnel in the vial with the left index finger. Take a plastic pen or wooden pencil with right hand, tap lightly multiple times on the glass vial you hold in left hand fingers to shake the funnel until all the powder pours from the funnel into the vial.

+

If some powder fell off, use knife tip to put most of it back into the bag.

+

An alternate way without a funnel: take a roll of usual kitchen foil (any thickness), with scissors cut a square about 5 cm (2") on a side. Touch only corners of the square (because powder can stick to fingerprints). The square should be pristine, without creases. Put the square on the scales, turn the scales on. Take some estradiol enanthate powder from the bag with knife tip, pour onto the square. Then more, until the scales show any number between 0.501 and 0.503 . If you poured too much, take the excess back with knife tip. Put an empty vial onto the paper sheet near the scales. Put two fingers under centers of two opposite sides of the square, bend the square until those two sides come together. Then clench these two sides together with fingers of another hand, take the square with powder off the scales. Pour the powder from the square into a vial. When you mix next vial, perhaps cut a new pristine square.

+

Now you may optionally draw 0.2 ml of benzyl alcohol into a syringe, pour it into the vial over the powder and watch as the powder sags a little and partially dissolves.

+

Measure the MCT oil with a syringe and pour into the vial.

+

Close the vial with the rubber stopper, put the cap onto the stopper. While pressing the cap onto the vial, put the vial upside down (cap down) onto a book. While pressing the vial down, bend the rim of the cap in several (8-10) places with a spoon handle so that the cap holds the stopper at place. Don't press too strongly to not shatter the glass.

+

While clenching the vial with two fingers at bottom and cap, shake up the vial thoroughly during a full minute (it's a long time).

+

Wait several days, shake up the first vial few times each day. The warmer in the room, the faster dissolving. If the powder dissolved completely to clear solution then you were sold the real thing and enough pure. For next vials don't wait.

+

Another way to make sure that you got really estradiol enanthate is checking melting point of the powder: it may be 94-114°C. A simpler way to check melting point: measure/pour 500 mg more powder into another vial, don't pour liquids yet, close the vial, but bend the cap rim in only 3 places. Put the vial into a pot with tap water, boil the water (while watching the powder in it), turn the heat off, wait for the water to cool off, take the vial out of the water. If the powder partly solidified and doesn't all move completely freely in the vial then it's the real thing. Few oil-soluble substances have such relatively low melting point. But if melting point of the powder you got happens to be slightly more than 100°C then this test is inconclusive: you'd need a pressure cooker or an autoclave to heat the vial to slightly more than 100°C, or this way. After the test unbend the cap, open the vial, pour liquid[s], seal, and now you'll have to wait for much longer time (up to a month) until the solidified part of the powder dissolves.

+

For estradiol undecylate (EU, melting point 105-110°C): recipes (60 mg/ml):
1. EU 0.6 g, benzyl alcohol 0.2 ml, MCT oil 10-0.2-0.6/1.07= 9.25 ml or
2. (for allergics) EU 0.6 g, MCT oil 10-0.6/1.07= 9.45 ml.
Inject 0.83 ml monthly or 0.62 ml every 3 weeks.

+

Sterilize

+

For sterilization put the sealed vial into a pot with tap water, after that boil the water, keep the water boiling for 30 min, turn off the heat, wait until the water cools off. The cap darkens - that doesn't matter. If you already have any pressure cooker (or a multi-cooker with pressure cooker function) then use it instead of a pot (vial submerged in water), else a pot is enough!

+

If you sterilize more than one vial at a time then tie them together with cotton thread, put them into the pot upright and pour tap water up to about 1/3 of vial height. If you sterilize one vial then bubbling boiling water shakes the vial, it makes unusual clattering sound.

+

Instead of water you can use any oil in a small pot (also vials upright, the oil up to 1/3 of vial height), but then you need a thermometer: manually continuously adjust heat from the stove to maintain 130°C (266°F) for 30 min. Or you can use oil in a multi-cooker if it hasn't pressure cooker function but can maintain 130°C. Before sterilization in such oil bath, wait for complete dissolution of the powder.

+

During sterilization the powder finishes dissolving. Shake up the vial (ignore tiny bubbles).

+

Wash off limescale (calcium carbonate from heated tap water) from the vial with cloth wet with vinegar.

+

Let the vial to dry, handwrite "estradiol enanthate 50 mg/ml" in small letters on paper in 3 lines, cut that out (the smaller label the better) and glue it onto the vial with a piece of transparent sticky tape just slightly larger than the label.

+

Possibly you heard advices to use a flow hood, gloves, mask, to disinfect or sterilize empty vials, stoppers, hands, the table or whole room and so on. All these efforts are completely futile if you use the most reliable method of sterilization I advise (called "terminal heat sterilization"): heating already mixed and sealed vials by submersion in boiling water, or oil heated to 130°C.

+

Begin a new vial

+

If the aluminium cap is all-metal without plastic top then the cap has 2 or 3 incisions in a circle at the center of the top of the cap. Either tear off the center of a cap (hold to not pull entire cap off) or cut it out using small scissors with sharp tips to expose central part of the rubber stopper underneath. Don't pierce the rubber stopper.

+

If your caps are with plastic tops then stick a flat screwdriver or a knife under the top, the top should detach with the central part of the cap. If you accidentally pulled entire cap off and the rubber stopper came out of the vial then fix the cap back and repeat sterilization.

+

The very center of the rubber stopper is marked with smaller circle - it's where needles should be inserted.

+

Keep

+

Keep the powder sealed airtight in a vial or in bags with as little air as possible. Keep the powder, mixed but yet unused vials, benzyl alcohol and oil wrapped in foil to protect from light. Keep the vial you are using in a box, drawer or cupboard. Not in a fridge. Keep at room temperature (whatever it is), upright. Before use, look at the bottom of a vial: if it became white instead of transparent then put the vial at a warm place, and EEn will dissolve back, the warmer the faster. Then shake up the vial (ignore tiny bubbles).

+

Total price

+

Here I use prices (including shipping) I saw at the time of this writing for people living in USA:

+

quantity 1 (10 g) of estradiol enanthate powder + $15 shipping = $65
benzyl alcohol $7.99
250 ml MCT oil 1 or 2 $9.99
Scales $7.06
syringes 5-10 ml (for measuring MCT oil) $4.23
10 vials with stoppers and caps $12.99
100 syringes for injections $15.39

+

10 g of estradiol enanthate powder will be enough to cook 20 vials which will last you 20*10/0.223*7/365= 17 years.

+

Initial expenses 65+7.99+9.99+7.06+4.23+12.99+15.39 = $123

+

Total expenses during 17 years (123+2*9.99+12.99+8*15.39)/(17.2*12)= $1.37 per month. A hundred times cheaper for safer and much more effective HRT than doctor-prescribed. And you don't depend on doctors' whims and meds shortages.

+

Another example for UK:
5 g EEn powder + 100 ml benzyl alcohol + 100 ml MCT oil + payment fee = £83.43
scales £4.99
vials+stoppers+caps £14.99
syringe 5ml £1.63
100 syringes 1ml £19.13
Total £124 for 9 vials - for 7.7 years, £2 per month (including 4 packs of syringes 1ml).

+

Legal

+

If you make injectable estradiol for yourself only, no problem. But if you sell or gift it to anybody else, you are in legal trouble. Somebody is going to snitch, guaranteed.

+

Inject yourself

+

Syringes for injections

+

Syringes for injections - insulin syringes with permanently attached (fixed, integrated, non-detachable) needles 1/2" (12-13 mm) long, a new syringe every week or 10 days.
"Tuberculin" syringes with fixed needles 5/8" (16 mm) are available only in few mail-order stores in USA.

+

Needle gauge/diameter doesn't matter, drawing MCT oil through 30G takes one minute. Both U-100 and U-40 insulin syringes are suitable. Insulin syringes marketed for animals (veterinarian) are perfectly okay too.

+

If you discard an usual syringe with detachable needle after each injection then you lose 0.092 ml of the solution in the "dead space" in the socket between syringe and needle: http://lena.kiev.ua/deadspace.png , so a vial will last you 7 months instead of 10. Also, the socket can leak air which makes drawing seem impossible (tighten the socket with force and twist).

+

In most countries insulin syringes are available in most local pharmacies without prescription. Some pharmacists or pharmacy chains are holier than Pope, don't believe if few pharmacists claim prescription-only, just go to another pharmacy.

+

Or you can mail-order. Depending on country: USA: 1 2 3 4 5 (or search), Canada: 1 2 3 4 5 6 7 8 9, UK: 1 2 3 4, EU, France: 1 2 3 4, Netherlands: 1 2 3 4 5, Germany: 1 2 3, Switzerland, Italy: 1 2, Spain: 1 2, Denmark, Finland, Sweden, Mexico, Australia: 1 2, NZ: 1 2, Ukraine: 1 2 3 4 5, Russia: 1 2. Worldwide: 1 2 3 and on Amazon.

+

May be you heard the advice to use separate needles for drawing and injection because piercing the rubber stopper blunts the needle. Such advisers mistakenly exaggerate the blunting because it's easy to bend needle tip on hard glass ampule bottom while drawing from an all-glass single-dose ampule. Insulin syringes with non-detachable needles are designed for insulin vials also with rubber stoppers. However, if you are unusually sensitive to pain and willing to spend more money for small difference then you may follow this advice: buy 1 ml Luer Lock syringes, short needles 27G - 25G for drawing (thicker can damage the rubber stopper) and needles 1/2" - 5/8" (12-16 mm) 31G - 29G for injection. You'd lose 0.2 - 0.3 ml of the solution in all the dead spaces, but the solution you make yourself is cheap. Draw 0.05 - 0.1 ml more than you intend to inject because that much would be needed to fill the dead space in the hub of the injection needle. Attempts to expel the solution from the dead space by deliberately drawing a little air are mostly futile because capillary forces keep dead spaces filled.

+

Needle fright

+

If you are deadly afraid of needles (hey, I have instinctive fear of heights, so I understand) then buy an insulin syringe, lie down on your bed on your side (if you faint, no problem) and stick yourself with the empty syringe into the butt. If you manage that (possibly after several attempts), next times will be much easier.

+

As last resort, instead of estradiol enanthate you can buy micronized estradiol powder and take it orally 10 mg twice a day using 0.001 g scale. 40 g will last you 5 years, $2.5/month. How to take: find a small disposable plastic spoon, cut off the handle leaving a stub 2 cm long. Turn the scale on, wait for 0.000 , after that put the spoon at the center of the circle on the scale. Remember last two digits. Using the tweezers coming with the scale, put the powder into the spoon until weight increases for 0.009 - 0.011 g. Lick the powder off the spoon and swallow. Twice a day. Keep the powder in an emptied airtight jar from a cosmetic cream, covered from light with empty small tin can upside-down.

+

Or if you want slower changes.

+

Dosage

+

I recommend to inject 0.22 ml (22 units on U-100 insulin syringe scale or 8 units if U-40) weekly (on the same day of every week) or 0.31 ml every 10 days (on 1, 11, 21 of every month). The same dosage from the very beginning of MtF HRT and all the time later, post-op too, never stop. I chose this dosage to advise so that it's enough for complete suppression of testosterone production by testicles in any MtF. On the same dosage of the same hormone different people get trough blood estradiol level (just before next injection) differing in up to 10 times. Also, sensitivity of different people to the same level of the same hormone differs in times. Sensitivity is as important as levels. There isn't a test for sensitivity. So, why do doctors prescribe blood tests to MtF? Just to impress naive patients and to keep themselves busy and paid. For most MtF the dosage I advise is more than enough, but so what? It's laughably cheap. For a few this dosage is barely enough, so don't gamble and don't waste time. A few blood tests would be more expensive than all the hormone you'll ever take, so why bother?  Doctors love to tell bogeyman stories about side effects - just to scare you into blood tests and - paying them for more doctor visits.

+

If a doctor sees results of your blood tests, likely he'll claim "too much estradiol, dangerous". Then give him the link to a scientific article describing how doctors injected women with 4 times higher estradiol dosage than I advise, those women got blood estradiol level roughly 3000 pg/ml = 11000 pmol/l in average. Full text of that article can be accessed via Sci-Hub, or members of this [MTFHRT] group can read it here. I quote that article:

+
+

The treatment was well tolerated. No adverse effects were seen, the patients expressed a feeling of particular well being, 23% of them wanted to have the injections repeated and none of them wanted to stop treatment because of troubles or side effects.

+
+

That's on 4 times higher estradiol dosage than I advise.

+

How to inject

+

I recommend to inject into the upper outer quarter of a buttock into fat (subcutaneous) while lying on a bed on your side. It's the safest and least painful place. I advise against injecting into thigh because that can cause too fast absorption and faster blood estradiol level drop.

+

Take care to touch the needle to nothing except inner surface of needle cap, the skin at the place of injection and the rubber stopper of the vial.

+

There is an old tradition to disinfect skin (and the rubber stopper of the vial) with alcohol before an injection. Pharmacies sell alcohol-soaked swabs/wipes for that. However, this ritual is optional. World Health Organization says:

+
+

Wash skin that is visibly soiled or dirty. Swabbing of the clean skin before giving an injection is unnecessary. Swabbing of clean vial tops or ampoules with an antiseptic or disinfectant is unnecessary.

+
+

Also, you can read Introduction in a scientific article.

+

Anyway, even if you follow this ritual, don't wipe the needle because that would make it more dirty.

+

How to inject:
Lie down on a bed on your side. Injection will be into fat in the upper outer quarter of a buttock (exact place doesn't matter, fat layer in buttocks is thicker than needle length even in skinny people). Pull off the cap from the needle. Pull as much air into the syringe as you intend to inject. Pierce the center of the rubber stopper with the needle, inject the air into the vial. Turn so that the vial is at the top, syringe at the bottom. Pull the plunger to 0.1 ml more than you intend to inject (create vacuum in the syringe), hold and wait several minutes until the liquid very slowly seeps down and top surface of the liquid rises up to 0.08 ml mark on the scale. Push most of air bubbles and excess liquid back into the vial. Small air bubbles may remain, don't worry, injecting air bubbles is completely harmless. Pull the needle out, stick it into your butt (at about 90° angle) all the way in, inject (can take some time - speed doesn't matter). Pull out the needle, immediately press at the place of injection with a finger or a cotton wool pad/disc. While continuing to press, make a few circular motions (shift the skin, don't drag the finger across skin). Continue to press for 1 min. Cap the needle.

+

"Monitoring" unnecessary

+

If you begin your HRT from injectable estradiol as I describe here then likely in a few weeks you'll experience pain in breast buds (in many cases only at one side at first) like many cis-girls experience at puberty. The pain is not a sign of a problem and will last not forever.

+

Dosage I advise stops testosterone production by testicles as completely as surgical removal of testicles, but that will not rid you of the grey shade from shaven mustache and beard - a dead giveaway: you'll not pass until you complete needle electrolysis. Despite false advertising, laser and other hair removal methods using intense light in most cases remove facial hair temporarily, no matter how many sessions. Ignore this wisdom at your peril.

+

Any estradiol (E2) level between 300 and 5000 pg/ml (1100 - 18000 pmol/l) is okay for both pre-ops and post-ops. Estrone (E1) level doesn't matter. All doctors' assertions "too much" are bullshit meant to control us and extort money under guise of "care". The only reasonable cause to do a blood test for estradiol (once, at least a month after first injection, only on a day of next injection before it) is your peace of mind that you got indeed estradiol enanthate. But above I described two other ways to check that, and likely you'll experience pain in breast buds. I tested a new batch of estradiol enanthate powder on myself, my blood estradiol level was 1272 pg/ml = 4670 pmol/l 5 days after an injection. I had SRS in 1999, I needn't to suppress testosterone. Nevertheless, I don't intend to decrease my dosage. It slows down aging, on it I look and feel better.

+

Myths and what not to do

+

Above I explained about some myths and fallacies. Some more:

+

Myth: discard a vial 28 days after you began it. Bureaucrats get their salaries for inventing new rules, no matter how unreasonable. This rule was invented for hospitals with multiple patients (some with infectious diseases), not for your home.

+

If an average doctor prescribes injectable estradiol, he says nothing about needles, he says "inject into muscle" because the gospel (instructions sold with injectable estradiol) says so (without explanation why - really it's because the solvent used with EV sometimes causes allergy, then IM helps). You go to a pharmacy and ask for intramuscular injections. An average pharmacist asks you for injection volume (less than 1 ml) and sells you 2 ml syringes, each syringe comes with a needle in the same pack. Manufacturers put long needles with 10 ml syringes and shorter needles with 2 ml syringes. Why? Aesthetics. :-/ You get syringes with dead space and needles 25 mm long, you inject into buttock. You, pharmacist, nurse and doctor think that you inject into muscle. Really fat layer in buttocks is thicker even in very skinny people. You in fact inject into fat. And... it works. Gospels are full of fallacies.

+

Fallacy: after sticking the needle in your skin, you must aspirate to check whether you hit a blood vessel. There aren't significant blood vessels in buttocks at 13 mm (1/2") depth. If you aspirate, you wound yourself because of inevitable needle movements sideways.

+

Don't give a vial into the hands of a doctor, he'd destroy it. Doctors are jealous.

+

Don't use an emulator (calculator of blood levels). It uses average statistical data, but you are not a statistically average person.

+

Myth: begin from pills (low dosage), then after some time switch to injections. Doctors love to begin from low dosage because that keeps them busy and paid. So they invent explanations why it's allegedly better. People repeat doctor claims.

+

Myth: decrease estrogen dosage post-op. Estrogen dosages described in pharmaceutical reference books (collections of package inserts) for men with prostatic cancer are higher (designed to suppress testosterone production by testicles) than for women (after menopause) - limited in the fear of uterine cancer. Only after SRS we magically become women in doctors' eyes.

+

Myth: "estrogens" increase risk of blood clots, take Aspirin to counteract that. Ethinylestradiol increases risk of venous thrombosis, Aspirin decreases risk of arterial thrombosis in coronal arteries in the heart. Combination of ethinylestradiol with Aspirin is like wearing a flak jacket while going against a gas attack. Don't confuse ethinylestradiol (EE) with estradiol enanthate (EEn). Unlike ethinylestradiol, injectable estradiol practically doesn't affect risk of thrombosis. Did you know that thrombosis risk depends (among other things) on whether your blood is type 0(1) or any other type ("non-zero")? Estradiol enanthate dosage I advise affects blood clotting less.

+

Fallacy: stop "hormones" some time before SRS or another surgery, resume only some time later. Surgeons don't know and don't want to know differences between various estrogens and routes of their delivery. Ethinylestradiol in combination with bloodflow in immobile legs stopped by stirrups (to move legs out of surgeon's way during SRS) can cause deep vein thrombosis and deadly pulmonary embolism as a consequence. Don't try to explain to the surgeon that injectable estradiol doesn't do that, tell that you comply but silently continue injections for your passability and mood not to worsen. Blood tests surgeons require check some blood clotting parameters, not estradiol.

+

Schizophrenic delusion: Chinese companies have been known to mix Ethinyl Estradiol into their hormone powders as a cheap way to boost efficacy. The only way for end-users to check efficacy is an usual blood test for estradiol level which ignores ethinylestradiol completely. Therefore, only a schizophrenic (literally) could produce this raving.

+

Myth: libido and erections are signs of testosterone. In many MtF estradiol dosage I advise stimulates libido and erections though suppresses testosterone production by testicles completely. If still in doubt, do a blood test for testosterone on a day of next injection before it. Cis-women (and post-SRS MtF) get erections of clitoris - exactly same mechanism as erections of penis.

+

Myth: excess estrogen is converted to testosterone. The conversion estrone<->estradiol is bidirectional, but the conversion testosterone->estradiol is strictly unidirectional.

+

Myth: if you take too much estradiol then SHBG will bind it and make it unusable. If estradiol level increases, liver produces more SHBG. Nevertheless, free estradiol level increases too.

+

I explained a misunderstanding about steam sterilization separately because the explanation is lengthy and requires some physics knowledge.

+

Words "estrogen dominance" were invented by marketers of progesterone and quackeries they call progesterone bla-bla-something like "Wild Yam". Long ago progesterone was produced chemically from wild yam, but human body cannot perform that chemical conversion.

+

If you are wondering about real progesterone:

+

1) Injectable progesterone is very short-living, must be injected daily. Oral progesterone is ineffective because most of it is converted to allopregnanolone which common blood tests confuse with progesterone. Hydroxyprogesterone caproate is not bioidentical, it's not converted in the body to progesterone (unlike estradiol valerate and estradiol enanthate).

+

2) Progesterone decreases rate of synthesis of estrogen receptors. Cis-women are supposed to benefit from that, but goals of MtF are opposite.

+

3) Estradiol develops ducts in milk glands, progesterone develops alveoles. Most of breast volume is ducts and connective tissue between them. If an alveole formed (at the end of a duct), that duct will not grow in length anymore. So, progesterone can stunt breast growth. Cyproterone acetate too, it's a strong progestogen.

+

I advise not to add progesterone for at least 3 years since starting estradiol injections at least 40 mg/month (not since the very beginning of HRT). Or never add progesterone. Though progesterone is a female hormone, that doesn't mean that it's beneficial for MtF (no uterus).

+

Myth: an article linked from Wikipedia claimed a case of prolactinoma as a side effect of estradiol enanthate. Actually factory-made injections with estradiol enanthate always contain also high dosage of a progestin. Cyproterone acetate is a strong progestin and is known to cause prolactinoma. One more reason to never add progesterone if you haven't an uterus.

+

Myth: compounding pharmacies make superior products. If you get exceptionally lucky and find a doctor willing to prescribe as high injectable estradiol dosage as I advise who doesn't freak out at blood test results (you'd have to pay to gatekeeprs, doctor, pharmacy and labs), compounding pharmacies in few countries can cook injectable estradiol with prescription. No compounding pharmacy would have estradiol enanthate powder, and I doubt that they can make estradiol cypionate (EC) 50 mg/ml because factory-made EC is 5 mg/ml max. They cannot make more than 10 mg/ml without solvent (benzyl benzoate) which can cause allergy. They use other oils which also cause allergy more often than MCT oil. But the main their problem is that they never mix in each vial separately and often repeat Indian factories' mistake I described above: undissolved powder gets stuck in a filter, so you get much less estradiol than prescribed (often happens in Canada). Another example of their stupidity: a compounding ("Galenic") pharmacy in Italy used ethoxylated Castor oil (essentially a soap) instead of plain Castor oil, so of course injections hurt immensely and were ineffective. If you want it done right, Do It Yourself.

+
+

Another my how-to: voice.

+

Lena

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/29602/history.html b/groups.io/g/MTFHRT/wiki/29602/history.html index 3b53ab89..5d1df61a 100644 --- a/groups.io/g/MTFHRT/wiki/29602/history.html +++ b/groups.io/g/MTFHRT/wiki/29602/history.html @@ -6,7 +6,7 @@ - + @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774617.1713918440372075712"); + console.log("client_id:", "web.web09.236708.1714523380298758175"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774617.1713918440372075712" + client_id: "web.web09.236708.1714523380298758175" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { - + - - + + @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -576,13 +901,47 @@ function createAlert(msg, isError, autoClose, noClose) { <tr> <td> - <input type=checkbox name="dataid" id="203230" value="203230" onclick="countChecked('203230')" + <input type=checkbox name="dataid" id="204015" value="204015" onclick="countChecked('204015')" checked> + <a href="https://groups.io/g/MTFHRT/profile/@Lena">Lena</a> + + + + </td> + <td> + <a href="204015.html"> + + + + Updated Ultimate DIY page + + + </a> + </td> + <td> + +<script id="timedispwdataupdated204015"> + $('#timedispwdataupdated204015').replaceWith(DisplayShortTime(1714463966218418632, false + )); +</script> + + </td> + </tr> + + <tr> + <td> + <input type=checkbox name="dataid" id="203230" value="203230" onclick="countChecked('203230')" + > + + + + + <a href="https://groups.io/g/MTFHRT/profile/@Lena">Lena</a> @@ -7797,7 +8156,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165842.html"> + <a href="165842"> @@ -7831,7 +8190,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165840.html"> + <a href="165840"> @@ -7865,7 +8224,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165830.html"> + <a href="165830"> @@ -7899,7 +8258,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165664.html"> + <a href="165664"> @@ -7933,7 +8292,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165530.html"> + <a href="165530"> @@ -7967,7 +8326,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165470.html"> + <a href="165470"> @@ -8001,7 +8360,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165469.html"> + <a href="165469"> @@ -8035,7 +8394,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165467.html"> + <a href="165467"> @@ -8069,7 +8428,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165437.html"> + <a href="165437"> @@ -8103,7 +8462,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165250.html"> + <a href="165250"> @@ -8137,7 +8496,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165219.html"> + <a href="165219"> @@ -8171,7 +8530,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="165198.html"> + <a href="165198"> @@ -9591,6 +9950,10 @@ function createAlert(msg, isError, autoClose, noClose) { </form> <script type="text/javascript"> +contentLoaded(false, function() { + + UpdateSidebar("wiki"); +}); function countChecked(id) { var checkedVal = 0; @@ -9617,20 +9980,20 @@ function countChecked(id) { } </script> + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -9640,9 +10003,7 @@ function countChecked(id) { </div> </div> - - @@ -9671,48 +10032,43 @@ function countChecked(id) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -9727,13 +10083,17 @@ function countChecked(id) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -9755,7 +10115,7 @@ function countChecked(id) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -9776,138 +10136,144 @@ function countChecked(id) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -9929,6 +10295,21 @@ function countChecked(id) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30843.html b/groups.io/g/MTFHRT/wiki/30843.html index 1820895d..6e51d1e5 100644 --- a/groups.io/g/MTFHRT/wiki/30843.html +++ b/groups.io/g/MTFHRT/wiki/30843.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774508.1713918438333288990"); + console.log("client_id:", "web.web09.236574.1714523377527203207"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774508.1713918438333288990" + client_id: "web.web09.236574.1714523377527203207" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Basic Estrogel Guide</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Basic Estrogel Guide</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,6 +927,50 @@ function createAlert(msg, isError, autoClose, noClose) { + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> + <div class="btn-group"> + <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> + Pages + <span class="caret"></span> + </button> + <ul class="dropdown-menu" role="menu"> + + <li> + <a href="30843.html"> + Basic Estrogel Guide + </a> + </li> + + <li> + <a href="30846.html"> + Home + </a> + </li> + + <li> + <a href="32288.html"> + How to measure melting point of most organic powders using typical household items. + </a> + </li> + + <li> + <a href="34293.html"> + steam sterilization + </a> + </li> + + <li> + <a href="29602.html"> + Ultimate DIY + </a> + </li> + + </ul> + </div> + + </span> <div class="pull-right"> @@ -616,15 +988,14 @@ function createAlert(msg, isError, autoClose, noClose) { <i class="fa fa-link fa-lg"></i> </a> </div> - <p> -   - </p> - <br> + </div> + </div> + <div class="row"> <div class="col-sm-12"> - <span class="visitedlinks"> + <span class="wikidisplay user-content"> <h1>DIY Estrogel Guide</h1> <p>This guide will instruct you on the materials and tools needed for home DIY basic estrogel compounding. There are easier methods out there, such as mixing estradiol into pre-made hand sanitizers, but this is for those who would prefer to compound their own gels, or manufacture at a scale where buying hand sanitizer is cost prohibitive. There are also some concerns about hand sanitizer formulations containing denaturing agents or other additives that might be bad for transdermal drug delivery. If you are interested in more experimental gel formulations or ones based on hand sanitizer, you can check out reddit.com/r/estrogel/wiki, which is where I got most of this information. <br/><br/>With this guide, you can produce supersaturated estrogels that are suitable for high-dose estradiol monotherapy. This is a great alternative to injections for the needle-shy or paranoid. <br/><br/>This recipe is based off of a patent that includes a generic estrogel recipe, available here: <a href="https://patents.google.com/patent/US20070154533A1/en" target="_blank" rel="nofollow noopener">https://patents.google.com/patent/US20070154533A1/en</a> - page 39 of the PDF has the recipe. This recipe has been adjusted for higher concentrations and higher absorption, using 60% ethanol, which is known to have the best absorption for estradiol. (<a href="https://sci-hub.se/https://doi.org/10.1016/j.addr.2012.09.032" target="_blank" rel="nofollow noopener">https://sci-hub.se/https://doi.org/10.1016/j.addr.2012.09.032</a>)</p> <p> </p> @@ -683,66 +1054,30 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="row"> <div class="col-sm-12"> - <div class="hidden-print"> - <div class="btn-group"> - <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> - Pages - <span class="caret"></span> - </button> - <ul class="dropdown-menu" role="menu"> - - <li> - <a href="30843.html"> - Basic Estrogel Guide - </a> - </li> - - <li> - <a href="30846.html"> - Home - </a> - </li> - - <li> - <a href="32288.html"> - How to measure melting point of most organic powders using typical household items. - </a> - </li> - - <li> - <a href="34293.html"> - steam sterilization - </a> - </li> - - <li> - <a href="29602.html"> - Ultimate DIY - </a> - </li> - - </ul> - </div> - - </div> </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -752,9 +1087,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -783,48 +1116,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -839,13 +1167,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -867,7 +1199,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -888,138 +1220,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1041,6 +1379,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30843/171363.html b/groups.io/g/MTFHRT/wiki/30843/171363.html new file mode 100644 index 00000000..a4c042e7 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/30843/171363.html @@ -0,0 +1,1403 @@ + + + <!DOCTYPE html> + <html lang="en-US"> + <head> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <meta name="pinterest" content="nopin" /> + <meta name="pinterest" content="nohover" /> + + <meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" /> + <link rel="apple-touch-icon" sizes="57x57" href="https://groups.io/img/org.1/favicons/apple-icon-57x57.png"> + <link rel="apple-touch-icon" sizes="60x60" href="https://groups.io/img/org.1/favicons/apple-icon-60x60.png"> + <link rel="apple-touch-icon" sizes="72x72" href="https://groups.io/img/org.1/favicons/apple-icon-72x72.png"> + <link rel="apple-touch-icon" sizes="76x76" href="https://groups.io/img/org.1/favicons/apple-icon-76x76.png"> + <link rel="apple-touch-icon" sizes="114x114" href="https://groups.io/img/org.1/favicons/apple-icon-114x114.png"> + <link rel="apple-touch-icon" sizes="120x120" href="https://groups.io/img/org.1/favicons/apple-icon-120x120.png"> + <link rel="apple-touch-icon" sizes="144x144" href="https://groups.io/img/org.1/favicons/apple-icon-144x144.png"> + <link rel="apple-touch-icon" sizes="152x152" href="https://groups.io/img/org.1/favicons/apple-icon-152x152.png"> + <link rel="apple-touch-icon" sizes="180x180" href="https://groups.io/img/org.1/favicons/apple-icon-180x180.png"> + <link rel="icon" type="image/png" sizes="192x192" href="../../../../img/org.1/favicons/android-icon-192x192.png"> + <link rel="icon" type="image/png" sizes="32x32" href="../../../../img/org.1/favicons/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="96x96" href="../../../../img/org.1/favicons/favicon-96x96.png"> + <link rel="icon" type="image/png" sizes="16x16" href="../../../../img/org.1/favicons/favicon-16x16.png"> + <link rel="manifest" href="../../../../img/org.1/favicons/manifest.json"> + <meta name="msapplication-TileColor" content="#ffffff"> + <meta name="msapplication-TileImage" content="/ms-icon-144x144.png"> + + + + +<script> +/* stubs */ +const hapticsImpactHeavy = async () => { +}; +const hapticsImpactMedium = async () => { +}; +const hapticsImpactLight = async () => { +}; +const hapticsVibrate = async () => { +}; +const hapticsSelectionStart = async () => { +}; +const hapticsSelectionChanged = async () => { +}; +const hapticsSelectionEnd = async () => { +}; +</script> + + +<script> + + function setPullToRefresh() {} + + function gotoURL(inurl) { + window.location.href = inurl; + return; + } + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); + if (isHTMX == true) { + document.body.addEventListener('htmx:afterSettle', f, {once: true}); + } else { + if (document.readyState !== 'loading') { + console.log('document is already ready, just execute code here'); + f(); + } else { + console.log('document was not ready, place code here'); + document.addEventListener('DOMContentLoaded', f, {once: true}); + } + } + } + + // stub + function logError(data, url, linenumber) { + console.log(data) + return; + } + var pushSubToken; + var ignoreErrors = false; + var lastError = ""; + + window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) { + let column; + let stack; + if (console && console.log) { + console.log("msg:", errorMessage); + console.log("url:", errorUrl); + console.log("line:", errorLine); + if (errorColumn !== undefined && errorObj != null) { + console.log("column:", errorColumn); + column = errorColumn; + } + if (errorObj !== undefined && errorObj != null) { + console.log("stack:", errorObj.stack); + stack = errorObj.stack; + } + console.log("client_id:", "web.web09.236766.1714523381494281849"); + console.log("last_error:", lastError); + console.log("stack:", stack); + } + if (errorUrl == "" || errorUrl === null) { + errorUrl = window.location.href; + } + if (errorMessage.includes("SecurityError:") == true) { + ignoreErrors = true; + } + if (ignoreErrors == true) { + console.log("cookies, disabled, ignoring"); + lastError = errorMessage; + return; + } + jQuery.ajax({ + type: 'POST', + url: '/jsclienterror', + data: { + msg: errorMessage, + url: errorUrl, + line: errorLine, + column: column, + stack: stack, + last_error: lastError, + client_id: "web.web09.236766.1714523381494281849" + }, + success: function() { + if (console && console.log) { + console.log('JS error report successful.'); + } + lastError = errorMessage; + }, + error: function() { + if (console && console.error) { + console.error('JS error report submission failed!'); + } + lastError = errorMessage; + } + }); + return true; + } + +</script> + + + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> + <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> + <script src="../../../../js/run_prettify.js"></script> + <title> + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

DIY Estrogel Guide

+

 

+


This guide will instruct you on the materials and tools needed for home DIY basic estrogel compounding. There are easier methods out there, such as mixing estradiol into pre-made hand sanitizers, but this is for those who would prefer to compound their own gels, or manufacture at a scale where buying hand sanitizer is cost prohibitive. There are also some concerns about hand sanitizer formulations containing denaturing agents or other additives that might be bad for transdermal drug delivery. If you are interested in more experimental gel formulations or ones based on hand sanitizer, you can check out reddit.com/r/estrogel/wiki, which is where I got most of this information.

With this guide, you can produce supersaturated estrogels that are suitable for high-dose estradiol monotherapy. This is a great alternative to injections for the needle-shy or paranoid.

This recipe is based off of a patent that includes a generic estrogel recipe, available here: https://patents.google.com/patent/US20070154533A1/en - page 39 of the PDF has the recipe. This recipe has been adjusted for higher concentrations and higher absorption, using 60% ethanol, which is known to have the best absorption for estradiol. (https://sci-hub.se/https://doi.org/10.1016/j.addr.2012.09.032)



+

Sourcing Estradiol

+

The sources for estradiol are much the same as DIY injections, so I won't go into detail here. Look on made-in-china.com and search for 17b-estradiol, or more specifically, CAS number 50-28-2. For a single person, assuming they are doing monotherapy at 1-2mg a day, a typical yearly consumption is half a gram. This means 50 grams is enough to last you 100 years. I got 100 grams for $200 shipped from Hubei Vanz. You want 17 beta estradiol, not estradiol valerate, cypionate, enanthate, etc. 





+

Other ingredients

+

Other ingredients, including the quantity and price I got them before, are listed below.

+
    +
  • Carbomer/Carbopol 980 x 120g - $25 - amazon, ebay, cosmetic supply, aliexpress
  • +
  • Triethanolamine x 250ml - $20 - amazon, ebay, cosmetic supply
  • +
  • Distilled Water - $2-3 from your local grocery store
  • +
  • 95% (190 proof) grain alcohol, such as everclear - 750 ml - $20 - liquor store (any alcohol over 60%/120 proof is okay)
  • +
+

Tools

+
    +
  • Coffee frother wand - $5-10 on ebay, aliexpress, amazon. The longer and narrower the better.
  • +
  • Airless pump dispenser bottles - I have used this style(https://m.media-amazon.com/images/I/51D0UnNSu+L._SL1500_.jpg) in the past because one pump = 225mg which is roughly equivalent to .5mg of estradiol (at .24% concentration). This works out well for me because it means two pumps a day is enough for monotherapy. It also means 1 80 ml bottle (80 ml is just under the 3 oz limit on airplanes) is enough to last me roughly a month. These might not be the easiest pumps to work with though, but more on that later.
  • +
  • 100ml syringes with cap (like these https://www.amazon.com/100ml-Syringe-s-Caps-Industrial-Scientific/dp/B086H7TC1T) - also might not be necessary, more on that later
  • +
  • milligram scale such as the gemini-20 - $20-30
  • +
  • mixing container of some kind, such as a mason jar, glass cup, beaker, etc.
  • +
  • optional - metal stirrers and weighing spatulas such as these: https://www.amazon.com/gp/product/B07HHWCNB9/ - $10

  • +
+

Total: I spent about $350 to get started, but you can get everything much cheaper if you are willing to shop around and buy small quantities. The amount of carbomer, estradiol, triethanolamine, etc. per bottle is very little, so even small amounts will last you a long time. If you spent what I did, raw materials alone (not counting tools) and the pump bottle is about $5-10 per bottle. The most expensive components for me are ethanol and airless pumps. Buying airless pumps in bulk from alibaba or made-in-china sellers can get prices down lower, I know some also try using 99% isopropyl alcohol instead of ethanol, though I haven't tried this. One 80ml bottle will last you about a month at .5mg a day @ .24% concentration.

+

Preparation of gel

+

Gel preparation is quite simple, first you need to find out how much alcohol and water you need. You are trying to reach a concentration of 60/40 ethanol to water. You can easily find out how much water you need to reach an overall concentration of 60%(by volume). You can easily find online calculators for this, such as here: https://ezcalc.me/alcohol-dilution-calculator/. Assuming you want to make 100ml of gel, for example, and have 95%(190 proof) grain alcohol, you'll need ~63ml of 95% ethanol and 37ml of distilled water. From here on out I will assume you want 100ml of gel and have 95% ethanol.

+

 

+

Recipe

+

63ml ethanol
37ml distilled water
1g Carbomer 980
1.35g Triethanolamine
Estradiol to your desired concentration, I usually do .24%(by weight of the entire solution, accounting for the density of 95% ethanol at ~.8g/ml), which comes to ~215mg.

+

 

+

Procedure

+
    +
  1. Pour the ethanol into a mixing container, such as a beaker or jar.
  2. +
  3. Weigh your estradiol on a weighing paper, weighing boat, or a piece of tinfoil with your weighing spatulas, or another instrument.
  4. +
  5. Dissolve your estradiol into your ethanol and stir with a stirring instrument or coffee frother. Your solution should be clear, without any undissolved material.
  6. +
  7. Add water and stir.
  8. +
  9. Add Carbomer 980, and mix with coffee frother. This can take a long time to dissolve completely. I usually stir it with the coffee frother until most of it dissolves, then I let the solution sit while covered for 20 minutes. Then, I come back and stir it again until there are no clumps or undissolved powder.
  10. +
  11. Remove plunger from 100ml syringe. Twist on luer lock cap.
  12. +
  13. Transfer gel solution into your 100ml syringe, from the plunger side.
  14. +
  15. Add triethanolamine to your solution, stirring with your coffee frother. The solution will now go from liquid to a thicker gel, much like hand sanitizer. Stir extremely thoroughly and try to distribute the triethanolamine throughout the entire solution.
  16. +
  17. Insert plunger into back of syringe and remove the luer lock cap.
  18. +
  19. Use syringe to dispense gel into your airless pump of choice. You may want to stop a few times to let the gel settle to avoid huge air bubbles. You can tap the bottom of the airless pump against a hard surface to make the gel settle.
  20. +
+

 

+

Potential improvements and challenges

+

The hardest part of this procedure is working with the gel after triethanolamine has been added, as it almost immediately becomes very thick, clumpy, sticky, etc. You do not want to add triethanolamine to the gel before it is either in its final container, or in a syringe. If you add triethanolamine in the mixing container, it will be extremely difficult to transfer. If you get airless pumps of this style: https://www.aliexpress.com/item/2251832632413742.html you may be able to add the triethanolamine to the solution after it's already in the pump, however the mouth needs to be wide enough to fit your coffee frother. You need to be able to thoroughly mix the triethanolamine so that it can neutralize the pH of the carbomer 980. I haven't tried these bottles, but I have some other candidates on order and will update if I find a better bottle.

One possible area of improvement is adding a penetration enhancer, such as oleic acid, d-limonene, or isopropyl myristate. I personally experimented with 2% isopropyl myristate but found it incredibly irritating to my skin, and made the gel burn really badly. It also fell out of solution in my pump bottle. Personally, I just apply the gel scrotally, which results in extremely high absorption, so I feel no need to use penetration enhancers.

+

 

+

Usage/my results

+

With the bottles I recommend, each pump will dispense about 225mg of gel, or .5mg per pump. I used 4 pumps a day at first, putting 1 pump on my scrotum, and 1 on my thigh, morning and night, and after a month of this, I had the following blood test results:
Testosterone: 29 ng/dL
Estradiol: 326 pg/mL

I am currently lowering my dose to 2 pumps a day, on the scrotum only, to see if 1mg scrotally is enough for monotherapy. I will report back once I have blood test results. Although conventional wisdom with transdermal delivery says that transdermal gels have a depot effect, scrotal application has not been studied much and it could be the case that absorption is much quicker, so to be safe I apply twice a day rather than using 2 pumps once a day, and I also get my blood tests done at trough (before I do my morning dose).

This is a promising alternative to injections, and because it's alcohol based, the risk of contamination is low, even without a clean room or heat sterilization. This is also a great alternative for those who are needle-phobic or are for some reason not wanting to do injections.

If I can answer any questions, please feel free to reach out to me at owl@owl.haus or on discord: allie castro#1234

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/30843/171364.html b/groups.io/g/MTFHRT/wiki/30843/171364.html new file mode 100644 index 00000000..e430de1e --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/30843/171364.html @@ -0,0 +1,1403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

DIY Estrogel Guide

+

This guide will instruct you on the materials and tools needed for home DIY basic estrogel compounding. There are easier methods out there, such as mixing estradiol into pre-made hand sanitizers, but this is for those who would prefer to compound their own gels, or manufacture at a scale where buying hand sanitizer is cost prohibitive. There are also some concerns about hand sanitizer formulations containing denaturing agents or other additives that might be bad for transdermal drug delivery. If you are interested in more experimental gel formulations or ones based on hand sanitizer, you can check out reddit.com/r/estrogel/wiki, which is where I got most of this information.

With this guide, you can produce supersaturated estrogels that are suitable for high-dose estradiol monotherapy. This is a great alternative to injections for the needle-shy or paranoid.

This recipe is based off of a patent that includes a generic estrogel recipe, available here: https://patents.google.com/patent/US20070154533A1/en - page 39 of the PDF has the recipe. This recipe has been adjusted for higher concentrations and higher absorption, using 60% ethanol, which is known to have the best absorption for estradiol. (https://sci-hub.se/https://doi.org/10.1016/j.addr.2012.09.032)

+

 

+

Sourcing Estradiol

+

The sources for estradiol are much the same as DIY injections, so I won't go into detail here. Look on made-in-china.com and search for 17b-estradiol, or more specifically, CAS number 50-28-2. For a single person, assuming they are doing monotherapy at 1-2mg a day, a typical yearly consumption is half a gram. This means 50 grams is enough to last you 100 years. I got 100 grams for $200 shipped from Hubei Vanz. You want 17 beta estradiol, not estradiol valerate, cypionate, enanthate, etc. 





+

Other ingredients

+

Other ingredients, including the quantity and price I got them before, are listed below.

+
    +
  • Carbomer/Carbopol 980 x 120g - $25 - amazon, ebay, cosmetic supply, aliexpress
  • +
  • Triethanolamine x 250ml - $20 - amazon, ebay, cosmetic supply
  • +
  • Distilled Water - $2-3 from your local grocery store
  • +
  • 95% (190 proof) grain alcohol, such as everclear - 750 ml - $20 - liquor store (any alcohol over 60%/120 proof is okay)
  • +
+

Tools

+
    +
  • Coffee frother wand - $5-10 on ebay, aliexpress, amazon. The longer and narrower the better.
  • +
  • Airless pump dispenser bottles - I have used this style(https://m.media-amazon.com/images/I/51D0UnNSu+L._SL1500_.jpg) in the past because one pump = 225mg which is roughly equivalent to .5mg of estradiol (at .24% concentration). This works out well for me because it means two pumps a day is enough for monotherapy. It also means 1 80 ml bottle (80 ml is just under the 3 oz limit on airplanes) is enough to last me roughly a month. These might not be the easiest pumps to work with though, but more on that later.
  • +
  • 100ml syringes with cap (like these https://www.amazon.com/100ml-Syringe-s-Caps-Industrial-Scientific/dp/B086H7TC1T) - also might not be necessary, more on that later
  • +
  • milligram scale such as the gemini-20 - $20-30
  • +
  • mixing container of some kind, such as a mason jar, glass cup, beaker, etc.
  • +
  • optional - metal stirrers and weighing spatulas such as these: https://www.amazon.com/gp/product/B07HHWCNB9/ - $10

  • +
+

Total: I spent about $350 to get started, but you can get everything much cheaper if you are willing to shop around and buy small quantities. The amount of carbomer, estradiol, triethanolamine, etc. per bottle is very little, so even small amounts will last you a long time. If you spent what I did, raw materials alone (not counting tools) and the pump bottle is about $5-10 per bottle. The most expensive components for me are ethanol and airless pumps. Buying airless pumps in bulk from alibaba or made-in-china sellers can get prices down lower, I know some also try using 99% isopropyl alcohol instead of ethanol, though I haven't tried this. One 80ml bottle will last you about a month at .5mg a day @ .24% concentration.

+

Preparation of gel

+

Gel preparation is quite simple, first you need to find out how much alcohol and water you need. You are trying to reach a concentration of 60/40 ethanol to water. You can easily find out how much water you need to reach an overall concentration of 60%(by volume). You can easily find online calculators for this, such as here: https://ezcalc.me/alcohol-dilution-calculator/. Assuming you want to make 100ml of gel, for example, and have 95%(190 proof) grain alcohol, you'll need ~63ml of 95% ethanol and 37ml of distilled water. From here on out I will assume you want 100ml of gel and have 95% ethanol.

+

 

+

Recipe

+

63ml ethanol
37ml distilled water
1g Carbomer 980
1.35g Triethanolamine
Estradiol to your desired concentration, I usually do .24%(by weight of the entire solution, accounting for the density of 95% ethanol at ~.8g/ml), which comes to ~215mg.

+

 

+

Procedure

+
    +
  1. Pour the ethanol into a mixing container, such as a beaker or jar.
  2. +
  3. Weigh your estradiol on a weighing paper, weighing boat, or a piece of tinfoil with your weighing spatulas, or another instrument.
  4. +
  5. Dissolve your estradiol into your ethanol and stir with a stirring instrument or coffee frother. Your solution should be clear, without any undissolved material.
  6. +
  7. Add water and stir.
  8. +
  9. Add Carbomer 980, and mix with coffee frother. This can take a long time to dissolve completely. I usually stir it with the coffee frother until most of it dissolves, then I let the solution sit while covered for 20 minutes. Then, I come back and stir it again until there are no clumps or undissolved powder.
  10. +
  11. Remove plunger from 100ml syringe. Twist on luer lock cap.
  12. +
  13. Transfer gel solution into your 100ml syringe, from the plunger side.
  14. +
  15. Add triethanolamine to your solution, stirring with your coffee frother. The solution will now go from liquid to a thicker gel, much like hand sanitizer. Stir extremely thoroughly and try to distribute the triethanolamine throughout the entire solution.
  16. +
  17. Insert plunger into back of syringe and remove the luer lock cap.
  18. +
  19. Use syringe to dispense gel into your airless pump of choice. You may want to stop a few times to let the gel settle to avoid huge air bubbles. You can tap the bottom of the airless pump against a hard surface to make the gel settle.
  20. +
+

 

+

Potential improvements and challenges

+

The hardest part of this procedure is working with the gel after triethanolamine has been added, as it almost immediately becomes very thick, clumpy, sticky, etc. You do not want to add triethanolamine to the gel before it is either in its final container, or in a syringe. If you add triethanolamine in the mixing container, it will be extremely difficult to transfer. If you get airless pumps of this style: https://www.aliexpress.com/item/2251832632413742.html you may be able to add the triethanolamine to the solution after it's already in the pump, however the mouth needs to be wide enough to fit your coffee frother. You need to be able to thoroughly mix the triethanolamine so that it can neutralize the pH of the carbomer 980. I haven't tried these bottles, but I have some other candidates on order and will update if I find a better bottle.

One possible area of improvement is adding a penetration enhancer, such as oleic acid, d-limonene, or isopropyl myristate. I personally experimented with 2% isopropyl myristate but found it incredibly irritating to my skin, and made the gel burn really badly. It also fell out of solution in my pump bottle. Personally, I just apply the gel scrotally, which results in extremely high absorption, so I feel no need to use penetration enhancers.

+

 

+

Usage/my results

+

With the bottles I recommend, each pump will dispense about 225mg of gel, or .5mg per pump. I used 4 pumps a day at first, putting 1 pump on my scrotum, and 1 on my thigh, morning and night, and after a month of this, I had the following blood test results:
Testosterone: 29 ng/dL
Estradiol: 326 pg/mL

I am currently lowering my dose to 2 pumps a day, on the scrotum only, to see if 1mg scrotally is enough for monotherapy. I will report back once I have blood test results. Although conventional wisdom with transdermal delivery says that transdermal gels have a depot effect, scrotal application has not been studied much and it could be the case that absorption is much quicker, so to be safe I apply twice a day rather than using 2 pumps once a day, and I also get my blood tests done at trough (before I do my morning dose).

This is a promising alternative to injections, and because it's alcohol based, the risk of contamination is low, even without a clean room or heat sterilization. This is also a great alternative for those who are needle-phobic or are for some reason not wanting to do injections.

If I can answer any questions, please feel free to reach out to me at owl@owl.haus or on discord: allie castro#1234

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/30843/171365.html b/groups.io/g/MTFHRT/wiki/30843/171365.html new file mode 100644 index 00000000..401532f9 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/30843/171365.html @@ -0,0 +1,1403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

DIY Estrogel Guide

+

This guide will instruct you on the materials and tools needed for home DIY basic estrogel compounding. There are easier methods out there, such as mixing estradiol into pre-made hand sanitizers, but this is for those who would prefer to compound their own gels, or manufacture at a scale where buying hand sanitizer is cost prohibitive. There are also some concerns about hand sanitizer formulations containing denaturing agents or other additives that might be bad for transdermal drug delivery. If you are interested in more experimental gel formulations or ones based on hand sanitizer, you can check out reddit.com/r/estrogel/wiki, which is where I got most of this information.

With this guide, you can produce supersaturated estrogels that are suitable for high-dose estradiol monotherapy. This is a great alternative to injections for the needle-shy or paranoid.

This recipe is based off of a patent that includes a generic estrogel recipe, available here: https://patents.google.com/patent/US20070154533A1/en - page 39 of the PDF has the recipe. This recipe has been adjusted for higher concentrations and higher absorption, using 60% ethanol, which is known to have the best absorption for estradiol. (https://sci-hub.se/https://doi.org/10.1016/j.addr.2012.09.032)

+

 

+

Sourcing Estradiol

+

The sources for estradiol are much the same as DIY injections, so I won't go into detail here. Look on made-in-china.com and search for 17b-estradiol, or more specifically, CAS number 50-28-2. For a single person, assuming they are doing monotherapy at 1-2mg a day, a typical yearly consumption is half a gram. This means 50 grams is enough to last you 100 years. I got 100 grams for $200 shipped from Hubei Vanz. You want 17 beta estradiol, not estradiol valerate, cypionate, enanthate, etc. 

+


Other ingredients

+

Other ingredients, including the quantity and price I got them before, are listed below.

+
    +
  • Carbomer/Carbopol 980 x 120g - $25 - amazon, ebay, cosmetic supply, aliexpress
  • +
  • Triethanolamine x 250ml - $20 - amazon, ebay, cosmetic supply
  • +
  • Distilled Water - $2-3 from your local grocery store
  • +
  • 95% (190 proof) grain alcohol, such as everclear - 750 ml - $20 - liquor store (any alcohol over 60%/120 proof is okay)
  • +
+

Tools

+
    +
  • Coffee frother wand - $5-10 on ebay, aliexpress, amazon. The longer and narrower the better.
  • +
  • Airless pump dispenser bottles - I have used this style(https://m.media-amazon.com/images/I/51D0UnNSu+L._SL1500_.jpg) in the past because one pump = 225mg which is roughly equivalent to .5mg of estradiol (at .24% concentration). This works out well for me because it means two pumps a day is enough for monotherapy. It also means 1 80 ml bottle (80 ml is just under the 3 oz limit on airplanes) is enough to last me roughly a month. These might not be the easiest pumps to work with though, but more on that later.
  • +
  • 100ml syringes with cap (like these https://www.amazon.com/100ml-Syringe-s-Caps-Industrial-Scientific/dp/B086H7TC1T) - also might not be necessary, more on that later
  • +
  • milligram scale such as the gemini-20 - $20-30
  • +
  • mixing container of some kind, such as a mason jar, glass cup, beaker, etc.
  • +
  • optional - metal stirrers and weighing spatulas such as these: https://www.amazon.com/gp/product/B07HHWCNB9/ - $10

  • +
+

Total: I spent about $350 to get started, but you can get everything much cheaper if you are willing to shop around and buy small quantities. The amount of carbomer, estradiol, triethanolamine, etc. per bottle is very little, so even small amounts will last you a long time. If you spent what I did, raw materials alone (not counting tools) and the pump bottle is about $5-10 per bottle. The most expensive components for me are ethanol and airless pumps. Buying airless pumps in bulk from alibaba or made-in-china sellers can get prices down lower, I know some also try using 99% isopropyl alcohol instead of ethanol, though I haven't tried this. One 80ml bottle will last you about a month at .5mg a day @ .24% concentration.

+

Preparation of gel

+

Gel preparation is quite simple, first you need to find out how much alcohol and water you need. You are trying to reach a concentration of 60/40 ethanol to water. You can easily find out how much water you need to reach an overall concentration of 60%(by volume). You can easily find online calculators for this, such as here: https://ezcalc.me/alcohol-dilution-calculator/. Assuming you want to make 100ml of gel, for example, and have 95%(190 proof) grain alcohol, you'll need ~63ml of 95% ethanol and 37ml of distilled water. From here on out I will assume you want 100ml of gel and have 95% ethanol.

+

 

+

Recipe

+

63ml ethanol
37ml distilled water
1g Carbomer 980
1.35g Triethanolamine
Estradiol to your desired concentration, I usually do .24%(by weight of the entire solution, accounting for the density of 95% ethanol at ~.8g/ml), which comes to ~215mg.

+

 

+

Procedure

+
    +
  1. Pour the ethanol into a mixing container, such as a beaker or jar.
  2. +
  3. Weigh your estradiol on a weighing paper, weighing boat, or a piece of tinfoil with your weighing spatulas, or another instrument.
  4. +
  5. Dissolve your estradiol into your ethanol and stir with a stirring instrument or coffee frother. Your solution should be clear, without any undissolved material.
  6. +
  7. Add water and stir.
  8. +
  9. Add Carbomer 980, and mix with coffee frother. This can take a long time to dissolve completely. I usually stir it with the coffee frother until most of it dissolves, then I let the solution sit while covered for 20 minutes. Then, I come back and stir it again until there are no clumps or undissolved powder.
  10. +
  11. Remove plunger from 100ml syringe. Twist on luer lock cap.
  12. +
  13. Transfer gel solution into your 100ml syringe, from the plunger side.
  14. +
  15. Add triethanolamine to your solution, stirring with your coffee frother. The solution will now go from liquid to a thicker gel, much like hand sanitizer. Stir extremely thoroughly and try to distribute the triethanolamine throughout the entire solution.
  16. +
  17. Insert plunger into back of syringe and remove the luer lock cap.
  18. +
  19. Use syringe to dispense gel into your airless pump of choice. You may want to stop a few times to let the gel settle to avoid huge air bubbles. You can tap the bottom of the airless pump against a hard surface to make the gel settle.
  20. +
+

 

+

Potential improvements and challenges

+

The hardest part of this procedure is working with the gel after triethanolamine has been added, as it almost immediately becomes very thick, clumpy, sticky, etc. You do not want to add triethanolamine to the gel before it is either in its final container, or in a syringe. If you add triethanolamine in the mixing container, it will be extremely difficult to transfer. If you get airless pumps of this style: https://www.aliexpress.com/item/2251832632413742.html you may be able to add the triethanolamine to the solution after it's already in the pump, however the mouth needs to be wide enough to fit your coffee frother. You need to be able to thoroughly mix the triethanolamine so that it can neutralize the pH of the carbomer 980. I haven't tried these bottles, but I have some other candidates on order and will update if I find a better bottle.

One possible area of improvement is adding a penetration enhancer, such as oleic acid, d-limonene, or isopropyl myristate. I personally experimented with 2% isopropyl myristate but found it incredibly irritating to my skin, and made the gel burn really badly. It also fell out of solution in my pump bottle. Personally, I just apply the gel scrotally, which results in extremely high absorption, so I feel no need to use penetration enhancers.

+

 

+

Usage/my results

+

With the bottles I recommend, each pump will dispense about 225mg of gel, or .5mg per pump. I used 4 pumps a day at first, putting 1 pump on my scrotum, and 1 on my thigh, morning and night, and after a month of this, I had the following blood test results:
Testosterone: 29 ng/dL
Estradiol: 326 pg/mL

I am currently lowering my dose to 2 pumps a day, on the scrotum only, to see if 1mg scrotally is enough for monotherapy. I will report back once I have blood test results. Although conventional wisdom with transdermal delivery says that transdermal gels have a depot effect, scrotal application has not been studied much and it could be the case that absorption is much quicker, so to be safe I apply twice a day rather than using 2 pumps once a day, and I also get my blood tests done at trough (before I do my morning dose).

This is a promising alternative to injections, and because it's alcohol based, the risk of contamination is low, even without a clean room or heat sterilization. This is also a great alternative for those who are needle-phobic or are for some reason not wanting to do injections.

If I can answer any questions, please feel free to reach out to me at owl@owl.haus or on discord: allie castro#1234

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/30843/171431.html b/groups.io/g/MTFHRT/wiki/30843/171431.html new file mode 100644 index 00000000..5d2292e9 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/30843/171431.html @@ -0,0 +1,1404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

DIY Estrogel Guide

+

This guide will instruct you on the materials and tools needed for home DIY basic estrogel compounding. There are easier methods out there, such as mixing estradiol into pre-made hand sanitizers, but this is for those who would prefer to compound their own gels, or manufacture at a scale where buying hand sanitizer is cost prohibitive. There are also some concerns about hand sanitizer formulations containing denaturing agents or other additives that might be bad for transdermal drug delivery. If you are interested in more experimental gel formulations or ones based on hand sanitizer, you can check out reddit.com/r/estrogel/wiki, which is where I got most of this information.

With this guide, you can produce supersaturated estrogels that are suitable for high-dose estradiol monotherapy. This is a great alternative to injections for the needle-shy or paranoid.

This recipe is based off of a patent that includes a generic estrogel recipe, available here: https://patents.google.com/patent/US20070154533A1/en - page 39 of the PDF has the recipe. This recipe has been adjusted for higher concentrations and higher absorption, using 60% ethanol, which is known to have the best absorption for estradiol. (https://sci-hub.se/https://doi.org/10.1016/j.addr.2012.09.032)

+

 

+

Sourcing Estradiol

+

The sources for estradiol are much the same as DIY injections, so I won't go into detail here. Look on made-in-china.com and search for 17b-estradiol, or more specifically, CAS number 50-28-2. For a single person, assuming they are doing monotherapy at 1-2mg a day, a typical yearly consumption is half a gram. This means 50 grams is enough to last you 100 years. I got 100 grams for $200 shipped from Hubei Vanz. You want 17 beta estradiol, not estradiol valerate, cypionate, enanthate, etc. 

+


Other ingredients

+

Other ingredients, including the quantity and price I got them before, are listed below.

+
    +
  • Carbomer/Carbopol 980 x 120g - $25 - amazon, ebay, cosmetic supply, aliexpress
  • +
  • Triethanolamine x 250ml - $20 - amazon, ebay, cosmetic supply
  • +
  • Distilled Water - $2-3 from your local grocery store
  • +
  • 95% (190 proof) grain alcohol, such as everclear - 750 ml - $20 - liquor store (any alcohol over 60%/120 proof is okay)
  • +
+

Tools

+
    +
  • Coffee frother wand - $5-10 on ebay, aliexpress, amazon. The longer and narrower the better.
  • +
  • Airless pump dispenser bottles - I have used this style(https://m.media-amazon.com/images/I/51D0UnNSu+L._SL1500_.jpg) in the past because one pump = 225mg which is roughly equivalent to .5mg of estradiol (at .24% concentration). This works out well for me because it means two pumps a day is enough for monotherapy. It also means 1 80 ml bottle (80 ml is just under the 3 oz limit on airplanes) is enough to last me roughly a month. These might not be the easiest pumps to work with though, but more on that later.
  • +
  • 100ml syringes with cap (like these https://www.amazon.com/100ml-Syringe-s-Caps-Industrial-Scientific/dp/B086H7TC1T) - also might not be necessary, more on that later
  • +
  • milligram scale such as the gemini-20 - $20-30
  • +
  • mixing container of some kind, such as a mason jar, glass cup, beaker, etc.
  • +
  • optional - metal stirrers and weighing spatulas such as these: https://www.amazon.com/gp/product/B07HHWCNB9/ - $10

  • +
+

Total: I spent about $350 to get started, but you can get everything much cheaper if you are willing to shop around and buy small quantities. The amount of carbomer, estradiol, triethanolamine, etc. per bottle is very little, so even small amounts will last you a long time. If you spent what I did, raw materials alone (not counting tools) and the pump bottle is about $5-10 per bottle. The most expensive components for me are ethanol and airless pumps. Buying airless pumps in bulk from alibaba or made-in-china sellers can get prices down lower, I know some also try using 99% isopropyl alcohol instead of ethanol, though I haven't tried this. One 80ml bottle will last you about a month at .5mg a day @ .24% concentration.

+

Preparation of gel

+

Gel preparation is quite simple, first you need to find out how much alcohol and water you need. You are trying to reach a concentration of 60/40 ethanol to water. You can easily find out how much water you need to reach an overall concentration of 60%(by volume). You can easily find online calculators for this, such as here: https://ezcalc.me/alcohol-dilution-calculator/. Assuming you want to make 100ml of gel, for example, and have 95%(190 proof) grain alcohol, you'll need ~63ml of 95% ethanol and 37ml of distilled water. From here on out I will assume you want 100ml of gel and have 95% ethanol.

+

 

+

Recipe

+

63ml ethanol
37ml distilled water
1g Carbomer 980
1.35g Triethanolamine
Estradiol to your desired concentration, I usually do .24%(by weight of the entire solution, accounting for the density of 95% ethanol at ~.8g/ml), which comes to ~215mg.

+

 

+

Procedure

+
    +
  1. Pour the ethanol into a mixing container, such as a beaker or jar.
  2. +
  3. Weigh your estradiol on a weighing paper, weighing boat, or a piece of tinfoil with your weighing spatulas, or another instrument.
  4. +
  5. Dissolve your estradiol into your ethanol and stir with a stirring instrument or coffee frother. Your solution should be clear, without any undissolved material.
  6. +
  7. Add water and stir.
  8. +
  9. Add Carbomer 980, and mix with coffee frother. This can take a long time to dissolve completely. I usually stir it with the coffee frother until most of it dissolves, then I let the solution sit while covered for 20 minutes. Then, I come back and stir it again until there are no clumps or undissolved powder.
  10. +
  11. Remove plunger from 100ml syringe. Twist on luer lock cap.
  12. +
  13. Transfer gel solution into your 100ml syringe, from the plunger side.
  14. +
  15. Add triethanolamine to your solution, stirring with your coffee frother. The solution will now go from liquid to a thicker gel, much like hand sanitizer. Stir extremely thoroughly and try to distribute the triethanolamine throughout the entire solution.
  16. +
  17. Insert plunger into back of syringe and remove the luer lock cap.
  18. +
  19. Use syringe to dispense gel into your airless pump of choice. You may want to stop a few times to let the gel settle to avoid huge air bubbles. You can tap the bottom of the airless pump against a hard surface to make the gel settle.
  20. +
+

 

+

Potential improvements and challenges

+

The hardest part of this procedure is working with the gel after triethanolamine has been added, as it almost immediately becomes very thick, clumpy, sticky, etc. You do not want to add triethanolamine to the gel before it is either in its final container, or in a syringe. If you add triethanolamine in the mixing container, it will be extremely difficult to transfer. If you get airless pumps of this style: https://www.aliexpress.com/item/2251832632413742.html you may be able to add the triethanolamine to the solution after it's already in the pump, however the mouth needs to be wide enough to fit your coffee frother. You need to be able to thoroughly mix the triethanolamine so that it can neutralize the pH of the carbomer 980. I haven't tried these bottles, but I have some other candidates on order and will update if I find a better bottle.

One possible area of improvement is adding a penetration enhancer, such as oleic acid, d-limonene, or isopropyl myristate. I personally experimented with 2% isopropyl myristate but found it incredibly irritating to my skin, and made the gel burn really badly. It also fell out of solution in my pump bottle. Personally, I just apply the gel scrotally, which results in extremely high absorption, so I feel no need to use penetration enhancers.

+

 

+

Usage/my results

+

With the bottles I recommend, each pump will dispense about 225mg of gel, or .5mg per pump. I used 4 pumps a day at first, putting 1 pump on my scrotum, and 1 on my thigh, morning and night, and after a month of this, I had the following blood test results:
Testosterone: 29 ng/dL
Estradiol: 326 pg/mL

I am currently lowering my dose to 2 pumps a day, on the scrotum only, to see if 1mg scrotally is enough for monotherapy. I will report back once I have blood test results. Although conventional wisdom with transdermal delivery says that transdermal gels have a depot effect, scrotal application has not been studied much and it could be the case that absorption is much quicker, so to be safe I apply twice a day rather than using 2 pumps once a day, and I also get my blood tests done at trough (before I do my morning dose).

This is a promising alternative to injections, and because it's alcohol based, the risk of contamination is low, even without a clean room or heat sterilization. This is also a great alternative for those who are needle-phobic or are for some reason not wanting to do injections.

If I can answer any questions, please feel free to reach out to me at owl@owl.haus or on discord: allie castro#1234

+

Discussion: https://groups.io/g/MTFHRT/topic/wiki_article_about_estrogel/93220481

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/30843/171432.html b/groups.io/g/MTFHRT/wiki/30843/171432.html new file mode 100644 index 00000000..d0e9750e --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/30843/171432.html @@ -0,0 +1,1404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

DIY Estrogel Guide

+

This guide will instruct you on the materials and tools needed for home DIY basic estrogel compounding. There are easier methods out there, such as mixing estradiol into pre-made hand sanitizers, but this is for those who would prefer to compound their own gels, or manufacture at a scale where buying hand sanitizer is cost prohibitive. There are also some concerns about hand sanitizer formulations containing denaturing agents or other additives that might be bad for transdermal drug delivery. If you are interested in more experimental gel formulations or ones based on hand sanitizer, you can check out reddit.com/r/estrogel/wiki, which is where I got most of this information.

With this guide, you can produce supersaturated estrogels that are suitable for high-dose estradiol monotherapy. This is a great alternative to injections for the needle-shy or paranoid.

This recipe is based off of a patent that includes a generic estrogel recipe, available here: https://patents.google.com/patent/US20070154533A1/en - page 39 of the PDF has the recipe. This recipe has been adjusted for higher concentrations and higher absorption, using 60% ethanol, which is known to have the best absorption for estradiol. (https://sci-hub.se/https://doi.org/10.1016/j.addr.2012.09.032)

+

 

+

Sourcing Estradiol

+

The sources for estradiol are much the same as DIY injections, so I won't go into detail here. Look on made-in-china.com and search for 17b-estradiol, or more specifically, CAS number 50-28-2. For a single person, assuming they are doing monotherapy at 1-2mg a day, a typical yearly consumption is half a gram. This means 50 grams is enough to last you 100 years. I got 100 grams for $200 shipped from Hubei Vanz. You want 17 beta estradiol, not estradiol valerate, cypionate, enanthate, etc. 

+


Other ingredients

+

Other ingredients, including the quantity and price I got them before, are listed below.

+
    +
  • Carbomer/Carbopol 980 x 120g - $25 - amazon, ebay, cosmetic supply, aliexpress
  • +
  • Triethanolamine x 250ml - $20 - amazon, ebay, cosmetic supply
  • +
  • Distilled Water - $2-3 from your local grocery store
  • +
  • 95% (190 proof) grain alcohol, such as everclear - 750 ml - $20 - liquor store (any alcohol over 60%/120 proof is okay)
  • +
+

Tools

+
    +
  • Coffee frother wand - $5-10 on ebay, aliexpress, amazon. The longer and narrower the better.
  • +
  • Airless pump dispenser bottles - I have used this style(https://m.media-amazon.com/images/I/51D0UnNSu+L._SL1500_.jpg) in the past because one pump = 225mg which is roughly equivalent to .5mg of estradiol (at .24% concentration). This works out well for me because it means two pumps a day is enough for monotherapy. It also means 1 80 ml bottle (80 ml is just under the 3 oz limit on airplanes) is enough to last me roughly a month. These might not be the easiest pumps to work with though, but more on that later.
  • +
  • 100ml syringes with cap (like these https://www.amazon.com/100ml-Syringe-s-Caps-Industrial-Scientific/dp/B086H7TC1T) - also might not be necessary, more on that later
  • +
  • milligram scale such as the gemini-20 - $20-30
  • +
  • mixing container of some kind, such as a mason jar, glass cup, beaker, etc.
  • +
  • optional - metal stirrers and weighing spatulas such as these: https://www.amazon.com/gp/product/B07HHWCNB9/ - $10

  • +
+

Total: I spent about $350 to get started, but you can get everything much cheaper if you are willing to shop around and buy small quantities. The amount of carbomer, estradiol, triethanolamine, etc. per bottle is very little, so even small amounts will last you a long time. If you spent what I did, raw materials alone (not counting tools) and the pump bottle is about $5-10 per bottle. The most expensive components for me are ethanol and airless pumps. Buying airless pumps in bulk from alibaba or made-in-china sellers can get prices down lower, I know some also try using 99% isopropyl alcohol instead of ethanol, though I haven't tried this. One 80ml bottle will last you about a month at .5mg a day @ .24% concentration.

+

Preparation of gel

+

Gel preparation is quite simple, first you need to find out how much alcohol and water you need. You are trying to reach a concentration of 60/40 ethanol to water. You can easily find out how much water you need to reach an overall concentration of 60%(by volume). You can easily find online calculators for this, such as here: https://ezcalc.me/alcohol-dilution-calculator/. Assuming you want to make 100ml of gel, for example, and have 95%(190 proof) grain alcohol, you'll need ~63ml of 95% ethanol and 37ml of distilled water. From here on out I will assume you want 100ml of gel and have 95% ethanol.

+

 

+

Recipe

+

63ml ethanol
37ml distilled water
1g Carbomer 980
1.35g Triethanolamine
Estradiol to your desired concentration, I usually do .24%(by weight of the entire solution, accounting for the density of 95% ethanol at ~.8g/ml), which comes to ~215mg.

+

 

+

Procedure

+
    +
  1. Pour the ethanol into a mixing container, such as a beaker or jar.
  2. +
  3. Weigh your estradiol on a weighing paper, weighing boat, or a piece of tinfoil with your weighing spatulas, or another instrument.
  4. +
  5. Dissolve your estradiol into your ethanol and stir with a stirring instrument or coffee frother. Your solution should be clear, without any undissolved material.
  6. +
  7. Add water and stir.
  8. +
  9. Add Carbomer 980, and mix with coffee frother. This can take a long time to dissolve completely. I usually stir it with the coffee frother until most of it dissolves, then I let the solution sit while covered for 20 minutes. Then, I come back and stir it again until there are no clumps or undissolved powder.
  10. +
  11. Remove plunger from 100ml syringe. Twist on luer lock cap.
  12. +
  13. Transfer gel solution into your 100ml syringe, from the plunger side.
  14. +
  15. Add triethanolamine to your solution, stirring with your coffee frother. The solution will now go from liquid to a thicker gel, much like hand sanitizer. Stir extremely thoroughly and try to distribute the triethanolamine throughout the entire solution.
  16. +
  17. Insert plunger into back of syringe and remove the luer lock cap.
  18. +
  19. Use syringe to dispense gel into your airless pump of choice. You may want to stop a few times to let the gel settle to avoid huge air bubbles. You can tap the bottom of the airless pump against a hard surface to make the gel settle.
  20. +
+

 

+

Potential improvements and challenges

+

The hardest part of this procedure is working with the gel after triethanolamine has been added, as it almost immediately becomes very thick, clumpy, sticky, etc. You do not want to add triethanolamine to the gel before it is either in its final container, or in a syringe. If you add triethanolamine in the mixing container, it will be extremely difficult to transfer. If you get airless pumps of this style: https://www.aliexpress.com/item/2251832632413742.html you may be able to add the triethanolamine to the solution after it's already in the pump, however the mouth needs to be wide enough to fit your coffee frother. You need to be able to thoroughly mix the triethanolamine so that it can neutralize the pH of the carbomer 980. I haven't tried these bottles, but I have some other candidates on order and will update if I find a better bottle.

One possible area of improvement is adding a penetration enhancer, such as oleic acid, d-limonene, or isopropyl myristate. I personally experimented with 2% isopropyl myristate but found it incredibly irritating to my skin, and made the gel burn really badly. It also fell out of solution in my pump bottle. Personally, I just apply the gel scrotally, which results in extremely high absorption, so I feel no need to use penetration enhancers.

+

 

+

Usage/my results

+

With the bottles I recommend, each pump will dispense about 225mg of gel, or .5mg per pump. I used 4 pumps a day at first, putting 1 pump on my scrotum, and 1 on my thigh, morning and night, and after a month of this, I had the following blood test results:
Testosterone: 29 ng/dL
Estradiol: 326 pg/mL

I am currently lowering my dose to 2 pumps a day, on the scrotum only, to see if 1mg scrotally is enough for monotherapy. I will report back once I have blood test results. Although conventional wisdom with transdermal delivery says that transdermal gels have a depot effect, scrotal application has not been studied much and it could be the case that absorption is much quicker, so to be safe I apply twice a day rather than using 2 pumps once a day, and I also get my blood tests done at trough (before I do my morning dose).

This is a promising alternative to injections, and because it's alcohol based, the risk of contamination is low, even without a clean room or heat sterilization. This is also a great alternative for those who are needle-phobic or are for some reason not wanting to do injections.

If I can answer any questions, please feel free to reach out to me at owl@owl.haus or on discord: allie castro#1234

+

Discussion: https://groups.io/g/MTFHRT/topic/wiki_article_about_estrogel/93220481

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/30843/history.html b/groups.io/g/MTFHRT/wiki/30843/history.html index ddc91ece..83c6dca7 100644 --- a/groups.io/g/MTFHRT/wiki/30843/history.html +++ b/groups.io/g/MTFHRT/wiki/30843/history.html @@ -6,7 +6,7 @@ - + @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774628.1713918440736062136"); + console.log("client_id:", "web.web09.236702.1714523380049246401"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774628.1713918440736062136" + client_id: "web.web09.236702.1714523380049246401" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { - + - - + + @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -589,7 +914,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="171432"> + <a href="171432.html"> @@ -623,7 +948,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="171431"> + <a href="171431.html"> @@ -655,7 +980,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="171365"> + <a href="171365.html"> @@ -687,7 +1012,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="171364"> + <a href="171364.html"> @@ -719,7 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="171363"> + <a href="171363.html"> Publishing v1 of the estrogel guide @@ -742,6 +1067,10 @@ function createAlert(msg, isError, autoClose, noClose) { </form> <script type="text/javascript"> +contentLoaded(false, function() { + + UpdateSidebar("wiki"); +}); function countChecked(id) { var checkedVal = 0; @@ -768,20 +1097,20 @@ function countChecked(id) { } </script> + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -791,9 +1120,7 @@ function countChecked(id) { </div> </div> - - @@ -822,48 +1149,43 @@ function countChecked(id) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -878,13 +1200,17 @@ function countChecked(id) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -906,7 +1232,7 @@ function countChecked(id) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -927,138 +1253,144 @@ function countChecked(id) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1080,6 +1412,21 @@ function countChecked(id) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30846.html b/groups.io/g/MTFHRT/wiki/30846.html index 440768f4..645644fe 100644 --- a/groups.io/g/MTFHRT/wiki/30846.html +++ b/groups.io/g/MTFHRT/wiki/30846.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774005.1713918438187784055"); + console.log("client_id:", "web.web09.236585.1714523377608880674"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774005.1713918438187784055" + client_id: "web.web09.236585.1714523377608880674" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Home</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Home</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,51 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated30846"> - $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false - )); -</script> - · - <a href="30846/history.html"> - 5 revisions - </a> -    - <a href="30846.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p><a href="29602.html" rel="nofollow">Injections</a></p> -<p><a href="30843.html" rel="nofollow">Gel</a></p> -<p><a title="How to measure melting point of most organic powders using typical household items." href="32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> -<p>Literature and discussions on:</p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271" rel="nofollow">Hrt and brain</a></p> -<p> </p> -<p> </p> -<p> </p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -684,25 +970,74 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated30846"> + $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false + )); +</script> + · + <a href="30846/history.html"> + 5 revisions + </a> +    + <a href="30846.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p><a href="29602.html" rel="nofollow">Injections</a></p> +<p><a href="30843.html" rel="nofollow">Gel</a></p> +<p><a title="How to measure melting point of most organic powders using typical household items." href="32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> +<p>Literature and discussions on:</p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271" rel="nofollow">Hrt and brain</a></p> +<p> </p> +<p> </p> +<p> </p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -712,9 +1047,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -743,48 +1076,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -799,13 +1127,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -827,7 +1159,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -848,138 +1180,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1001,6 +1339,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30846/171373.html b/groups.io/g/MTFHRT/wiki/30846/171373.html index 8ebd65ca..d34aa991 100644 --- a/groups.io/g/MTFHRT/wiki/30846/171373.html +++ b/groups.io/g/MTFHRT/wiki/30846/171373.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774118.1713918440301729467"); + console.log("client_id:", "web.web08.237148.1714523381058446840"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774118.1713918440301729467" + client_id: "web.web08.237148.1714523381058446840" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Home</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Home</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,44 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated30846"> - $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false - )); -</script> - · - <a href="history.html"> - 5 revisions - </a> -    - <a href="../30846.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p><a href="../29602.html" rel="nofollow">Injections</a></p> -<p><a href="../30843.html" rel="nofollow">Gel</a></p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -677,25 +970,67 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated30846"> + $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false + )); +</script> + · + <a href="history.html"> + 5 revisions + </a> +    + <a href="../30846.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p><a href="../29602.html" rel="nofollow">Injections</a></p> +<p><a href="../30843.html" rel="nofollow">Gel</a></p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -705,9 +1040,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -736,48 +1069,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -792,13 +1120,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -820,7 +1152,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -841,138 +1173,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -994,6 +1332,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30846/175561.html b/groups.io/g/MTFHRT/wiki/30846/175561.html index e7eda42c..be04e259 100644 --- a/groups.io/g/MTFHRT/wiki/30846/175561.html +++ b/groups.io/g/MTFHRT/wiki/30846/175561.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774611.1713918440236052559"); + console.log("client_id:", "web.web09.236743.1714523380975210372"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774611.1713918440236052559" + client_id: "web.web09.236743.1714523380975210372" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Home</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Home</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,45 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated30846"> - $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false - )); -</script> - · - <a href="history.html"> - 5 revisions - </a> -    - <a href="../30846.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p><a href="../29602.html" rel="nofollow">Injections</a></p> -<p><a href="../30843.html" rel="nofollow">Gel</a></p> -<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -678,25 +970,68 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated30846"> + $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false + )); +</script> + · + <a href="history.html"> + 5 revisions + </a> +    + <a href="../30846.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p><a href="../29602.html" rel="nofollow">Injections</a></p> +<p><a href="../30843.html" rel="nofollow">Gel</a></p> +<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -706,9 +1041,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -737,48 +1070,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -793,13 +1121,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -821,7 +1153,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -842,138 +1174,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -995,6 +1333,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30846/175575.html b/groups.io/g/MTFHRT/wiki/30846/175575.html index c43386fb..71f70d6e 100644 --- a/groups.io/g/MTFHRT/wiki/30846/175575.html +++ b/groups.io/g/MTFHRT/wiki/30846/175575.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774107.1713918440167908054"); + console.log("client_id:", "web.web08.237142.1714523380888093416"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774107.1713918440167908054" + client_id: "web.web08.237142.1714523380888093416" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Home</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Home</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,50 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated30846"> - $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false - )); -</script> - · - <a href="history.html"> - 5 revisions - </a> -    - <a href="../30846.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p><a href="../29602.html" rel="nofollow">Injections</a></p> -<p><a href="../30843.html" rel="nofollow">Gel</a></p> -<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> -<p>Literature and discussions on:</p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">Hrt and brain</a></p> -<p> </p> -<p> </p> -<p> </p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -683,25 +970,73 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated30846"> + $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false + )); +</script> + · + <a href="history.html"> + 5 revisions + </a> +    + <a href="../30846.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p><a href="../29602.html" rel="nofollow">Injections</a></p> +<p><a href="../30843.html" rel="nofollow">Gel</a></p> +<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> +<p>Literature and discussions on:</p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">Hrt and brain</a></p> +<p> </p> +<p> </p> +<p> </p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -711,9 +1046,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -742,48 +1075,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -798,13 +1126,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -826,7 +1158,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -847,138 +1179,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1000,6 +1338,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30846/175576.html b/groups.io/g/MTFHRT/wiki/30846/175576.html index 0095ef0e..ae59436e 100644 --- a/groups.io/g/MTFHRT/wiki/30846/175576.html +++ b/groups.io/g/MTFHRT/wiki/30846/175576.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774595.1713918440101304545"); + console.log("client_id:", "web.web09.236734.1714523380805581536"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774595.1713918440101304545" + client_id: "web.web09.236734.1714523380805581536" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Home</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Home</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,51 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated30846"> - $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false - )); -</script> - · - <a href="history.html"> - 5 revisions - </a> -    - <a href="../30846.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p><a href="../29602.html" rel="nofollow">Injections</a></p> -<p><a href="../30843.html" rel="nofollow">Gel</a></p> -<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> -<p>Literature and discussions on:</p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271#7645" rel="nofollow">Hrt and brain</a></p> -<p> </p> -<p> </p> -<p> </p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -684,25 +970,74 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated30846"> + $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false + )); +</script> + · + <a href="history.html"> + 5 revisions + </a> +    + <a href="../30846.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p><a href="../29602.html" rel="nofollow">Injections</a></p> +<p><a href="../30843.html" rel="nofollow">Gel</a></p> +<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> +<p>Literature and discussions on:</p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271#7645" rel="nofollow">Hrt and brain</a></p> +<p> </p> +<p> </p> +<p> </p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -712,9 +1047,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -743,48 +1076,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -799,13 +1127,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -827,7 +1159,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -848,138 +1180,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1001,6 +1339,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30846/175577.html b/groups.io/g/MTFHRT/wiki/30846/175577.html index 21aed2e6..052f52cc 100644 --- a/groups.io/g/MTFHRT/wiki/30846/175577.html +++ b/groups.io/g/MTFHRT/wiki/30846/175577.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774095.1713918440033905718"); + console.log("client_id:", "web.web08.237133.1714523380716243082"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774095.1713918440033905718" + client_id: "web.web08.237133.1714523380716243082" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Home</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Home</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,51 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated30846"> - $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false - )); -</script> - · - <a href="history.html"> - 5 revisions - </a> -    - <a href="../30846.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p><a href="../29602.html" rel="nofollow">Injections</a></p> -<p><a href="../30843.html" rel="nofollow">Gel</a></p> -<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> -<p>Literature and discussions on:</p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271" rel="nofollow">Hrt and brain</a></p> -<p> </p> -<p> </p> -<p> </p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -684,25 +970,74 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated30846"> + $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false + )); +</script> + · + <a href="history.html"> + 5 revisions + </a> +    + <a href="../30846.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p><a href="../29602.html" rel="nofollow">Injections</a></p> +<p><a href="../30843.html" rel="nofollow">Gel</a></p> +<p><a title="How to measure melting point of most organic powders using typical household items." href="../32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> +<p>Literature and discussions on:</p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271" rel="nofollow">Hrt and brain</a></p> +<p> </p> +<p> </p> +<p> </p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -712,9 +1047,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -743,48 +1076,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -799,13 +1127,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -827,7 +1159,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -848,138 +1180,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1001,6 +1339,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/30846/history.html b/groups.io/g/MTFHRT/wiki/30846/history.html index 0ac2f95e..d08a95b9 100644 --- a/groups.io/g/MTFHRT/wiki/30846/history.html +++ b/groups.io/g/MTFHRT/wiki/30846/history.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774003.1713918438122765430"); + console.log("client_id:", "web.web08.237006.1714523377966153663"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774003.1713918438122765430" + client_id: "web.web08.237006.1714523377966153663" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -743,6 +1068,10 @@ function createAlert(msg, isError, autoClose, noClose) { </form> <script type="text/javascript"> +contentLoaded(false, function() { + + UpdateSidebar("wiki"); +}); function countChecked(id) { var checkedVal = 0; @@ -769,20 +1098,20 @@ function countChecked(id) { } </script> + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -792,9 +1121,7 @@ function countChecked(id) { </div> </div> - - @@ -823,48 +1150,43 @@ function countChecked(id) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -879,13 +1201,17 @@ function countChecked(id) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -907,7 +1233,7 @@ function countChecked(id) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -928,138 +1254,144 @@ function countChecked(id) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1081,6 +1413,21 @@ function countChecked(id) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/32288.html b/groups.io/g/MTFHRT/wiki/32288.html index 195cd3ef..f42170d7 100644 --- a/groups.io/g/MTFHRT/wiki/32288.html +++ b/groups.io/g/MTFHRT/wiki/32288.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774515.1713918438404139241"); + console.log("client_id:", "web.web09.236590.1714523377689752164"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774515.1713918438404139241" + client_id: "web.web09.236590.1714523377689752164" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> How to measure melting point of most organic powders using typical household items.</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> How to measure melting point of most organic powders using typical household items.</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,62 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated32288"> - $('#timedispupdated32288').replaceWith(DisplayShortTime(1666754939519775143, false - )); -</script> - · - <a href="32288/history.html"> - 1 revision - </a> -    - <a href="32288.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p>Tools</p> -<ul> -<li>Single-egg frying pan. You can use something bigger, but you'll need more oil.</li> -<li>Half a cup of cooking oil, more for larger pan.</li> -<li>Small metal cap, such as the cap of a beer bottle.</li> -<li>Digital meat/candy themometer. (example: Taylor's folding thermometer's range is -40°C to 230°C)</li> -</ul> -<p>Procedure</p> -<ol> -<li>Place oil in frying pan</li> -<li>Place cap like a little boat in the oil</li> -<li>Place tiny bit of powder on the boat</li> -<li>Suspend probe of thermometer into the oil, but not touching the sides</li> -<li>Double check it's not touching the sides, and is just in the oil</li> -<li>Heat slowly (low, low heat)</li> -<li>Note temp where it 'pauses' briefly while the substance turns to liquid</li> -</ol> -<p> </p> -<p><img src="https://i.imgur.com/LOWBMtc.png" class="myimg-responsive"/></p> -<p><br/>My test today, I was off by 0.2°C from expected value. Absolutely within tolerance. <br/><br/>The above setup can be had for around $10-20 US, if you don't have stuff laying around, and really is 'accurate enough'. </p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -695,25 +970,85 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated32288"> + $('#timedispupdated32288').replaceWith(DisplayShortTime(1666754939519775143, false + )); +</script> + · + <a href="32288/history.html"> + 1 revision + </a> +    + <a href="32288.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p>Tools</p> +<ul> +<li>Single-egg frying pan. You can use something bigger, but you'll need more oil.</li> +<li>Half a cup of cooking oil, more for larger pan.</li> +<li>Small metal cap, such as the cap of a beer bottle.</li> +<li>Digital meat/candy themometer. (example: Taylor's folding thermometer's range is -40°C to 230°C)</li> +</ul> +<p>Procedure</p> +<ol> +<li>Place oil in frying pan</li> +<li>Place cap like a little boat in the oil</li> +<li>Place tiny bit of powder on the boat</li> +<li>Suspend probe of thermometer into the oil, but not touching the sides</li> +<li>Double check it's not touching the sides, and is just in the oil</li> +<li>Heat slowly (low, low heat)</li> +<li>Note temp where it 'pauses' briefly while the substance turns to liquid</li> +</ol> +<p> </p> +<p><img src="https://i.imgur.com/LOWBMtc.png" class="myimg-responsive"/></p> +<p><br/>My test today, I was off by 0.2°C from expected value. Absolutely within tolerance. <br/><br/>The above setup can be had for around $10-20 US, if you don't have stuff laying around, and really is 'accurate enough'. </p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -723,9 +1058,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -754,48 +1087,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -810,13 +1138,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -838,7 +1170,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -859,138 +1191,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1012,6 +1350,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/32288/175560.html b/groups.io/g/MTFHRT/wiki/32288/175560.html new file mode 100644 index 00000000..07f26bcc --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/32288/175560.html @@ -0,0 +1,1375 @@ + + + <!DOCTYPE html> + <html lang="en-US"> + <head> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <meta name="pinterest" content="nopin" /> + <meta name="pinterest" content="nohover" /> + + <meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" /> + <link rel="apple-touch-icon" sizes="57x57" href="https://groups.io/img/org.1/favicons/apple-icon-57x57.png"> + <link rel="apple-touch-icon" sizes="60x60" href="https://groups.io/img/org.1/favicons/apple-icon-60x60.png"> + <link rel="apple-touch-icon" sizes="72x72" href="https://groups.io/img/org.1/favicons/apple-icon-72x72.png"> + <link rel="apple-touch-icon" sizes="76x76" href="https://groups.io/img/org.1/favicons/apple-icon-76x76.png"> + <link rel="apple-touch-icon" sizes="114x114" href="https://groups.io/img/org.1/favicons/apple-icon-114x114.png"> + <link rel="apple-touch-icon" sizes="120x120" href="https://groups.io/img/org.1/favicons/apple-icon-120x120.png"> + <link rel="apple-touch-icon" sizes="144x144" href="https://groups.io/img/org.1/favicons/apple-icon-144x144.png"> + <link rel="apple-touch-icon" sizes="152x152" href="https://groups.io/img/org.1/favicons/apple-icon-152x152.png"> + <link rel="apple-touch-icon" sizes="180x180" href="https://groups.io/img/org.1/favicons/apple-icon-180x180.png"> + <link rel="icon" type="image/png" sizes="192x192" href="../../../../img/org.1/favicons/android-icon-192x192.png"> + <link rel="icon" type="image/png" sizes="32x32" href="../../../../img/org.1/favicons/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="96x96" href="../../../../img/org.1/favicons/favicon-96x96.png"> + <link rel="icon" type="image/png" sizes="16x16" href="../../../../img/org.1/favicons/favicon-16x16.png"> + <link rel="manifest" href="../../../../img/org.1/favicons/manifest.json"> + <meta name="msapplication-TileColor" content="#ffffff"> + <meta name="msapplication-TileImage" content="/ms-icon-144x144.png"> + + + + +<script> +/* stubs */ +const hapticsImpactHeavy = async () => { +}; +const hapticsImpactMedium = async () => { +}; +const hapticsImpactLight = async () => { +}; +const hapticsVibrate = async () => { +}; +const hapticsSelectionStart = async () => { +}; +const hapticsSelectionChanged = async () => { +}; +const hapticsSelectionEnd = async () => { +}; +</script> + + +<script> + + function setPullToRefresh() {} + + function gotoURL(inurl) { + window.location.href = inurl; + return; + } + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); + if (isHTMX == true) { + document.body.addEventListener('htmx:afterSettle', f, {once: true}); + } else { + if (document.readyState !== 'loading') { + console.log('document is already ready, just execute code here'); + f(); + } else { + console.log('document was not ready, place code here'); + document.addEventListener('DOMContentLoaded', f, {once: true}); + } + } + } + + // stub + function logError(data, url, linenumber) { + console.log(data) + return; + } + var pushSubToken; + var ignoreErrors = false; + var lastError = ""; + + window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) { + let column; + let stack; + if (console && console.log) { + console.log("msg:", errorMessage); + console.log("url:", errorUrl); + console.log("line:", errorLine); + if (errorColumn !== undefined && errorObj != null) { + console.log("column:", errorColumn); + column = errorColumn; + } + if (errorObj !== undefined && errorObj != null) { + console.log("stack:", errorObj.stack); + stack = errorObj.stack; + } + console.log("client_id:", "web.web08.237168.1714523381578941836"); + console.log("last_error:", lastError); + console.log("stack:", stack); + } + if (errorUrl == "" || errorUrl === null) { + errorUrl = window.location.href; + } + if (errorMessage.includes("SecurityError:") == true) { + ignoreErrors = true; + } + if (ignoreErrors == true) { + console.log("cookies, disabled, ignoring"); + lastError = errorMessage; + return; + } + jQuery.ajax({ + type: 'POST', + url: '/jsclienterror', + data: { + msg: errorMessage, + url: errorUrl, + line: errorLine, + column: column, + stack: stack, + last_error: lastError, + client_id: "web.web08.237168.1714523381578941836" + }, + success: function() { + if (console && console.log) { + console.log('JS error report successful.'); + } + lastError = errorMessage; + }, + error: function() { + if (console && console.error) { + console.error('JS error report submission failed!'); + } + lastError = errorMessage; + } + }); + return true; + } + +</script> + + + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> + <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> + <script src="../../../../js/run_prettify.js"></script> + <title> + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 1 revision + +    + + + +
+ +
+
+ +
+
+ + +

Tools

+
    +
  • Single-egg frying pan. You can use something bigger, but you'll need more oil.
  • +
  • Half a cup of cooking oil, more for larger pan.
  • +
  • Small metal cap, such as the cap of a beer bottle.
  • +
  • Digital meat/candy themometer. (example: Taylor's folding thermometer's range is -40°C to 230°C)
  • +
+

Procedure

+
    +
  1. Place oil in frying pan
  2. +
  3. Place cap like a little boat in the oil
  4. +
  5. Place tiny bit of powder on the boat
  6. +
  7. Suspend probe of thermometer into the oil, but not touching the sides
  8. +
  9. Double check it's not touching the sides, and is just in the oil
  10. +
  11. Heat slowly (low, low heat)
  12. +
  13. Note temp where it 'pauses' briefly while the substance turns to liquid
  14. +
+

 

+

+


My test today, I was off by 0.2°C from expected value. Absolutely within tolerance.

The above setup can be had for around $10-20 US, if you don't have stuff laying around, and really is 'accurate enough'.

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/32288/history.html b/groups.io/g/MTFHRT/wiki/32288/history.html index a5bdedd0..ce7d016a 100644 --- a/groups.io/g/MTFHRT/wiki/32288/history.html +++ b/groups.io/g/MTFHRT/wiki/32288/history.html @@ -6,7 +6,7 @@ - + @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774136.1713918440803701915"); + console.log("client_id:", "web.web08.237107.1714523380129608427"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774136.1713918440803701915" + client_id: "web.web08.237107.1714523380129608427" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { - + - - + + @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -587,7 +912,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="175560"> + <a href="175560.html"> @@ -613,9 +938,13 @@ function createAlert(msg, isError, autoClose, noClose) { </form> <script type="text/javascript"> +contentLoaded(false, function() { $("#compare").prop("disabled", true); + UpdateSidebar("wiki"); +}); + function countChecked(id) { var checkedVal = 0; var cbs = document.getElementsByTagName('input'); @@ -641,20 +970,20 @@ function countChecked(id) { } </script> + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -664,9 +993,7 @@ function countChecked(id) { </div> </div> - - @@ -695,48 +1022,43 @@ function countChecked(id) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -751,13 +1073,17 @@ function countChecked(id) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -779,7 +1105,7 @@ function countChecked(id) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -800,138 +1126,144 @@ function countChecked(id) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -953,6 +1285,21 @@ function countChecked(id) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/34293.html b/groups.io/g/MTFHRT/wiki/34293.html index 4568a63c..b183bf3c 100644 --- a/groups.io/g/MTFHRT/wiki/34293.html +++ b/groups.io/g/MTFHRT/wiki/34293.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web08.774516.1713918438474946972"); + console.log("client_id:", "web.web08.236996.1714523377772569675"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web08.774516.1713918438474946972" + client_id: "web.web08.236996.1714523377772569675" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> steam sterilization</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> steam sterilization</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,48 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated34293"> - $('#timedispupdated34293').replaceWith(DisplayShortTime(1710077412941562435, false - )); -</script> - · - <a href="34293/history.html"> - 5 revisions - </a> -    - <a href="34293.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p>An article on pharmaceutical engineering says: <span style="background-color: #ff99cc;">Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature. From the saturated steam table mentioned above, one can see that it takes 419 kJ/kg (180 Btu/lb) to heat water from 0°C to 100°C (32°F to 212°F). This is the enthalpy of water (hl). It takes an additional 2,257 kJ/kg (970 Btu/lb) to create steam at atmospheric pressure (100°C or 212°F). This additional energy stored in the steam is the enthalpy of vaporization (he), and is the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.</span></p> -<p>The energy that article talks about is thermal energy. If you pour dry powder into a vial, seal the stopper and heat the vial, the heat is conducted from the glass into the powder quite slowly because heat conduction in unmoving dry powder (with air between particles) is slow. After half hour heating, part of the powder remains relatively cold, unsterilized. The sterilization time begins when everything is heated enough - it's why the talk about "energy transfer".</p> -<p>Thermal energy can be transferred by condensation of steam (as explained in the quote above) or by <a href="https://en.wikipedia.org/wiki/Heat_transfer#Mechanisms" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">conduction, radiation or convection</span></a>. Conduction is indeed quite slow. Convection of dry air transfers thermal energy not enough fast. However, the author of that article talks about a "steam autoclave" implying that the water boiling in one part of the autoclave is not in direct contact with the items intended to be sterilized. If a vial is submerged in boiling water, convection in boiling water transfers thermal energy into the vial very, very much faster. If the vial contains a solution instead of a dry powder, the solution inside the vial also convects, the thermal energy is quickly transferred to every part of the solution, so if you submerge the vial in water boiling in a 15 PSI (or 100 kPa) pressure cooker then entire solution in the vial is quickly heated to 121°C.</p> -<p>I was asked "how quickly?". I did an experiment with viscous Castor oil (slow convection) and a digital thermometer with long thin sharp probe. I mixed 10 ml of solution with Castor oil and 2% benzyl alcohol in a vial, sealed and crimped the vial, pierced the rubber stopper with the probe (so that the thermo-sensitive end of the probe was at the center of the solution in the vial) and plunged most, but not all height of the vial into water boiling in a pot (so that the probe didn't touch the water). The numbers the thermometer indicated rose from 26°C to 95°C during 4.5 min. Then I cooled the probe in cold tap water to 16°C and plunged the probe directly into boiling water. The numbers rose to 95°C during 0.5 min (because the probe with metal coating has thermal inertia).</p> -<p>The <a href="https://www.amazon.com/EustomA-Autoclave-Temperature-Pressure-Equipment/dp/B09CPSFMXZ/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">XFS-260</span></a> autoclave I use is similar to a pressure cooker, but has two bowls. The inner bowl is made of thin stainless steel. I pour water into the outer bowl up to slightly above the bottom of the inner bowl, and pour water into the inner bowl too. So, vials are submerged in water boiling at 129°C (under pressure 24 PSI). Thermal energy is quickly transferred by convection into every part of the solution inside the vials.</p> -<p>Officially 121°C for <span style="text-decoration: underline;"><a href="https://www.pharmacy180.com/article/sterilization-considerations--656/" target="_blank" rel="nofollow noopener">8 minutes</a></span> is enough. Add 4 min for heat transfer into the vial. 30 min is overkill I added before the experiment to be sure that the temperature 121°C is reached inside the vial too. For 100°C the <span style="text-decoration: underline;"><a href="https://web.archive.org/web/20070203042243/http://www.cip.ukcentre.com/fo.htm" target="_blank" rel="nofollow noopener">theory</a></span> says longer time is required, but the heat-resistant pathogenic bacteria (tetanus, botulism) are anaerobic, oxygen containing in the air inside the vial is a poison for them, and the waterless solution is not nutritious for them (unlike canned meat).</p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -681,25 +970,71 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated34293"> + $('#timedispupdated34293').replaceWith(DisplayShortTime(1710077412941562435, false + )); +</script> + · + <a href="34293/history.html"> + 5 revisions + </a> +    + <a href="34293.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p>An article on pharmaceutical engineering says: <span style="background-color: #ff99cc;">Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature. From the saturated steam table mentioned above, one can see that it takes 419 kJ/kg (180 Btu/lb) to heat water from 0°C to 100°C (32°F to 212°F). This is the enthalpy of water (hl). It takes an additional 2,257 kJ/kg (970 Btu/lb) to create steam at atmospheric pressure (100°C or 212°F). This additional energy stored in the steam is the enthalpy of vaporization (he), and is the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.</span></p> +<p>The energy that article talks about is thermal energy. If you pour dry powder into a vial, seal the stopper and heat the vial, the heat is conducted from the glass into the powder quite slowly because heat conduction in unmoving dry powder (with air between particles) is slow. After half hour heating, part of the powder remains relatively cold, unsterilized. The sterilization time begins when everything is heated enough - it's why the talk about "energy transfer".</p> +<p>Thermal energy can be transferred by condensation of steam (as explained in the quote above) or by <a href="https://en.wikipedia.org/wiki/Heat_transfer#Mechanisms" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">conduction, radiation or convection</span></a>. Conduction is indeed quite slow. Convection of dry air transfers thermal energy not enough fast. However, the author of that article talks about a "steam autoclave" implying that the water boiling in one part of the autoclave is not in direct contact with the items intended to be sterilized. If a vial is submerged in boiling water, convection in boiling water transfers thermal energy into the vial very, very much faster. If the vial contains a solution instead of a dry powder, the solution inside the vial also convects, the thermal energy is quickly transferred to every part of the solution, so if you submerge the vial in water boiling in a 15 PSI (or 100 kPa) pressure cooker then entire solution in the vial is quickly heated to 121°C.</p> +<p>I was asked "how quickly?". I did an experiment with viscous Castor oil (slow convection) and a digital thermometer with long thin sharp probe. I mixed 10 ml of solution with Castor oil and 2% benzyl alcohol in a vial, sealed and crimped the vial, pierced the rubber stopper with the probe (so that the thermo-sensitive end of the probe was at the center of the solution in the vial) and plunged most, but not all height of the vial into water boiling in a pot (so that the probe didn't touch the water). The numbers the thermometer indicated rose from 26°C to 95°C during 4.5 min. Then I cooled the probe in cold tap water to 16°C and plunged the probe directly into boiling water. The numbers rose to 95°C during 0.5 min (because the probe with metal coating has thermal inertia).</p> +<p>The <a href="https://www.amazon.com/EustomA-Autoclave-Temperature-Pressure-Equipment/dp/B09CPSFMXZ/" target="_blank" rel="nofollow noopener"><span style="text-decoration: underline;">XFS-260</span></a> autoclave I use is similar to a pressure cooker, but has two bowls. The inner bowl is made of thin stainless steel. I pour water into the outer bowl up to slightly above the bottom of the inner bowl, and pour water into the inner bowl too. So, vials are submerged in water boiling at 129°C (under pressure 24 PSI). Thermal energy is quickly transferred by convection into every part of the solution inside the vials.</p> +<p>Officially 121°C for <span style="text-decoration: underline;"><a href="https://www.pharmacy180.com/article/sterilization-considerations--656/" target="_blank" rel="nofollow noopener">8 minutes</a></span> is enough. Add 4 min for heat transfer into the vial. 30 min is overkill I added before the experiment to be sure that the temperature 121°C is reached inside the vial too. For 100°C the <span style="text-decoration: underline;"><a href="https://web.archive.org/web/20070203042243/http://www.cip.ukcentre.com/fo.htm" target="_blank" rel="nofollow noopener">theory</a></span> says longer time is required, but the heat-resistant pathogenic bacteria (tetanus, botulism) are anaerobic, oxygen containing in the air inside the vial is a poison for them, and the waterless solution is not nutritious for them (unlike canned meat).</p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -709,9 +1044,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -740,48 +1073,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -796,13 +1124,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -824,7 +1156,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -845,138 +1177,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -998,6 +1336,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/34293/189320.html b/groups.io/g/MTFHRT/wiki/34293/189320.html new file mode 100644 index 00000000..52400c55 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/34293/189320.html @@ -0,0 +1,1360 @@ + + + <!DOCTYPE html> + <html lang="en-US"> + <head> + <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <meta name="pinterest" content="nopin" /> + <meta name="pinterest" content="nohover" /> + + <meta name="3778517eb4810dfb5d143ed8f1b359b3b5a82923" content="0f56257c3db4a222e91b11bc6871c4df2e263b28" /> + <link rel="apple-touch-icon" sizes="57x57" href="https://groups.io/img/org.1/favicons/apple-icon-57x57.png"> + <link rel="apple-touch-icon" sizes="60x60" href="https://groups.io/img/org.1/favicons/apple-icon-60x60.png"> + <link rel="apple-touch-icon" sizes="72x72" href="https://groups.io/img/org.1/favicons/apple-icon-72x72.png"> + <link rel="apple-touch-icon" sizes="76x76" href="https://groups.io/img/org.1/favicons/apple-icon-76x76.png"> + <link rel="apple-touch-icon" sizes="114x114" href="https://groups.io/img/org.1/favicons/apple-icon-114x114.png"> + <link rel="apple-touch-icon" sizes="120x120" href="https://groups.io/img/org.1/favicons/apple-icon-120x120.png"> + <link rel="apple-touch-icon" sizes="144x144" href="https://groups.io/img/org.1/favicons/apple-icon-144x144.png"> + <link rel="apple-touch-icon" sizes="152x152" href="https://groups.io/img/org.1/favicons/apple-icon-152x152.png"> + <link rel="apple-touch-icon" sizes="180x180" href="https://groups.io/img/org.1/favicons/apple-icon-180x180.png"> + <link rel="icon" type="image/png" sizes="192x192" href="../../../../img/org.1/favicons/android-icon-192x192.png"> + <link rel="icon" type="image/png" sizes="32x32" href="../../../../img/org.1/favicons/favicon-32x32.png"> + <link rel="icon" type="image/png" sizes="96x96" href="../../../../img/org.1/favicons/favicon-96x96.png"> + <link rel="icon" type="image/png" sizes="16x16" href="../../../../img/org.1/favicons/favicon-16x16.png"> + <link rel="manifest" href="../../../../img/org.1/favicons/manifest.json"> + <meta name="msapplication-TileColor" content="#ffffff"> + <meta name="msapplication-TileImage" content="/ms-icon-144x144.png"> + + + + +<script> +/* stubs */ +const hapticsImpactHeavy = async () => { +}; +const hapticsImpactMedium = async () => { +}; +const hapticsImpactLight = async () => { +}; +const hapticsVibrate = async () => { +}; +const hapticsSelectionStart = async () => { +}; +const hapticsSelectionChanged = async () => { +}; +const hapticsSelectionEnd = async () => { +}; +</script> + + +<script> + + function setPullToRefresh() {} + + function gotoURL(inurl) { + window.location.href = inurl; + return; + } + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); + if (isHTMX == true) { + document.body.addEventListener('htmx:afterSettle', f, {once: true}); + } else { + if (document.readyState !== 'loading') { + console.log('document is already ready, just execute code here'); + f(); + } else { + console.log('document was not ready, place code here'); + document.addEventListener('DOMContentLoaded', f, {once: true}); + } + } + } + + // stub + function logError(data, url, linenumber) { + console.log(data) + return; + } + var pushSubToken; + var ignoreErrors = false; + var lastError = ""; + + window.onerror = function(errorMessage, errorUrl, errorLine, errorColumn, errorObj) { + let column; + let stack; + if (console && console.log) { + console.log("msg:", errorMessage); + console.log("url:", errorUrl); + console.log("line:", errorLine); + if (errorColumn !== undefined && errorObj != null) { + console.log("column:", errorColumn); + column = errorColumn; + } + if (errorObj !== undefined && errorObj != null) { + console.log("stack:", errorObj.stack); + stack = errorObj.stack; + } + console.log("client_id:", "web.web09.236792.1714523382009518856"); + console.log("last_error:", lastError); + console.log("stack:", stack); + } + if (errorUrl == "" || errorUrl === null) { + errorUrl = window.location.href; + } + if (errorMessage.includes("SecurityError:") == true) { + ignoreErrors = true; + } + if (ignoreErrors == true) { + console.log("cookies, disabled, ignoring"); + lastError = errorMessage; + return; + } + jQuery.ajax({ + type: 'POST', + url: '/jsclienterror', + data: { + msg: errorMessage, + url: errorUrl, + line: errorLine, + column: column, + stack: stack, + last_error: lastError, + client_id: "web.web09.236792.1714523382009518856" + }, + success: function() { + if (console && console.log) { + console.log('JS error report successful.'); + } + lastError = errorMessage; + }, + error: function() { + if (console && console.error) { + console.error('JS error report submission failed!'); + } + lastError = errorMessage; + } + }); + return true; + } + +</script> + + + <script src="../../../../tinymce-5.10.9/tinymce.min.js"></script> + <script src="../../../../js/browser-image-compression-2.0.2.min.js"></script> + <link href="../../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> + <script src="../../../../js/run_prettify.js"></script> + <title> + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

An article on pharmaceutical engineering says: Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature. From the saturated steam table mentioned above, one can see that it takes 419 kJ/kg (180 Btu/lb) to heat water from 0°C to 100°C (32°F to 212°F). This is the enthalpy of water (hl). It takes an additional 2,257 kJ/kg (970 Btu/lb) to create steam at atmospheric pressure (100°C or 212°F). This additional energy stored in the steam is the enthalpy of vaporization (he), and is the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.

+

The energy that article talks about is thermal energy. If you pour dry powder into a vial, seal the stopper and heat the vial, the heat is conducted from the glass into the powder quite slowly because heat conduction in unmoving dry powder (with air between particles) is slow. After half hour heating, part of the powder remains relatively cold, unsterilized. The sterilization time begins when everything is heated enough - it's why the talk about "energy transfer".

+

Thermal energy can be transferred by condensation of steam (as explained in the quote above) or by conduction, radiation or convection. Conduction is indeed quite slow. Convection of dry air transfers thermal energy not enough fast. However, the author of that article talks about a "steam autoclave" implying that the water boiling in one part of the autoclave is not in direct contact with the items intended to be sterilized. If a vial is submerged in boiling water, convection in boiling water transfers thermal energy into the vial very, very much faster. If the vial contains a solution instead of a dry powder, the solution inside the vial also convects, the thermal energy is quickly transferred to every part of the solution, so if you submerge the vial in water boiling in a 15 PSI (or 100 kPa) pressure cooker then entire solution in the vial is quickly heated to 121°C.

+

The XFS-260 autoclave I use is similar to a pressure cooker, but has two bowls. The inner bowl is made of thin stainless steel. I pour water into the outer bowl up to slightly above the bottom of the inner bowl, and pour water into the inner bowl too. So, vials are submerged in water boiling at 129°C (under pressure 24 PSI). Thermal energy is quickly transferred by convection into every part of the solution inside the vials.

+

Officially 121°C for 8 minutes is enough. 30 min is overkill and to be sure that the temperature 121°C is reached inside the vial too. For 100°C the theory says longer time is required, but the heat-resistant pathogenic bacteria (tetanus, botulism) are anaerobic, oxygen containing in the air inside the vial is a poison for them.

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/34293/189648.html b/groups.io/g/MTFHRT/wiki/34293/189648.html new file mode 100644 index 00000000..09a3c832 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/34293/189648.html @@ -0,0 +1,1360 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

An article on pharmaceutical engineering says: Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature. From the saturated steam table mentioned above, one can see that it takes 419 kJ/kg (180 Btu/lb) to heat water from 0°C to 100°C (32°F to 212°F). This is the enthalpy of water (hl). It takes an additional 2,257 kJ/kg (970 Btu/lb) to create steam at atmospheric pressure (100°C or 212°F). This additional energy stored in the steam is the enthalpy of vaporization (he), and is the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.

+

The energy that article talks about is thermal energy. If you pour dry powder into a vial, seal the stopper and heat the vial, the heat is conducted from the glass into the powder quite slowly because heat conduction in unmoving dry powder (with air between particles) is slow. After half hour heating, part of the powder remains relatively cold, unsterilized. The sterilization time begins when everything is heated enough - it's why the talk about "energy transfer".

+

Thermal energy can be transferred by condensation of steam (as explained in the quote above) or by conduction, radiation or convection. Conduction is indeed quite slow. Convection of dry air transfers thermal energy not enough fast. However, the author of that article talks about a "steam autoclave" implying that the water boiling in one part of the autoclave is not in direct contact with the items intended to be sterilized. If a vial is submerged in boiling water, convection in boiling water transfers thermal energy into the vial very, very much faster. If the vial contains a solution instead of a dry powder, the solution inside the vial also convects, the thermal energy is quickly transferred to every part of the solution, so if you submerge the vial in water boiling in a 15 PSI (or 100 kPa) pressure cooker then entire solution in the vial is quickly heated to 121°C.

+

The XFS-260 autoclave I use is similar to a pressure cooker, but has two bowls. The inner bowl is made of thin stainless steel. I pour water into the outer bowl up to slightly above the bottom of the inner bowl, and pour water into the inner bowl too. So, vials are submerged in water boiling at 129°C (under pressure 24 PSI). Thermal energy is quickly transferred by convection into every part of the solution inside the vials.

+

Officially 121°C for 8 minutes is enough. 30 min is overkill and to be sure that the temperature 121°C is reached inside the vial too. For 100°C the theory says longer time is required, but the heat-resistant pathogenic bacteria (tetanus, botulism) are anaerobic, oxygen containing in the air inside the vial is a poison for them.

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/34293/201261.html b/groups.io/g/MTFHRT/wiki/34293/201261.html new file mode 100644 index 00000000..93c4e6e5 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/34293/201261.html @@ -0,0 +1,1361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

An article on pharmaceutical engineering says: Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature. From the saturated steam table mentioned above, one can see that it takes 419 kJ/kg (180 Btu/lb) to heat water from 0°C to 100°C (32°F to 212°F). This is the enthalpy of water (hl). It takes an additional 2,257 kJ/kg (970 Btu/lb) to create steam at atmospheric pressure (100°C or 212°F). This additional energy stored in the steam is the enthalpy of vaporization (he), and is the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.

+

The energy that article talks about is thermal energy. If you pour dry powder into a vial, seal the stopper and heat the vial, the heat is conducted from the glass into the powder quite slowly because heat conduction in unmoving dry powder (with air between particles) is slow. After half hour heating, part of the powder remains relatively cold, unsterilized. The sterilization time begins when everything is heated enough - it's why the talk about "energy transfer".

+

Thermal energy can be transferred by condensation of steam (as explained in the quote above) or by conduction, radiation or convection. Conduction is indeed quite slow. Convection of dry air transfers thermal energy not enough fast. However, the author of that article talks about a "steam autoclave" implying that the water boiling in one part of the autoclave is not in direct contact with the items intended to be sterilized. If a vial is submerged in boiling water, convection in boiling water transfers thermal energy into the vial very, very much faster. If the vial contains a solution instead of a dry powder, the solution inside the vial also convects, the thermal energy is quickly transferred to every part of the solution, so if you submerge the vial in water boiling in a 15 PSI (or 100 kPa) pressure cooker then entire solution in the vial is quickly heated to 121°C.

+

I was asked "how quickly?". I did an experiment with Castor oil (slow convection) and a digital thermometer with long thin sharp probe. I mixed 10 ml of solution with Castor oil and 2% benzyl alcohol in a vial, sealed and crimped the vial, pierced the rubber stopper with the probe (so that the thermo-sensitive end of the probe was at the center of the solution in the vial) and plunged the vial into water boiling in a pot. The numbers the thermometer indicated rose from 26°C to 95°C during 4.5 min. Then I cooled the probe in cold tap water to 16°C and plunged the probe directly into boiling water. The numbers rose to 95°C during 0.5 min (because the probe with metal coating has thermal inertia).

+

The XFS-260 autoclave I use is similar to a pressure cooker, but has two bowls. The inner bowl is made of thin stainless steel. I pour water into the outer bowl up to slightly above the bottom of the inner bowl, and pour water into the inner bowl too. So, vials are submerged in water boiling at 129°C (under pressure 24 PSI). Thermal energy is quickly transferred by convection into every part of the solution inside the vials.

+

Officially 121°C for 8 minutes is enough. Add 4 min for heat transfer into the vial. 30 min is overkill I added before the experiment to be sure that the temperature 121°C is reached inside the vial too. For 100°C the theory says longer time is required, but the heat-resistant pathogenic bacteria (tetanus, botulism) are anaerobic, oxygen containing in the air inside the vial is a poison for them, and the waterless solution is not nutritious for them (unlike canned meat).

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/34293/201262.html b/groups.io/g/MTFHRT/wiki/34293/201262.html new file mode 100644 index 00000000..6d103855 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/34293/201262.html @@ -0,0 +1,1361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

An article on pharmaceutical engineering says: Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature. From the saturated steam table mentioned above, one can see that it takes 419 kJ/kg (180 Btu/lb) to heat water from 0°C to 100°C (32°F to 212°F). This is the enthalpy of water (hl). It takes an additional 2,257 kJ/kg (970 Btu/lb) to create steam at atmospheric pressure (100°C or 212°F). This additional energy stored in the steam is the enthalpy of vaporization (he), and is the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.

+

The energy that article talks about is thermal energy. If you pour dry powder into a vial, seal the stopper and heat the vial, the heat is conducted from the glass into the powder quite slowly because heat conduction in unmoving dry powder (with air between particles) is slow. After half hour heating, part of the powder remains relatively cold, unsterilized. The sterilization time begins when everything is heated enough - it's why the talk about "energy transfer".

+

Thermal energy can be transferred by condensation of steam (as explained in the quote above) or by conduction, radiation or convection. Conduction is indeed quite slow. Convection of dry air transfers thermal energy not enough fast. However, the author of that article talks about a "steam autoclave" implying that the water boiling in one part of the autoclave is not in direct contact with the items intended to be sterilized. If a vial is submerged in boiling water, convection in boiling water transfers thermal energy into the vial very, very much faster. If the vial contains a solution instead of a dry powder, the solution inside the vial also convects, the thermal energy is quickly transferred to every part of the solution, so if you submerge the vial in water boiling in a 15 PSI (or 100 kPa) pressure cooker then entire solution in the vial is quickly heated to 121°C.

+

I was asked "how quickly?". I did an experiment with viscous Castor oil (slow convection) and a digital thermometer with long thin sharp probe. I mixed 10 ml of solution with Castor oil and 2% benzyl alcohol in a vial, sealed and crimped the vial, pierced the rubber stopper with the probe (so that the thermo-sensitive end of the probe was at the center of the solution in the vial) and plunged the vial into water boiling in a pot. The numbers the thermometer indicated rose from 26°C to 95°C during 4.5 min. Then I cooled the probe in cold tap water to 16°C and plunged the probe directly into boiling water. The numbers rose to 95°C during 0.5 min (because the probe with metal coating has thermal inertia).

+

The XFS-260 autoclave I use is similar to a pressure cooker, but has two bowls. The inner bowl is made of thin stainless steel. I pour water into the outer bowl up to slightly above the bottom of the inner bowl, and pour water into the inner bowl too. So, vials are submerged in water boiling at 129°C (under pressure 24 PSI). Thermal energy is quickly transferred by convection into every part of the solution inside the vials.

+

Officially 121°C for 8 minutes is enough. Add 4 min for heat transfer into the vial. 30 min is overkill I added before the experiment to be sure that the temperature 121°C is reached inside the vial too. For 100°C the theory says longer time is required, but the heat-resistant pathogenic bacteria (tetanus, botulism) are anaerobic, oxygen containing in the air inside the vial is a poison for them, and the waterless solution is not nutritious for them (unlike canned meat).

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/34293/201265.html b/groups.io/g/MTFHRT/wiki/34293/201265.html new file mode 100644 index 00000000..bdb39f77 --- /dev/null +++ b/groups.io/g/MTFHRT/wiki/34293/201265.html @@ -0,0 +1,1361 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MTFHRT@groups.io | Wiki + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+
+
+
+ + + + + + Home + + + + + + + + + + + + + + + Messages + + + + + + + + + + + + + Hashtags + + + + + + + + + + + + + + + + + + + + + + + + + + + + Wiki + + + + + + + +
+
+ +
+
+ ctrl + shift + ? for shortcuts +
+ + +
+ © 2024 Groups.io +
+
+ +
+
+
+
+
+ + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + +
+ Last edited + + · + + 5 revisions + +    + + + +
+ +
+
+ +
+
+ + +

An article on pharmaceutical engineering says: Direct steam contact with the surface of the object to be sterilized is required for the steam to transfer its stored energy to the object. Without direct steam contact to all surfaces, the item will not be sterilized. The amount of energy stored in steam is much higher than dry air or water at the same temperature. From the saturated steam table mentioned above, one can see that it takes 419 kJ/kg (180 Btu/lb) to heat water from 0°C to 100°C (32°F to 212°F). This is the enthalpy of water (hl). It takes an additional 2,257 kJ/kg (970 Btu/lb) to create steam at atmospheric pressure (100°C or 212°F). This additional energy stored in the steam is the enthalpy of vaporization (he), and is the key to steam sterilization. In order for the steam to transfer its stored energy, it must condense on the surface of the object being sterilized.

+

The energy that article talks about is thermal energy. If you pour dry powder into a vial, seal the stopper and heat the vial, the heat is conducted from the glass into the powder quite slowly because heat conduction in unmoving dry powder (with air between particles) is slow. After half hour heating, part of the powder remains relatively cold, unsterilized. The sterilization time begins when everything is heated enough - it's why the talk about "energy transfer".

+

Thermal energy can be transferred by condensation of steam (as explained in the quote above) or by conduction, radiation or convection. Conduction is indeed quite slow. Convection of dry air transfers thermal energy not enough fast. However, the author of that article talks about a "steam autoclave" implying that the water boiling in one part of the autoclave is not in direct contact with the items intended to be sterilized. If a vial is submerged in boiling water, convection in boiling water transfers thermal energy into the vial very, very much faster. If the vial contains a solution instead of a dry powder, the solution inside the vial also convects, the thermal energy is quickly transferred to every part of the solution, so if you submerge the vial in water boiling in a 15 PSI (or 100 kPa) pressure cooker then entire solution in the vial is quickly heated to 121°C.

+

I was asked "how quickly?". I did an experiment with viscous Castor oil (slow convection) and a digital thermometer with long thin sharp probe. I mixed 10 ml of solution with Castor oil and 2% benzyl alcohol in a vial, sealed and crimped the vial, pierced the rubber stopper with the probe (so that the thermo-sensitive end of the probe was at the center of the solution in the vial) and plunged most, but not all height of the vial into water boiling in a pot (so that the probe didn't touch the water). The numbers the thermometer indicated rose from 26°C to 95°C during 4.5 min. Then I cooled the probe in cold tap water to 16°C and plunged the probe directly into boiling water. The numbers rose to 95°C during 0.5 min (because the probe with metal coating has thermal inertia).

+

The XFS-260 autoclave I use is similar to a pressure cooker, but has two bowls. The inner bowl is made of thin stainless steel. I pour water into the outer bowl up to slightly above the bottom of the inner bowl, and pour water into the inner bowl too. So, vials are submerged in water boiling at 129°C (under pressure 24 PSI). Thermal energy is quickly transferred by convection into every part of the solution inside the vials.

+

Officially 121°C for 8 minutes is enough. Add 4 min for heat transfer into the vial. 30 min is overkill I added before the experiment to be sure that the temperature 121°C is reached inside the vial too. For 100°C the theory says longer time is required, but the heat-resistant pathogenic bacteria (tetanus, botulism) are anaerobic, oxygen containing in the air inside the vial is a poison for them, and the waterless solution is not nutritious for them (unlike canned meat).

+

+ + +

+ +
+
+
+ +
+
+ + + + +
+
+
+
+
+ +
+ + + + + + + + + + +
+ + + + + + + + + + + diff --git a/groups.io/g/MTFHRT/wiki/34293/history.html b/groups.io/g/MTFHRT/wiki/34293/history.html index f39ac7e6..77f5a29e 100644 --- a/groups.io/g/MTFHRT/wiki/34293/history.html +++ b/groups.io/g/MTFHRT/wiki/34293/history.html @@ -6,7 +6,7 @@ - + @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.774140.1713918440869044397"); + console.log("client_id:", "web.web09.236707.1714523380214868453"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.774140.1713918440869044397" + client_id: "web.web09.236707.1714523380214868453" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { - + - - + + @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -589,7 +914,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="201265"> + <a href="201265.html"> @@ -623,7 +948,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="201262"> + <a href="201262.html"> @@ -657,7 +982,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="201261"> + <a href="201261.html"> @@ -691,7 +1016,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="189648"> + <a href="189648.html"> @@ -725,7 +1050,7 @@ function createAlert(msg, isError, autoClose, noClose) { </td> <td> - <a href="189320"> + <a href="189320.html"> @@ -751,6 +1076,10 @@ function createAlert(msg, isError, autoClose, noClose) { </form> <script type="text/javascript"> +contentLoaded(false, function() { + + UpdateSidebar("wiki"); +}); function countChecked(id) { var checkedVal = 0; @@ -777,20 +1106,20 @@ function countChecked(id) { } </script> + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -800,9 +1129,7 @@ function countChecked(id) { </div> </div> - - @@ -831,48 +1158,43 @@ function countChecked(id) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -887,13 +1209,17 @@ function countChecked(id) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -915,7 +1241,7 @@ function countChecked(id) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -936,138 +1262,144 @@ function countChecked(id) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1089,6 +1421,21 @@ function countChecked(id) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/g/MTFHRT/wiki/index.html b/groups.io/g/MTFHRT/wiki/index.html index 4bba66c7..9bb86db6 100644 --- a/groups.io/g/MTFHRT/wiki/index.html +++ b/groups.io/g/MTFHRT/wiki/index.html @@ -6,7 +6,7 @@ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="pinterest" content="nopin" /> <meta name="pinterest" content="nohover" /> @@ -59,9 +59,8 @@ const hapticsSelectionEnd = async () => { window.location.href = inurl; return; } - - function contentLoaded(isHTMX, f) { - console.log("contentLoaded: " + isHTMX); + function contentLoaded(isHTMX, f, caller = "") { + console.log("contentLoaded: " + isHTMX + " " + caller); if (isHTMX == true) { document.body.addEventListener('htmx:afterSettle', f, {once: true}); } else { @@ -99,8 +98,9 @@ const hapticsSelectionEnd = async () => { console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.web09.773957.1713918437143156791"); + console.log("client_id:", "web.web09.236474.1714523376224101645"); console.log("last_error:", lastError); + console.log("stack:", stack); } if (errorUrl == "" || errorUrl === null) { errorUrl = window.location.href; @@ -123,7 +123,7 @@ const hapticsSelectionEnd = async () => { column: column, stack: stack, last_error: lastError, - client_id: "web.web09.773957.1713918437143156791" + client_id: "web.web09.236474.1714523376224101645" }, success: function() { if (console && console.log) { @@ -144,10 +144,10 @@ const hapticsSelectionEnd = async () => { </script> - <script src="../../../tinymce-4.7.13/tinymce.min.js"></script> + <script src="../../../tinymce-5.10.9/tinymce.min.js"></script> <script src="../../../js/browser-image-compression-2.0.2.min.js"></script> - <link href="../../../css/application-e223b9cc72bae00ecc93c35c77a729b2.css" rel="stylesheet" id="groupsio-css"> - <script src="../../../js/application-6b3b1791facc58d99b1e9c143e69bd45.js" id="groupsio-js"></script> + <link href="../../../css/application-0fdc8fb7b212ef119ea05f76b6c42703.css" rel="stylesheet" id="groupsio-css"> + <script src="../../../js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js" id="groupsio-js"></script> <script src="../../../js/run_prettify.js"></script> <title> @@ -164,10 +164,24 @@ const hapticsSelectionEnd = async () => { +<script> + htmx.config.scrollBehavior = "instant"; + htmx.config.historyCacheSize = 0; + htmx.config.defaultSettleDelay = 0; + console.log("FULL PAGE LOAD"); +</script> </head> - <body class="fuelux" hx-headers='{"Accept-Version": "1ebf4951efb00d946a5fc7b821fff971e62f1ef8"}' hx-ext="preload"> + <body id="body" class="" hx-headers='{"Accept-Version": "7efa45c3c9d9df5d5c891fb6d7c86572635ba331"}' hx-ext="preload" hx-boost="false"> - <div class="navbar navbar-head" role="navigation" id="headerbar"> + <script> + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + document.body.classList.add('dark-mode'); + } + </script> + + + + <div class="navbar navbar-head navbar-fixed-top" role="navigation" id="headerbar"> <div class="container-fluid" style="padding-left:0px;"> <a href="https://groups.io" class="navbar-left"> <img src="../../../img/org.1/mainlogo.png" height="50" alt="Groups.io"> @@ -176,7 +190,6 @@ const hapticsSelectionEnd = async () => { <ul class="nav navbar-nav hidden-xs"> <li> <a href="https://groups.io/search"> - <i class="fa fa-search"></i> Find or Create a Group </a> </li> @@ -235,7 +248,6 @@ const hapticsSelectionEnd = async () => { </li> <li> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> Help </a> </li> @@ -279,7 +291,7 @@ const hapticsSelectionEnd = async () => { <li class="noborderitem list-group-item"> <a href="https://groups.io/helpcenter" target="_blank"> - <i class="fa-fw fa fa-info-circle"></i> + <i class="fa-fw fa fa-question-circle"></i> Help </a> </li> @@ -332,11 +344,151 @@ const hapticsSelectionEnd = async () => { </div> </div> +<script> +var groupnavigatorData = [ + +]; +</script> + + +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="groupnavigatorModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="groupnavigatorInput" placeholder="Go to group..." style="margin-bottom:10px"> + <div id="groupnavigatorContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + +<script> +// Keep track of the currently selected index +var selectedIndex = -1; + +// Function to highlight the matched substring +function highlightSubstring(str, substring) { + var index = str.toLowerCase().indexOf(substring.toLowerCase()); + if (index !== -1) { + var before = str.substring(0, index); + var middle = str.substring(index, index + substring.length); + var after = str.substring(index + substring.length); + return before + '<span class="autocomplete-highlight">' + middle + '</span>' + after; + } + return str; +} + +// Function to highlight the selected item and ensure it is visible in the scrollable list +function highlightSelectedItem(modalName) { + var listContainer = document.getElementById(modalName + 'Container'); + var items = document.getElementsByClassName(modalName + '-list-item'); + Array.from(items).forEach(function(item, idx) { + item.className = idx === selectedIndex ? modalName + '-list-item autocomplete-list-item btn-primary no-hover' : modalName + '-list-item autocomplete-list-item no-hover'; // Apply btn-primary class to the selected item + }); + if (items.length > 0 && selectedIndex >= 0) { + var selectedItem = items[selectedIndex]; + var containerTop = listContainer.scrollTop; + var containerBottom = containerTop + listContainer.clientHeight; + var itemTop = selectedItem.offsetTop; + var itemBottom = itemTop + selectedItem.offsetHeight; + const fudge = 59; + if (selectedIndex > 0 && itemTop > containerBottom) { + // If there are items below the selected item and the selected item is not fully visible, scroll down + listContainer.scrollTop = itemTop - listContainer.clientHeight + items[selectedIndex - 1].offsetHeight; + } else if (selectedIndex < items.length - 1 && (itemTop - fudge) < containerTop) { + // If there are items above the selected item and the selected item is not fully visible, scroll up + listContainer.scrollTop = itemTop - fudge - items[selectedIndex + 1].offsetHeight; + } + } +} + +// function to populate the list based on the input +function populateList(modalName, data) { + var input = document.getElementById(modalName+'Input').value; + var listContainer = document.getElementById(modalName+'Container'); + listContainer.innerHTML = ''; + data.forEach(function(item) { + if (item.name.toLowerCase().includes(input.toLowerCase())) { + var div = document.createElement('div'); + div.innerHTML = highlightSubstring(item.name, input); + div.className = modalName+'-list-item autocomplete-list-item no-hover'; // Apply no-hover class + div.addEventListener('click', function() { + // Navigate to the specified URL when a list item is clicked + window.location.href = item.url; + }); + div.addEventListener('mousemove', function() { + // Remove no-hover class from all items when the mouse is moved over any item + console.log("mouse move"); + var items = document.getElementsByClassName(modalName+'-list-item'); + Array.from(items).forEach(function(item) { + item.classList.remove('no-hover'); + }); + }); + listContainer.appendChild(div); + } + }); + highlightSelectedItem(modalName); +} + +function InitAutocomplete(modalName, data) { + // Focus the input field when the modal is shown and populate the list + $('#' + modalName + 'Modal').on('shown.bs.modal', function () { + $('#' + modalName + 'Input').focus().val(''); + populateList(modalName, data); + selectedIndex = 0; + highlightSelectedItem(modalName); + }); + + // Event listener for input field typing + document.getElementById(modalName + 'Input').addEventListener('input', function() { + populateList(modalName, data); + selectedIndex = 0; + }); + + // Event listener for arrow keys and enter key + document.getElementById(modalName + 'Input').addEventListener('keydown', function(event) { + var items = document.getElementsByClassName(modalName + '-list-item'); + if (event.key === 'ArrowDown') { + event.preventDefault(); + if (selectedIndex < items.length - 1) selectedIndex++; + highlightSelectedItem(modalName); + } else if (event.key === 'ArrowUp') { + event.preventDefault(); + if (selectedIndex > 0) selectedIndex--; + highlightSelectedItem(modalName); + } else if (event.key === 'Enter' && selectedIndex >= 0 && selectedIndex < items.length) { + event.preventDefault(); + items[selectedIndex].click(); + } + }); +} + +function showAutocompleteModal(modalName) { + $('#' + modalName + 'Modal').modal('show'); + selectedIndex = -1; +} +</script> + <div id="content" class="container-fluid"> <script> + InitAutocomplete("groupnavigator", groupnavigatorData); + + document.body.addEventListener("showReloadPageDialog", function(evt) { + $('#reloadPageModal').modal('show'); + }); + // submitEvent acts like .submit(), except it is compatible with the app, by using events instead. function submitEvent(ele) { console.log("in submitEvent"); + if (ele.startsWith('#')) { + ele = ele.slice(1); + } + document.getElementById(ele).submit(); + return; + /* const theEvent = new CustomEvent('submit', { bubbles: true, cancelable: true @@ -358,69 +510,204 @@ const hapticsSelectionEnd = async () => { console.log("calling submit"); ele.submit(); } + */ } // gioDestroy is a convenience function for destroy callbacks function gioDestroy(eventCB) { - document.body.addEventListener("htmx:beforeSwap", eventCB, { - once: true - }); - } - document.body.addEventListener('htmx:beforeSwap', function(evt) { - drawer = document.getElementById('drawer-name'); - if (drawer != null) { - drawerObj.closeDrawer(drawer); + let internalGioDestroy = function(evt) { + // do not activate on infinite scroll events + if (evt.detail.target !== undefined && evt.detail.target.id != "maincontent-refresh") { + console.log("Ignoring infinite scroll event"); + return; + } + console.log("Calling destroy callback"); + eventCB(evt); } - }); + document.body.addEventListener("htmx:beforeSwap", internalGioDestroy, {once: true}); + document.body.addEventListener("htmx:historyCacheMiss", internalGioDestroy, {once: true}); + } + + var drawerCloseFunc = function(evt) { + console.log("in drawerCloseFunc"); + // Find all elements with the class 'drawer' + var drawers = document.querySelectorAll('.drawer'); + + // Iterate over each element and call closeDrawer() on each + drawers.forEach(function(obj) { + drawerObj.closeDrawer(obj); + }); + $('.modal').modal('hide'); + } + document.body.addEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.addEventListener('htmx:historyCacheMiss', drawerCloseFunc); + + var keydownFunc = function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + if (event.key === 'Escape') { + event.target.blur(); + } + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + console.log("HERE: " + event.key + " " + event.ctrlKey + " " + event.shiftKey + " " + event.metaKey); + if (event.ctrlKey && event.shiftKey && (event.key === '?' || event.key === '/')) { + event.preventDefault(); // Prevent the default action + // Show the modal dialog for keyboard shortcuts + $('#shortcutModal').modal('show'); + return; + } + $('#shortcutModal').modal('hide'); + + if (event.key.toLowerCase() === 'g') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("groupnavigator"); + return; + } + } + } + + // Check if the pressed key is '/' + if ((event.key === 'f' || event.key === 'F') && event.shiftKey) { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + if (event.metaKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); // Prevent the default action + // Focus on the search box + let box = document.getElementById('searchbox') + if (box != null) { + document.getElementById('searchbox').focus(); + } + } + } + } + } + document.addEventListener('keydown', keydownFunc); + var removeDrawerCloseFunc = function(evt) { + document.body.removeEventListener('htmx:beforeSwap', drawerCloseFunc); + document.body.removeEventListener('htmx:historyCacheMiss', drawerCloseFunc); + document.removeEventListener('keydown', keydownFunc); + } + document.body.addEventListener("htmx:historyCacheMiss", removeDrawerCloseFunc, {once: true}); </script> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="shortcutModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Keyboard Shortcuts</h4> + </div> + <div class="modal-body"> + <div class="row"> + <div class="col-xs-3 text-right"><strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Show all keyboard shortcuts</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>shift</strong> + <strong>f</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Find</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>g</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Navigate to a group</div> + </div> + <div class="row"> + <div class="col-xs-3 text-right"><strong class="ctrlmeta">ctrl</strong> + <strong>/</strong>  :</div> + <div class="col-xs-9" style="margin-left: -23px;">Quick actions</div> + </div> + </div> + <div class="text-center" style="margin-top:10px; margin-bottom:10px; font-size:12px;"><strong>esc</strong> to dismiss</div> + </div> + </div> +</div> +<!-- Modal Dialog for Keyboard Shortcuts --> +<div class="modal fade" id="reloadPageModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h4 class="modal-title" id="myModalLabel">Update</h4> + </div> + <div class="modal-body"> + The website has been updated. Please click the button to reload the page. + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default btn-sm" data-dismiss="modal" onclick="javascript:location.reload()"> + Reload + </button> + </div> + </div> + </div> +</div> + - <div id="mainrow" class="row"> - <div class="col-md-3 col-lg-2 hidden-xs hidden-sm"> - <div class="list-group noborderlist"> - - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + <div id="mainrow" class="row" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > + <div id="groupsidebar" class="scrollbar hidden-print"> + <div class="scrollbar-content"> + <div id="accordion" role="tablist" aria-multiselectable="true" style="margin-bottom:20px;"> + <div class="list-group noborderlist panel" style="border:0;margin-bottom:0px"> + + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-badge" class="badge"></span> </a> - - - - - - - @@ -435,24 +722,63 @@ const hapticsSelectionEnd = async () => { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-badge" class="badge"></span> </a> + </div> + </div> + + <div class="text-center" style="font-size:13px;margin-bottom:30px"> + <div style="padding-bottom:10px;"> + <strong>ctrl</strong> + <strong>shift</strong> + <strong>?</strong> for shortcuts + </div> + <div style="padding-bottom:5px;"> + <a href="https://groups.io/static/about"> + About + </a> · + <a href="https://groups.io/static/features"> + Features + </a> · + <a href="https://groups.io/static/pricing"> + Pricing + </a> + </div> + <div style="padding-bottom:5px;"> + <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> + Updates + </a> · + <a href="https://groups.io/static/tos"> + Terms + </a> · + <a href="https://groups.io/helpcenter" target="_blank"> + Help + </a> + </div> + <div style="padding-bottom:5px;"> + © 2024 Groups.io + </div> + </div> + </div> </div> - <div id="maincontent" class="col-xs-12 col-sm-12 col-md-9 col-lg-10"> - <div id="maincontent-refresh"> - + <div id="maincontent" class="groupmaincontent"> + <div id="maincontent-refresh" style="height:100%"> + <div id="maincontent-column" class="col-xs-12 maincontent-column"> + @@ -460,8 +786,7 @@ const hapticsSelectionEnd = async () => { <div class="alert alert-info alert-dismissible" role="alert"> - We are pleased to announce several enhancements to the Groups.io web and app experience, which will be in effect starting Thursday, April 25th. - <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. + We are pleased to announce several enhancements to the Groups.io web and app experience. <a href="https://groups.io/static/newui" style="color:#333333">Click here</a> for more information. </div> @@ -535,27 +860,29 @@ function createAlert(msg, isError, autoClose, noClose) { -<form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> - - <div class="input-group"> - <input type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20"> - <div class="input-group-btn"> - <button class="btn btn-primary" type="submit"> - <span class="fa fa-search"></span> - </button> - </div> - </div> -</form> + <form class="form-inline pull-right hidden-xs" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + + + <div class="input-group"> + <input id="searchbox" type="text" class="form-control" placeholder="Search" title="Search" name="q" size="20" style="height:37px"> + <div class="input-group-btn"> + <button class="btn btn-primary" type="submit" style="height:37px;"> + <span class="fa fa-search"></span> + </button> + </div> + </div> + </form> -<span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> -<ol class="breadcrumb"> - <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> - <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> - <li class="active"><i class="fa fa-book"></i> Home</li> -</ol> - + <span class="hidden-sm hidden-md hidden-lg pull-right" style="padding:8px 15px;"><a data-toggle="modal" data-target="#searchModal"><i class="fa fa-search"></i></a></span> + <ol class="breadcrumb"> + <li class="hidden-xs"><a href="https://groups.io/g/MTFHRT"><i class="fa fa-home"></i> MTFHRT</a></li> + <li><a href="https://groups.io/g/MTFHRT/wiki"><i class="fa fa-book"></i> Wiki</a></li> + + <li class="active"><i class="fa fa-book"></i> Home</li> + </ol> + <div class="modal fade" id="searchModal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel"> <div class="modal-dialog" role="document"> @@ -574,6 +901,7 @@ function createAlert(msg, isError, autoClose, noClose) { </h4> </div> <form class="form-horizontal" method="get" action="https://groups.io/g/MTFHRT/wikisearch"> + <div class="modal-body"> <div class="form-group"> <div class="col-sm-12"> @@ -599,51 +927,9 @@ function createAlert(msg, isError, autoClose, noClose) { - - - <div class="pull-right"> - Last edited -<script id="timedispupdated30846"> - $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false - )); -</script> - · - <a href="30846/history.html"> - 5 revisions - </a> -    - <a href="30846.html"> - <i class="fa fa-link fa-lg"></i> - </a> - </div> - <p> -   - </p> - <br> - - <div class="row"> - <div class="col-sm-12"> - - <span class="visitedlinks"> - <p><a href="29602.html" rel="nofollow">Injections</a></p> -<p><a href="30843.html" rel="nofollow">Gel</a></p> -<p><a title="How to measure melting point of most organic powders using typical household items." href="32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> -<p>Literature and discussions on:</p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> -<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271" rel="nofollow">Hrt and brain</a></p> -<p> </p> -<p> </p> -<p> </p> - <p /> - </span> - - </div> - - </div> - <div class="row"> - <div class="col-sm-12"> - - <div class="hidden-print"> + <div class="row" style="margin-bottom:20px;"> + <div class="col-xs-12"> + <span class="hidden-print"> <div class="btn-group"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false"> Pages @@ -684,25 +970,74 @@ function createAlert(msg, isError, autoClose, noClose) { </ul> </div> - </div> + </span> + + + <div class="pull-right"> + Last edited +<script id="timedispupdated30846"> + $('#timedispupdated30846').replaceWith(DisplayShortTime(1666818091540635289, false + )); +</script> + · + <a href="30846/history.html"> + 5 revisions + </a> +    + <a href="30846.html"> + <i class="fa fa-link fa-lg"></i> + </a> + </div> + + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + + <span class="wikidisplay user-content"> + <p><a href="29602.html" rel="nofollow">Injections</a></p> +<p><a href="30843.html" rel="nofollow">Gel</a></p> +<p><a title="How to measure melting point of most organic powders using typical household items." href="32288.html" target="_blank" rel="nofollow noopener">How to measure melting point of most organic powders using typical household items.</a></p> +<p>Literature and discussions on:</p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/80225302" rel="nofollow">hGH, igf-1 and effects on hrt</a></p> +<p>  <a href="https://groups.io/g/MTFHRT/topic/79606271" rel="nofollow">Hrt and brain</a></p> +<p> </p> +<p> </p> +<p> </p> + <p /> + </span> + + </div> + + </div> + <div class="row"> + <div class="col-sm-12"> + </div> </div> +<script> +contentLoaded(false, function() { + UpdateSidebar("wiki"); +}); +</script> + + </div> </div> </div> </div> - <div class="row" id="mobileSidebar"> + <div class="row hidden-print" id="mobileSidebar" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div class="col-xs-12 hidden-md hidden-lg"> - <div class="navbar navbar-default navbar-fixed-bottom" id="groupsidebarendXX"> + <div class="navbar navbar-default navbar-fixed-bottom"> <div class="container" style="display: flex; justify-content: space-around;"> - - <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true"> + <div id="mobilesidebar-archives" class="mobilesidebar-item" style="margin-top:10px; padding-bottom:20px; flex: 1; text-align: center;" hx-get="https://groups.io/g/MTFHRT/topics?sidebar=true" hx-boost="true" hx-target="#maincontent-refresh" hx-push-url="true" hx-swap="innerHTML scroll:top" > <div style="display: inline-block; position: relative;"> <div style="position: relative;display: inline-block;"> <i class="fa-fw fa-light fa-comments fa-2x"></i> @@ -712,9 +1047,7 @@ function createAlert(msg, isError, autoClose, noClose) { </div> </div> - - @@ -743,48 +1076,43 @@ function createAlert(msg, isError, autoClose, noClose) { <div class="drawer__content"> <div class="list-group noborderlist"> - <a title="Group Home" href="https://groups.io/g/MTFHRT" class="noborderitem list-group-item sidebar-item"> + + + <a id="sidebar-home" title="Group Home" href="https://groups.io/g/MTFHRT" class="list-group-item sidebar-item"> <i class="fa-fw fa fa-home fa-lg"></i> Home </a> - + - - - <a title="Messages" href="https://groups.io/g/MTFHRT/topics" hx-get-disable="https://groups.io/g/MTFHRT/topics" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-archives" class="noborderitem list-group-item sidebar-item sidebar-archives"> + <a title="Messages" href="https://groups.io/g/MTFHRT/topics?sidebar=true" id="sidebar-archives-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-archives"> <i class="fa-fw fa fa-comments fa-lg"></i> Messages + <span id="sidebar-archives-mobile-badge" class="badge"></span> </a> - + + + - <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" hx-get-disable="https://groups.io/g/MTFHRT/hashtags" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-hashtags" class="noborderitem list-group-item sidebar-item sidebar-hashtags"> + <a title="Hashtags" href="https://groups.io/g/MTFHRT/hashtags" id="sidebar-hashtags-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-hashtags"> <i class="fa-fw fa fa-hashtag fa-lg"></i> Hashtags + <span id="sidebar-hashtags-mobile-badge" class="badge"></span> </a> - - - - - - - @@ -799,13 +1127,17 @@ function createAlert(msg, isError, autoClose, noClose) { + + + + - <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" hx-get-disable="https://groups.io/g/MTFHRT/wiki" preload hx-target="#maincontent-refresh" hx-push-url="true" - id="sidebar-wiki" class="noborderitem list-group-item sidebar-item sidebar-wiki active"> + <a title="Wiki" href="https://groups.io/g/MTFHRT/wiki" id="sidebar-wiki-mobile" class="noborderitem list-group-item sidebar-item sidebar-item-wiki active"> <i class="fa-fw fa fa-book fa-lg"></i> Wiki + <span id="sidebar-wiki-mobile-badge" class="badge"></span> </a> @@ -827,7 +1159,7 @@ function createAlert(msg, isError, autoClose, noClose) { </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/g/updates/messages?expanded=1"> <i class="fa-fw far fa-thermometer-three-quarters fa-lg"></i> - Updates + # Changelog </a> <a class="noborderitem list-group-item sidebar-item" href="https://groups.io/static/tos"> <i class="fa-fw fal fa-newspaper fa-lg"></i> @@ -848,138 +1180,144 @@ function createAlert(msg, isError, autoClose, noClose) { </section> </div> </div> -<script> - document.body.addEventListener("gio:keyboardWillShow", keyboardWillShow); - document.body.addEventListener("gio:keyboardWillHide", keyboardWillHide); - var restorePadding = false; - function keyboardWillShow() { - return; - $("#mobileSidebar").hide(); - // On narrow screens, we add a padding-bottom in groupsio.css to make room for the mobile sidebar. - // We need to remove this when we remove the mobile sidebar for the keyboard. And then - // we need to restore it afterwards. - let padding = $("#content").css("padding-bottom"); - console.log("padding-bottom is " + padding); - if (padding == "70px") { - $("#content").css("padding-bottom", "0px"); - console.log("REMOVING PADDING"); - restorePadding = true; - } - } - function keyboardWillHide() { - return; - $("#mobileSidebar").show(); - if (restorePadding == true) { - $("#content").css("padding-bottom", "70px"); - console.log("RESTORING PADDING"); - restorePadding = false; - } - } - document.body.addEventListener('htmx:beforeSend', function(evt) { - let id = evt.detail.elt.id; - if(id.startsWith("mobilesidebar-")) { - console.log(id + " was clicked"); - var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); - sidebarItems.forEach(function(item) { - var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; - console.log("ID:" + item.id); - if (item.id == id) { - console.log("making solid") - iElement.classList.add('fa-solid'); - iElement.classList.remove('fa-light'); - } else { - console.log("making light") - iElement.classList.remove('fa-solid'); - iElement.classList.add('fa-light'); - } - }); - } else if (id.startsWith("sidebar-")) { - var sidebarItems = document.querySelectorAll('.sidebar-item'); - // remove 'active' class from all 'sidebar-item' elements - sidebarItems.forEach(function(item) { - if (item.id == id) { - item.classList.add('active'); - } else { - item.classList.remove('active'); - } - }); - } +<!-- Modal Dialog for Autocomplete --> +<div class="modal fade" id="quickActionsModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true"> + <div class="modal-dialog" role="document"> + <div class="modal-content"> + <div class="modal-body"> + <input type="text" class="form-control" id="quickActionsInput" placeholder="Go to page..." style="margin-bottom:10px"> + <div id="quickActionsContainer" class="autocompleteResults" style="max-height:250px; overflow-y: auto;"></div> + <div class="text-center" style="margin-top:10px; font-size:12px;"><i class="fa-sharp fa-arrow-up-arrow-down"></i> to navigate   <i class="fa-sharp fa-arrow-turn-down-left"></i> to use   <strong>esc</strong> to dismiss</div> + </div> + </div> + </div> +</div> + + + + +<script> + var quickActionsData = [ + + + {name: "Group Home", url: "https://groups.io/g/MTFHRT"}, + + + + {name: "Topics", url: "https://groups.io/g/MTFHRT/topics"}, + {name: "Messages", url: "https://groups.io/g/MTFHRT/messages"}, + {name: "Expanded Messages", url: "https://groups.io/g/MTFHRT/messages?expanded=1"}, + + + {name: "Polls", url: "https://groups.io/g/MTFHRT/polls"}, + + + {name: "Hashtags", url: "https://groups.io/g/MTFHRT/hashtags"}, + + + + + + + + + + + + + + + + {name: "Wiki", url: "https://groups.io/g/MTFHRT/wiki"}, + + + /* other pages */ + {name: "Help", url: "/helpcenter"}, + {name: "Feed", url: "/feed"}, + {name: "Your Groups", url: "/groups"}, + {name: "Your Calendar", url: "/calendar"}, + {name: "Your Activity", url: "/activity"}, + {name: "Your Pending Messages", url: "/pendingmsgs"}, + {name: "Account Login", url: "/account"}, + {name: "Account Preferences", url: "/account?page=prefs"}, + {name: "Account Security", url: "/account?page=security"}, + {name: "Account Identity", url: "/account?page=profile&member_info_id=0"}, + {name: "Account Notifications", url: "/account?page=notifications"}, + {name: "Account Other Services", url: "/account?page=oauth"}, + {name: "Account Bounces", url: "/account?page=bounces"}, + {name: "Account Billing", url: "/account?page=billing"}, + {name: "Find a Group", url: "/search?p=SubsCount,,,20,2,0,0"}, + ]; + + + InitAutocomplete("quickActions", quickActionsData); + + document.addEventListener('keydown', function(event) { + var tagName = event.target.tagName.toLowerCase(); + if (tagName === 'input' || tagName === 'textarea' || event.target.isContentEditable) { + return; + } + // check if the viewimages viewer is up + let element = document.getElementById('overlay'); + if (element && element.classList.contains('visible')) { + return; + } + if (event.key.toLowerCase() === '/') { + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + // For Mac + // Check if Command (event.metaKey) is pressed, and either Option (event.altKey) is pressed or not + if (event.metaKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } else { + // For Windows and Linux + if (event.ctrlKey) { + event.preventDefault(); + showAutocompleteModal("quickActions"); + return; + } + } + } }); + function UpdateSidebar(id) { + console.log(id + " was clicked"); + var sidebarItems = document.querySelectorAll('.mobilesidebar-item'); + sidebarItems.forEach(function(item) { + var iElement = item.getElementsByTagName('div')[0].getElementsByTagName('i')[0]; + if (item.id == "mobilesidebar-" + id) { + console.log("making solid " + id) + iElement.classList.add('fa-solid'); + iElement.classList.remove('fa-light'); + } else { + iElement.classList.remove('fa-solid'); + iElement.classList.add('fa-light'); + } + }); + var sidebarItems = document.querySelectorAll('.sidebar-item'); + // remove 'active' class from all 'sidebar-item' elements + sidebarItems.forEach(function(item) { + if (item.id == "sidebar-" + id) { + console.log("making active " + id) + item.classList.add('active'); + } else { + item.classList.remove('active'); + } + }); + } </script> - <p></p> </div> <div id="scroll-top" class="scroll-top-wrapper hidden-xs"> <span class="scroll-top-inner"> - <i class="fa fa-arrow-circle-up fa-fw fa-2x" style="vertical-align:-.25em"></i> + <i class="fa fa-arrow-circle-up fa-fw fa-2x"></i> </span> </div> - <div class="hidden-xs hidden-sm" id="footer"> - <div class="navbar navbar-default"> - <div class="navbar-header"> - <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#footercollapse"> - <span class="sr-only"> - Toggle navigation - </span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - <span class="icon-bar"></span> - </button> - </div> - <div class="collapse navbar-collapse" id="footercollapse"> - <ul class="nav navbar-nav"> - - - <li> - <a href="https://groups.io/static/about"> - About - </a> - </li> - <li> - <a href="https://groups.io/static/features"> - Features - </a> - </li> - <li> - <a href="https://groups.io/static/pricing"> - Pricing - </a> - </li> - <li> - <a rel="nofollow" href="https://groups.io/g/updates/messages?expanded=1"> - Updates - </a> - </li> - - <li> - <a href="https://groups.io/static/tos"> - Terms - </a> - </li> - <li> - <a href="https://groups.io/helpcenter" target="_blank"> - Help - </a> - </li> - - </ul> - <ul class="nav navbar-nav navbar-right"> - <li> - <p class="navbar-text"> - © - <span class="hidden-sm"> - 2024 - </span> - Groups.io - </p> - </li> - </ul> - </div> - </div> - </div> + <script> $(function() { $(document).on('scroll', function() { @@ -1001,6 +1339,21 @@ function createAlert(msg, isError, autoClose, noClose) { scrollTop: offsetTop }, 100, 'linear'); } + + if (navigator.platform.toUpperCase().indexOf('MAC') >= 0) { + let elements = document.querySelectorAll('strong.ctrlmeta'); + elements.forEach((element) => { + // Check if the innerText is "ctrl" + if (element.innerText === 'ctrl') { + // Create a new "i" element + let newElement = document.createElement('i'); + newElement.classList.add('fa-solid', 'fa-command'); + + // Replace the old "strong" element with the new "i" element + element.parentNode.replaceChild(newElement, element); + } + }); + } </script> diff --git a/groups.io/js/application-6b3b1791facc58d99b1e9c143e69bd45.js b/groups.io/js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js similarity index 92% rename from groups.io/js/application-6b3b1791facc58d99b1e9c143e69bd45.js rename to groups.io/js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js index a439de7c..56b0890f 100644 --- a/groups.io/js/application-6b3b1791facc58d99b1e9c143e69bd45.js +++ b/groups.io/js/application-2fb8693374ebdea0ffcbb3b8c1d39910.js @@ -27,6 +27,14 @@ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires j a._handler(e(window),"resize",function(){a._listenFullScreen(screen.width===window.innerWidth&&screen.height===window.innerHeight)}),i="webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange",a._handler(e(document),i,function(){a._listenFullScreen(t.checkFullScreen())}),a._autoFitContent(),a._initClickable(),a._refreshPreview()},_autoFitContent:function(){var t,i=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,a=this,r=400>i?a.previewSettingsSmall||a.defaults.previewSettingsSmall:a.previewSettings||a.defaults.previewSettings;e.each(r,function(e,i){t=".file-preview-frame .file-preview-"+e,a.$preview.find(t+".kv-preview-data,"+t+" .kv-preview-data").css(i)})},_scanDroppedItems:function(e,t,i){i=i||"";var a,r,n,o=this,l=function(e){o._log("Error scanning dropped files!"),o._log(e)};e.isFile?e.file(function(e){t.push(e)},l):e.isDirectory&&(r=e.createReader(),(n=function(){r.readEntries(function(r){if(r&&r.length>0){for(a=0;a<r.length;a++)o._scanDroppedItems(r[a],t,i+e.name+"/");n()}return null},l)})())},_initDragDrop:function(){var t=this,i=t.$dropZone;t.dropZoneEnabled&&t.showPreview&&(t._handler(i,"dragenter dragover",e.proxy(t._zoneDragEnter,t)),t._handler(i,"dragleave",e.proxy(t._zoneDragLeave,t)),t._handler(i,"drop",e.proxy(t._zoneDrop,t)),t._handler(e(document),"dragenter dragover drop",t._zoneDragDropInit))},_zoneDragDropInit:function(e){e.stopPropagation(),e.preventDefault()},_zoneDragEnter:function(i){var a=this,r=i.originalEvent.dataTransfer,n=e.inArray("Files",r.types)>-1;return a._zoneDragDropInit(i),a.isDisabled||!n?(i.originalEvent.dataTransfer.effectAllowed="none",void(i.originalEvent.dataTransfer.dropEffect="none")):void(a._raise("fileDragEnter",{sourceEvent:i,files:r.types.Files})&&t.addCss(a.$dropZone,"file-highlighted"))},_zoneDragLeave:function(e){var t=this;t._zoneDragDropInit(e),t.isDisabled||t._raise("fileDragLeave",{sourceEvent:e})&&t.$dropZone.removeClass("file-highlighted")},_zoneDrop:function(e){var i,a=this,r=a.$element,n=e.originalEvent.dataTransfer,o=n.files,l=n.items,s=t.getDragDropFolders(l),d=function(){a.isAjaxUpload?a._change(e,o):(a.changeTriggered=!0,r.get(0).files=o,setTimeout(function(){a.changeTriggered=!1,r.trigger("change"+a.namespace)},10)),a.$dropZone.removeClass("file-highlighted")};if(e.preventDefault(),!a.isDisabled&&!t.isEmpty(o)&&a._raise("fileDragDrop",{sourceEvent:e,files:o}))if(s>0){if(!a.isAjaxUpload)return void a._showFolderError(s);for(o=[],i=0;i<l.length;i++){var c=l[i].webkitGetAsEntry();c&&a._scanDroppedItems(c,o)}setTimeout(function(){d()},500)}else d()},_uploadClick:function(e){var i,a=this,r=a.$container.find(".fileinput-upload"),n=!r.hasClass("disabled")&&t.isEmpty(r.attr("disabled"));if(!e||!e.isDefaultPrevented()){if(!a.isAjaxUpload)return void(n&&"submit"!==r.attr("type")&&(i=r.closest("form"),i.length&&i.trigger("submit"),e.preventDefault()));e.preventDefault(),n&&a.upload()}},_submitForm:function(){var e=this;return e._isFileSelectionValid()&&!e._abort({})},_clearPreview:function(){var i=this,a=i.$preview,r=i.showUploadedThumbs?i.getFrames(":not(.file-preview-success)"):i.getFrames();r.each(function(){var i=e(this);i.remove(),t.cleanZoomCache(a.find("#zoom-"+i.attr("id")))}),i.getFrames().length&&i.showPreview||i._resetUpload(),i._validateDefaultPreview()},_initSortable:function(){var i,a=this,r=a.$preview,n="."+t.SORT_CSS,o=a.reversePreviewOrder;window.KvSortable&&0!==r.find(n).length&&(i={handle:".drag-handle-init",dataIdAttr:"data-preview-id",scroll:!1,draggable:n,onSort:function(i){var r=i.oldIndex,n=i.newIndex,l=0;a.initialPreview=t.moveArray(a.initialPreview,r,n,o),a.initialPreviewConfig=t.moveArray(a.initialPreviewConfig,r,n,o),a.previewCache.init(),a.getFrames(".file-preview-initial").each(function(){e(this).attr("data-fileindex","init_"+l),l++}),a._raise("filesorted",{previewId:e(i.item).attr("id"),oldIndex:r,newIndex:n,stack:a.initialPreviewConfig})}},r.data("kvsortable")&&r.kvsortable("destroy"),e.extend(!0,i,a.fileActionSettings.dragSettings),r.kvsortable(i))},_setPreviewContent:function(e){var t=this;t.$preview.html(e),t._autoFitContent()},_initPreview:function(e){var i,a=this,r=a.initialCaption||"";return a.previewCache.count()?(i=a.previewCache.out(),r=e&&a.initialCaption?a.initialCaption:i.caption,a._setPreviewContent(i.content),a._setInitThumbAttr(),a._setCaption(r),a._initSortable(),void(t.isEmpty(i.content)||a.$container.removeClass("file-input-new"))):(a._clearPreview(),void(e?a._setCaption(r):a._initCaption()))},_getZoomButton:function(e){var t=this,i=t.previewZoomButtonIcons[e],a=t.previewZoomButtonClasses[e],r=' title="'+(t.previewZoomButtonTitles[e]||"")+'" ',n=r+("close"===e?' data-dismiss="modal" aria-hidden="true"':"");return"fullscreen"!==e&&"borderless"!==e&&"toggleheader"!==e||(n+=' data-toggle="button" aria-pressed="false" autocomplete="off"'),'<button type="button" class="'+a+" btn-"+e+'"'+n+">"+i+"</button>"},_getModalContent:function(){var e=this;return e._getLayoutTemplate("modal").setTokens({rtl:e.rtl?" kv-rtl":"",zoomFrameClass:e.frameClass,heading:e.msgZoomModalHeading,prev:e._getZoomButton("prev"),next:e._getZoomButton("next"),toggleheader:e._getZoomButton("toggleheader"),fullscreen:e._getZoomButton("fullscreen"),borderless:e._getZoomButton("borderless"),close:e._getZoomButton("close")})},_listenModalEvent:function(e){var i=this,a=i.$modal,r=function(e){return{sourceEvent:e,previewId:a.data("previewId"),modal:a}};a.on(e+".bs.modal",function(n){var o=a.find(".btn-fullscreen"),l=a.find(".btn-borderless");i._raise("filezoom"+e,r(n)),"shown"===e&&(l.removeClass("active").attr("aria-pressed","false"),o.removeClass("active").attr("aria-pressed","false"),a.hasClass("file-zoom-fullscreen")&&(i._maximizeZoomDialog(),t.checkFullScreen()?o.addClass("active").attr("aria-pressed","true"):l.addClass("active").attr("aria-pressed","true")))})},_initZoom:function(){var i,a=this,r=a._getLayoutTemplate("modalMain"),n="#"+t.MODAL_ID;a.showPreview&&(a.$modal=e(n),a.$modal&&a.$modal.length||(i=e(document.createElement("div")).html(r).insertAfter(a.$container),a.$modal=e(n).insertBefore(i),i.remove()),t.initModal(a.$modal),a.$modal.html(a._getModalContent()),e.each(t.MODAL_EVENTS,function(e,t){a._listenModalEvent(t)}))},_initZoomButtons:function(){var t,i,a=this,r=a.$modal.data("previewId")||"",n=a.getFrames().toArray(),o=n.length,l=a.$modal.find(".btn-prev"),s=a.$modal.find(".btn-next");return n.length<2?(l.hide(),void s.hide()):(l.show(),s.show(),void(o&&(t=e(n[0]),i=e(n[o-1]),l.removeAttr("disabled"),s.removeAttr("disabled"),t.length&&t.attr("id")===r&&l.attr("disabled",!0),i.length&&i.attr("id")===r&&s.attr("disabled",!0))))},_maximizeZoomDialog:function(){var t=this,i=t.$modal,a=i.find(".modal-header:visible"),r=i.find(".modal-footer:visible"),n=i.find(".modal-body"),o=e(window).height(),l=0;i.addClass("file-zoom-fullscreen"),a&&a.length&&(o-=a.outerHeight(!0)),r&&r.length&&(o-=r.outerHeight(!0)),n&&n.length&&(l=n.outerHeight(!0)-n.height(),o-=l),i.find(".kv-zoom-body").height(o)},_resizeZoomDialog:function(e){var i=this,a=i.$modal,r=a.find(".btn-fullscreen"),n=a.find(".btn-borderless");if(a.hasClass("file-zoom-fullscreen"))t.toggleFullScreen(!1),e?r.hasClass("active")||(a.removeClass("file-zoom-fullscreen"),i._resizeZoomDialog(!0),n.hasClass("active")&&n.removeClass("active").attr("aria-pressed","false")):r.hasClass("active")?r.removeClass("active").attr("aria-pressed","false"):(a.removeClass("file-zoom-fullscreen"),i.$modal.find(".kv-zoom-body").css("height",i.zoomModalHeight));else{if(!e)return void i._maximizeZoomDialog();t.toggleFullScreen(!0)}a.focus()},_setZoomContent:function(i,a){var r,n,o,l,s,d,c,p,u,f,m=this,v=i.attr("id"),g=m.$preview.find("#zoom-"+v),h=m.$modal,w=h.find(".btn-fullscreen"),_=h.find(".btn-borderless"),b=h.find(".btn-toggleheader");n=g.attr("data-template")||"generic",r=g.find(".kv-file-content"),o=r.length?r.html():"",u=i.data("caption")||"",f=i.data("size")||"",l=u+" "+f,h.find(".kv-zoom-title").attr("title",e("<div/>").html(l).text()).html(l),s=h.find(".kv-zoom-body"),h.removeClass("kv-single-content"),a?(p=s.addClass("file-thumb-loading").clone().insertAfter(s),s.html(o).hide(),p.fadeOut("fast",function(){s.fadeIn("fast",function(){s.removeClass("file-thumb-loading")}),p.remove()})):s.html(o),c=m.previewZoomSettings[n],c&&(d=s.find(".kv-preview-data"),t.addCss(d,"file-zoom-detail"),e.each(c,function(e,t){d.css(e,t),(d.attr("width")&&"width"===e||d.attr("height")&&"height"===e)&&d.removeAttr(e)})),h.data("previewId",v),m._handler(h.find(".btn-prev"),"click",function(){m._zoomSlideShow("prev",v)}),m._handler(h.find(".btn-next"),"click",function(){m._zoomSlideShow("next",v)}),m._handler(w,"click",function(){m._resizeZoomDialog(!0)}),m._handler(_,"click",function(){m._resizeZoomDialog(!1)}),m._handler(b,"click",function(){var e,t=h.find(".modal-header"),i=h.find(".modal-body .floating-buttons"),a=t.find(".kv-zoom-actions"),r=function(e){var i=m.$modal.find(".kv-zoom-body"),a=m.zoomModalHeight;h.hasClass("file-zoom-fullscreen")&&(a=i.outerHeight(!0),e||(a-=t.outerHeight(!0))),i.css("height",e?a+e:a)};t.is(":visible")?(e=t.outerHeight(!0),t.slideUp("slow",function(){a.find(".btn").appendTo(i),r(e)})):(i.find(".btn").appendTo(a),t.slideDown("slow",function(){r()})),h.focus()}),m._handler(h,"keydown",function(t){var i=t.which||t.keyCode,a=e(this).find(".btn-prev"),r=e(this).find(".btn-next"),n=e(this).data("previewId"),o=m.rtl?39:37,l=m.rtl?37:39;i===o&&a.length&&!a.attr("disabled")&&m._zoomSlideShow("prev",n),i===l&&r.length&&!r.attr("disabled")&&m._zoomSlideShow("next",n)})},_zoomPreview:function(e){var i,a=this,r=a.$modal;if(!e.length)throw"Cannot zoom to detailed preview!";t.initModal(r),r.html(a._getModalContent()),i=e.closest(t.FRAMES),a._setZoomContent(i),r.modal("show"),a._initZoomButtons()},_zoomSlideShow:function(t,i){var a,r,n,o=this,l=o.$modal.find(".kv-zoom-actions .btn-"+t),s=o.getFrames().toArray(),d=s.length;if(!l.attr("disabled")){for(r=0;d>r;r++)if(e(s[r]).attr("id")===i){n="prev"===t?r-1:r+1;break}0>n||n>=d||!s[n]||(a=e(s[n]),a.length&&o._setZoomContent(a,!0),o._initZoomButtons(),o._raise("filezoom"+t,{previewId:i,modal:o.$modal}))}},_initZoomButton:function(){var t=this;t.$preview.find(".kv-file-zoom").each(function(){var i=e(this);t._handler(i,"click",function(){t._zoomPreview(i)})})},_inputFileCount:function(){return this.$element.get(0).files.length},_refreshPreview:function(){var e,t=this;t._inputFileCount()&&t.showPreview&&t.isPreviewable&&(t.isAjaxUpload?(e=t.getFileStack(),t.filestack=[],e.length?t._clearFileInput():e=t.$element.get(0).files):e=t.$element.get(0).files,e&&e.length&&(t.readFiles(e),t._setFileDropZoneTitle()))},_clearObjects:function(t){t.find("video audio").each(function(){this.pause(),e(this).remove()}),t.find("img object div").each(function(){e(this).remove()})},_clearFileInput:function(){var t,i,a,r=this,n=r.$element;r._inputFileCount()&&(t=n.closest("form"),i=e(document.createElement("form")),a=e(document.createElement("div")),n.before(a),t.length?t.after(i):a.after(i),i.append(n).trigger("reset"),a.before(n).remove(),i.remove())},_resetUpload:function(){var e=this;e.uploadCache={content:[],config:[],tags:[],append:!0},e.uploadCount=0,e.uploadStatus={},e.uploadLog=[],e.uploadAsyncCount=0,e.loadedImages=[],e.totalImagesCount=0,e.$btnUpload.removeAttr("disabled"),e._setProgress(0),e.$progress.hide(),e._resetErrors(!1),e.ajaxAborted=!1,e.ajaxRequests=[],e._resetCanvas(),e.cacheInitialPreview={},e.overwriteInitial&&(e.initialPreview=[],e.initialPreviewConfig=[],e.initialPreviewThumbTags=[],e.previewCache.data={content:[],config:[],tags:[]})},_resetCanvas:function(){var e=this;e.canvas&&e.imageCanvasContext&&e.imageCanvasContext.clearRect(0,0,e.canvas.width,e.canvas.height)},_hasInitialPreview:function(){var e=this;return!e.overwriteInitial&&e.previewCache.count()},_resetPreview:function(){var e,t,i=this;i.previewCache.count()?(e=i.previewCache.out(),i._setPreviewContent(e.content),i._setInitThumbAttr(),t=i.initialCaption?i.initialCaption:e.caption,i._setCaption(t)):(i._clearPreview(),i._initCaption()),i.showPreview&&(i._initZoom(),i._initSortable())},_clearDefaultPreview:function(){var e=this;e.$preview.find(".file-default-preview").remove()},_validateDefaultPreview:function(){var e=this;e.showPreview&&!t.isEmpty(e.defaultPreviewContent)&&(e._setPreviewContent('<div class="file-default-preview">'+e.defaultPreviewContent+"</div>"),e.$container.removeClass("file-input-new"),e._initClickable())},_resetPreviewThumbs:function(e){var t,i=this;return e?(i._clearPreview(),void i.clearStack()):void(i._hasInitialPreview()?(t=i.previewCache.out(),i._setPreviewContent(t.content),i._setInitThumbAttr(),i._setCaption(t.caption),i._initPreviewActions()):i._clearPreview())},_getLayoutTemplate:function(e){var i=this,a=i.layoutTemplates[e];return t.isEmpty(i.customLayoutTags)?a:t.replaceTags(a,i.customLayoutTags)},_getPreviewTemplate:function(e){var i=this,a=i.previewTemplates[e];return t.isEmpty(i.customPreviewTags)?a:t.replaceTags(a,i.customPreviewTags)},_getOutData:function(e,t,i){var a=this;return e=e||{},t=t||{},i=i||a.filestack.slice(0)||{},{form:a.formdata,files:i,filenames:a.filenames,filescount:a.getFilesCount(),extra:a._getExtraData(),response:t,reader:a.reader,jqXHR:e}},_getMsgSelected:function(e){var t=this,i=1===e?t.fileSingle:t.filePlural;return e>0?t.msgSelected.replace("{n}",e).replace("{files}",i):t.msgNoFilesSelected},_getFrame:function(t){var i=this,a=e("#"+t);return a.length?a:(i._log('Invalid thumb frame with id: "'+t+'".'),null)},_getThumbs:function(e){return e=e||"",this.getFrames(":not(.file-preview-initial)"+e)},_getExtraData:function(e,t){var i=this,a=i.uploadExtraData;return"function"==typeof i.uploadExtraData&&(a=i.uploadExtraData(e,t)),a},_initXhr:function(e,t,i){var a=this;return e.upload&&e.upload.addEventListener("progress",function(e){var r=0,n=e.total,o=e.loaded||e.position;e.lengthComputable&&(r=Math.floor(o/n*100)),t?a._setAsyncUploadStatus(t,r,i):a._setProgress(r)},!1),e},_initAjaxSettings:function(){var t=this;t._ajaxSettings=e.extend(!0,{},t.ajaxSettings),t._ajaxDeleteSettings=e.extend(!0,{},t.ajaxDeleteSettings)},_mergeAjaxCallback:function(e,t,i){var a,r=this,n=r._ajaxSettings,o=r.mergeAjaxCallbacks;"delete"===i&&(n=r._ajaxDeleteSettings,o=r.mergeAjaxDeleteCallbacks),a=n[e],o&&"function"==typeof a?"before"===o?n[e]=function(){a.apply(this,arguments),t.apply(this,arguments)}:n[e]=function(){t.apply(this,arguments),a.apply(this,arguments)}:n[e]=t},_ajaxSubmit:function(t,i,a,r,n,o){var l,s,d=this;d._raise("filepreajax",[n,o])&&(d._uploadExtra(n,o),d._initAjaxSettings(),d._mergeAjaxCallback("beforeSend",t),d._mergeAjaxCallback("success",i),d._mergeAjaxCallback("complete",a),d._mergeAjaxCallback("error",r),s=o&&d.uploadUrlThumb?d.uploadUrlThumb:d.uploadUrl,l=e.extend(!0,{},{xhr:function(){var t=e.ajaxSettings.xhr();return d._initXhr(t,n,d.getFileStack().length)},url:d._encodeURI(s),type:"POST",dataType:"json",data:d.formdata,cache:!1,processData:!1,contentType:!1},d._ajaxSettings),d.ajaxRequests.push(e.ajax(l)))},_mergeArray:function(e,i){var a=this,r=t.cleanArray(a[e]),n=t.cleanArray(i);a[e]=r.concat(n)},_initUploadSuccess:function(i,a,r){var n,o,l,s,d,c,p,u,f,m=this;m.showPreview&&"object"==typeof i&&!e.isEmptyObject(i)&&void 0!==i.initialPreview&&i.initialPreview.length>0&&(m.hasInitData=!0,c=i.initialPreview||[],p=i.initialPreviewConfig||[],u=i.initialPreviewThumbTags||[],n=void 0===i.append||i.append,c.length>0&&!t.isArray(c)&&(c=c.split(m.initialPreviewDelimiter)),m._mergeArray("initialPreview",c),m._mergeArray("initialPreviewConfig",p),m._mergeArray("initialPreviewThumbTags",u),void 0!==a?r?(f=a.attr("data-fileindex"),m.uploadCache.content[f]=c[0],m.uploadCache.config[f]=p[0]||[],m.uploadCache.tags[f]=u[0]||[],m.uploadCache.append=n):(l=m.previewCache.add(c,p[0],u[0],n),o=m.previewCache.get(l,!1),s=e(document.createElement("div")).html(o).hide().insertAfter(a),d=s.find(".kv-zoom-cache"),d&&d.length&&d.insertAfter(a),a.fadeOut("slow",function(){var e=s.find(".file-preview-frame");e&&e.length&&e.insertBefore(a).fadeIn("slow").css("display:inline-block"),m._initPreviewActions(),m._clearFileInput(),t.cleanZoomCache(m.$preview.find("#zoom-"+a.attr("id"))),a.remove(),s.remove(),m._initSortable()})):(m.previewCache.set(c,p,u,n),m._initPreview(),m._initPreviewActions()))},_initSuccessThumbs:function(){var i=this;i.showPreview&&i._getThumbs(t.FRAMES+".file-preview-success").each(function(){var a=e(this),r=i.$preview,n=a.find(".kv-file-remove");n.removeAttr("disabled"),i._handler(n,"click",function(){var e=a.attr("id"),n=i._raise("filesuccessremove",[e,a.attr("data-fileindex")]);t.cleanMemory(a),n!==!1&&a.fadeOut("slow",function(){t.cleanZoomCache(r.find("#zoom-"+e)),a.remove(),i.getFrames().length||i.reset()})})})},_checkAsyncComplete:function(){var t,i,a=this;for(i=0;i<a.filestack.length;i++)if(a.filestack[i]&&(t=a.previewInitId+"-"+i,-1===e.inArray(t,a.uploadLog)))return!1;return a.uploadAsyncCount===a.uploadLog.length},_uploadExtra:function(t,i){var a=this,r=a._getExtraData(t,i);0!==r.length&&e.each(r,function(e,t){a.formdata.append(e,t)})},_uploadSingle:function(i,a){var r,n,o,l,s,d,c,p,u,f,m,v=this,g=v.getFileStack().length,h=new FormData,w=v.previewInitId+"-"+i,_=v.filestack.length>0||!e.isEmptyObject(v.uploadExtraData),b=e("#"+w).find(".file-thumb-progress"),C={id:w,index:i};v.formdata=h,v.showPreview&&(n=e("#"+w+":not(.file-preview-initial)"),l=n.find(".kv-file-upload"),s=n.find(".kv-file-remove"),b.show()),0===g||!_||l&&l.hasClass("disabled")||v._abort(C)||(m=function(e,t){d||v.updateStack(e,void 0),v.uploadLog.push(t),v._checkAsyncComplete()&&(v.fileBatchCompleted=!0)},o=function(){var e,i,a,r=v.uploadCache,n=0,o=v.cacheInitialPreview;v.fileBatchCompleted&&(o&&o.content&&(n=o.content.length),setTimeout(function(){var l=0===v.getFileStack(!0).length;if(v.showPreview){if(v.previewCache.set(r.content,r.config,r.tags,r.append),n){for(i=0;i<r.content.length;i++)a=i+n,o.content[a]=r.content[i],o.config.length&&(o.config[a]=r.config[i]),o.tags.length&&(o.tags[a]=r.tags[i]);v.initialPreview=t.cleanArray(o.content),v.initialPreviewConfig=t.cleanArray(o.config),v.initialPreviewThumbTags=t.cleanArray(o.tags)}else v.initialPreview=r.content,v.initialPreviewConfig=r.config,v.initialPreviewThumbTags=r.tags;v.cacheInitialPreview={},v.hasInitData&&(v._initPreview(),v._initPreviewActions())}v.unlock(l),l&&v._clearFileInput(),e=v.$preview.find(".file-preview-initial"),v.uploadAsync&&e.length&&(t.addCss(e,t.SORT_CSS),v._initSortable()),v._raise("filebatchuploadcomplete",[v.filestack,v._getExtraData()]),v.uploadCount=0,v.uploadStatus={},v.uploadLog=[],v._setProgress(101),v.ajaxAborted=!1},100))},c=function(o){r=v._getOutData(o),v.fileBatchCompleted=!1,a||(v.ajaxAborted=!1),v.showPreview&&(n.hasClass("file-preview-success")||(v._setThumbStatus(n,"Loading"),t.addCss(n,"file-uploading")),l.attr("disabled",!0),s.attr("disabled",!0)),a||v.lock(),v._raise("filepreupload",[r,w,i]),e.extend(!0,C,r),v._abort(C)&&(o.abort(),a||(v._setThumbStatus(n,"New"),n.removeClass("file-uploading"),l.removeAttr("disabled"),s.removeAttr("disabled"),v.unlock()),v._setProgressCancelled())},p=function(o,s,c){var p=v.showPreview&&n.attr("id")?n.attr("id"):w;r=v._getOutData(c,o),e.extend(!0,C,r),setTimeout(function(){t.isEmpty(o)||t.isEmpty(o.error)?(v.showPreview&&(v._setThumbStatus(n,"Success"),l.hide(),v._initUploadSuccess(o,n,a),v._setProgress(101,b)),v._raise("fileuploaded",[r,p,i]),a?m(i,p):v.updateStack(i,void 0)):(d=!0,v._showUploadError(o.error,C),v._setPreviewError(n,i,v.filestack[i],v.retryErrorUploads),v.retryErrorUploads||l.hide(),a&&m(i,p),v._setProgress(101,e("#"+p).find(".file-thumb-progress"),v.msgUploadError))},100)},u=function(){setTimeout(function(){v.showPreview&&(l.removeAttr("disabled"),s.removeAttr("disabled"),n.removeClass("file-uploading")),a?o():(v.unlock(!1),v._clearFileInput()),v._initSuccessThumbs()},100)},f=function(t,r,o){var s=v.ajaxOperations.uploadThumb,c=v._parseError(s,t,o,a&&v.filestack[i].name?v.filestack[i].name:null);d=!0,setTimeout(function(){a&&m(i,w),v.uploadStatus[w]=100,v._setPreviewError(n,i,v.filestack[i],v.retryErrorUploads),v.retryErrorUploads||l.hide(),e.extend(!0,C,v._getOutData(t)),v._setProgress(101,b,v.msgAjaxProgressError.replace("{operation}",s)),v._setProgress(101,e("#"+w).find(".file-thumb-progress"),v.msgUploadError),v._showUploadError(c,C)},100)},h.append(v.uploadFileAttr,v.filestack[i],v.filenames[i]),h.append("file_id",i),v._ajaxSubmit(c,p,u,f,w,i))},_uploadBatch:function(){var i,a,r,n,o,l=this,s=l.filestack,d=s.length,c={},p=l.filestack.length>0||!e.isEmptyObject(l.uploadExtraData);l.formdata=new FormData,0!==d&&p&&!l._abort(c)&&(o=function(){e.each(s,function(e){l.updateStack(e,void 0)}),l._clearFileInput()},i=function(i){l.lock();var a=l._getOutData(i);l.ajaxAborted=!1,l.showPreview&&l._getThumbs().each(function(){var i=e(this),a=i.find(".kv-file-upload"),r=i.find(".kv-file-remove");i.hasClass("file-preview-success")||(l._setThumbStatus(i,"Loading"),t.addCss(i,"file-uploading")),a.attr("disabled",!0),r.attr("disabled",!0)}),l._raise("filebatchpreupload",[a]),l._abort(a)&&(i.abort(),l._getThumbs().each(function(){var t=e(this),i=t.find(".kv-file-upload"),a=t.find(".kv-file-remove");t.hasClass("file-preview-loading")&&(l._setThumbStatus(t,"New"),t.removeClass("file-uploading")),i.removeAttr("disabled"),a.removeAttr("disabled")}),l._setProgressCancelled())},a=function(i,a,r){var n=l._getOutData(r,i),s=0,d=l._getThumbs(":not(.file-preview-success)"),c=t.isEmpty(i)||t.isEmpty(i.errorkeys)?[]:i.errorkeys;t.isEmpty(i)||t.isEmpty(i.error)?(l._raise("filebatchuploadsuccess",[n]),o(),l.showPreview?(d.each(function(){var t=e(this);l._setThumbStatus(t,"Success"),t.removeClass("file-uploading"),t.find(".kv-file-upload").hide().removeAttr("disabled")}),l._initUploadSuccess(i)):l.reset(),l._setProgress(101)):(l.showPreview&&(d.each(function(){var t=e(this),i=t.attr("data-fileindex");t.removeClass("file-uploading"),t.find(".kv-file-upload").removeAttr("disabled"),t.find(".kv-file-remove").removeAttr("disabled"),0===c.length||-1!==e.inArray(s,c)?(l._setPreviewError(t,i,l.filestack[i],l.retryErrorUploads),l.retryErrorUploads||(t.find(".kv-file-upload").hide(),l.updateStack(i,void 0))):(t.find(".kv-file-upload").hide(),l._setThumbStatus(t,"Success"),l.updateStack(i,void 0)),t.hasClass("file-preview-error")&&!l.retryErrorUploads||s++}),l._initUploadSuccess(i)),l._showUploadError(i.error,n,"filebatchuploaderror"),l._setProgress(101,l.$progress,l.msgUploadError))},n=function(){l.unlock(),l._initSuccessThumbs(),l._clearFileInput(),l._raise("filebatchuploadcomplete",[l.filestack,l._getExtraData()])},r=function(t,i,a){var r=l._getOutData(t),n=l.ajaxOperations.uploadBatch,o=l._parseError(n,t,a);l._showUploadError(o,r,"filebatchuploaderror"),l.uploadFileCount=d-1,l.showPreview&&(l._getThumbs().each(function(){var t=e(this),i=t.attr("data-fileindex");t.removeClass("file-uploading"),void 0!==l.filestack[i]&&l._setPreviewError(t)}),l._getThumbs().removeClass("file-uploading"),l._getThumbs(" .kv-file-upload").removeAttr("disabled"),l._getThumbs(" .kv-file-delete").removeAttr("disabled"),l._setProgress(101,l.$progress,l.msgAjaxProgressError.replace("{operation}",n)))},e.each(s,function(e,i){t.isEmpty(s[e])||l.formdata.append(l.uploadFileAttr,i,l.filenames[e])}),l._ajaxSubmit(i,a,n,r))},_uploadExtraOnly:function(){var e,i,a,r,n=this,o={};n.formdata=new FormData,n._abort(o)||(e=function(e){n.lock();var t=n._getOutData(e);n._raise("filebatchpreupload",[t]),n._setProgress(50),o.data=t,o.xhr=e,n._abort(o)&&(e.abort(),n._setProgressCancelled())},i=function(e,i,a){var r=n._getOutData(a,e);t.isEmpty(e)||t.isEmpty(e.error)?(n._raise("filebatchuploadsuccess",[r]),n._clearFileInput(),n._initUploadSuccess(e),n._setProgress(101)):n._showUploadError(e.error,r,"filebatchuploaderror")},a=function(){n.unlock(),n._clearFileInput(),n._raise("filebatchuploadcomplete",[n.filestack,n._getExtraData()])},r=function(e,t,i){var a=n._getOutData(e),r=n.ajaxOperations.uploadExtra,l=n._parseError(r,e,i);o.data=a,n._showUploadError(l,a,"filebatchuploaderror"),n._setProgress(101,n.$progress,n.msgAjaxProgressError.replace("{operation}",r))},n._ajaxSubmit(e,i,a,r))},_deleteFileIndex:function(i){var a=this,r=i.attr("data-fileindex"),n=a.reversePreviewOrder;"init_"===r.substring(0,5)&&(r=parseInt(r.replace("init_","")),a.initialPreview=t.spliceArray(a.initialPreview,r,n),a.initialPreviewConfig=t.spliceArray(a.initialPreviewConfig,r,n),a.initialPreviewThumbTags=t.spliceArray(a.initialPreviewThumbTags,r,n),a.getFrames().each(function(){var t=e(this),i=t.attr("data-fileindex");"init_"===i.substring(0,5)&&(i=parseInt(i.replace("init_","")),i>r&&(i--,t.attr("data-fileindex","init_"+i)))}),a.uploadAsync&&(a.cacheInitialPreview=a.getPreview()))},_initFileActions:function(){var i=this,a=i.$preview;i.showPreview&&(i._initZoomButton(),i.getFrames(" .kv-file-remove").each(function(){var r,n,o,l,s=e(this),d=s.closest(t.FRAMES),c=d.attr("id"),p=d.attr("data-fileindex");i._handler(s,"click",function(){return l=i._raise("filepreremove",[c,p]),l!==!1&&i._validateMinCount()?(r=d.hasClass("file-preview-error"),t.cleanMemory(d),void d.fadeOut("slow",function(){t.cleanZoomCache(a.find("#zoom-"+c)),i.updateStack(p,void 0),i._clearObjects(d),d.remove(),c&&r&&i.$errorContainer.find('li[data-file-id="'+c+'"]').fadeOut("fast",function(){e(this).remove(),i._errorsExist()||i._resetErrors()}),i._clearFileInput();var l=i.getFileStack(!0),s=i.previewCache.count(),u=l.length,f=i.showPreview&&i.getFrames().length;0!==u||0!==s||f?(n=s+u,o=n>1?i._getMsgSelected(n):l[0]?i._getFileNames()[0]:"",i._setCaption(o)):i.reset(),i._raise("fileremoved",[c,p])})):!1})}),i.getFrames(" .kv-file-upload").each(function(){var a=e(this);i._handler(a,"click",function(){var e=a.closest(t.FRAMES),r=e.attr("data-fileindex");i.$progress.hide(),e.hasClass("file-preview-error")&&!i.retryErrorUploads||i._uploadSingle(r,!1)})}))},_initPreviewActions:function(){var i=this,a=i.$preview,r=i.deleteExtraData||{},n=t.FRAMES+" .kv-file-remove",o=i.fileActionSettings,l=o.removeClass,s=o.removeErrorClass,d=function(){var e=i.isAjaxUpload?i.previewCache.count():i._inputFileCount();a.find(t.FRAMES).length||e||(i._setCaption(""),i.reset(),i.initialCaption="")};i._initZoomButton(),a.find(n).each(function(){var n,o,c,p=e(this),u=p.data("url")||i.deleteUrl,f=p.data("key");if(!t.isEmpty(u)&&void 0!==f){var m,v,g,h,w=p.closest(t.FRAMES),_=i.previewCache.data,b=w.attr("data-fileindex");b=parseInt(b.replace("init_","")),g=t.isEmpty(_.config)&&t.isEmpty(_.config[b])?null:_.config[b],h=t.isEmpty(g)||t.isEmpty(g.extra)?r:g.extra,"function"==typeof h&&(h=h()),v={id:p.attr("id"),key:f,extra:h},n=function(e){i.ajaxAborted=!1,i._raise("filepredelete",[f,e,h]),i._abort()?e.abort():(p.removeClass(s),t.addCss(w,"file-uploading"),t.addCss(p,"disabled "+l))},o=function(e,r,n){var o,c;return t.isEmpty(e)||t.isEmpty(e.error)?(w.removeClass("file-uploading").addClass("file-deleted"),void w.fadeOut("slow",function(){b=parseInt(w.attr("data-fileindex").replace("init_","")),i.previewCache.unset(b),i._deleteFileIndex(w),o=i.previewCache.count(),c=o>0?i._getMsgSelected(o):"",i._setCaption(c),i._raise("filedeleted",[f,n,h]),t.cleanZoomCache(a.find("#zoom-"+w.attr("id"))),i._clearObjects(w),w.remove(),d()})):(v.jqXHR=n,v.response=e,i._showError(e.error,v,"filedeleteerror"),w.removeClass("file-uploading"),p.removeClass("disabled "+l).addClass(s),void d())},c=function(e,t,a){var r=i.ajaxOperations.deleteThumb,n=i._parseError(r,e,a);v.jqXHR=e,v.response={},i._showError(n,v,"filedeleteerror"),w.removeClass("file-uploading"),p.removeClass("disabled "+l).addClass(s),d()},i._initAjaxSettings(),i._mergeAjaxCallback("beforeSend",n,"delete"),i._mergeAjaxCallback("success",o,"delete"),i._mergeAjaxCallback("error",c,"delete"),m=e.extend(!0,{},{url:i._encodeURI(u),type:"POST",dataType:"json",data:e.extend(!0,{},{key:f},h)},i._ajaxDeleteSettings),i._handler(p,"click",function(){return i._validateMinCount()?(i.ajaxAborted=!1,i._raise("filebeforedelete",[f,h]),void(i.ajaxAborted instanceof Promise?i.ajaxAborted.then(function(t){t||e.ajax(m)}):i.ajaxAborted||e.ajax(m))):!1})}})},_hideFileIcon:function(){var e=this;e.overwriteInitial&&e.$captionContainer.removeClass("icon-visible")},_showFileIcon:function(){var e=this;t.addCss(e.$captionContainer,"icon-visible")},_getSize:function(t){var i,a,r,n=this,o=parseFloat(t),l=n.fileSizeGetter;return e.isNumeric(t)&&e.isNumeric(o)?("function"==typeof l?r=l(o):0===o?r="0.00 B":(i=Math.floor(Math.log(o)/Math.log(1024)),a=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],r=1*(o/Math.pow(1024,i)).toFixed(2)+" "+a[i]),n._getLayoutTemplate("size").replace("{sizeText}",r)):""},_getFileType:function(e){var t=this;return t.mimeTypeAliases[e]||e},_generatePreviewTemplate:function(i,a,r,n,o,l,s,d,c,p,u){var f,m,v=this,g=v.slug(r),h="",w="",_=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,b=400>_?v.previewSettingsSmall[i]||v.defaults.previewSettingsSmall[i]:v.previewSettings[i]||v.defaults.previewSettings[i],C=c||v._renderFileFooter(g,s,"auto",l),y=v._getPreviewIcon(r),x="type-default",T=y&&v.preferIconicPreview,E=y&&v.preferIconicZoomPreview;return b&&e.each(b,function(e,t){w+=e+":"+t+";"}),m=function(a,l,s,c){var f=s?"zoom-"+o:o,m=v._getPreviewTemplate(a),h=(d||"")+" "+c;return v.frameClass&&(h=v.frameClass+" "+h),s&&(h=h.replace(" "+t.SORT_CSS,"")),m=v._parseFilePreviewIcon(m,r),"text"===a&&(l=t.htmlEncode(l)),"object"!==i||n||e.each(v.defaults.fileTypeSettings,function(e,t){"object"!==e&&"other"!==e&&t(r,n)&&(x="type-"+e)}),m.setTokens({previewId:f,caption:g,frameClass:h,type:v._getFileType(n),fileindex:p,typeCss:x,footer:C,data:l,template:u||i,style:w?'style="'+w+'"':""})},p=p||o.slice(o.lastIndexOf("-")+1),v.fileActionSettings.showZoom&&(h=m(E?"other":i,a,!0,"kv-zoom-thumb")),h="\n"+v._getLayoutTemplate("zoomCache").replace("{zoomContent}",h),f=m(T?"other":i,a,!1,"kv-preview-thumb"),f+h},_addToPreview:function(e,t){var i=this;return i.reversePreviewOrder?e.prepend(t):e.append(t)},_previewDefault:function(i,a,r){var n=this,o=n.$preview;if(n.showPreview){var l,s=i?i.name:"",d=i?i.type:"",c=i.size||0,p=n.slug(s),u=r===!0&&!n.isAjaxUpload,f=t.createObjectURL(i);n._clearDefaultPreview(),l=n._generatePreviewTemplate("other",f,s,d,a,u,c),n._addToPreview(o,l),n._setThumbAttr(a,p,c),r===!0&&n.isAjaxUpload&&n._setThumbStatus(e("#"+a),"Error")}},_previewFile:function(e,t,i,a,r,n){if(this.showPreview){var o,l=this,s=t?t.name:"",d=n.type,c=n.name,p=l._parseFileType(d,s),u=l.allowedPreviewTypes,f=l.allowedPreviewMimeTypes,m=l.$preview,v=t.size||0,g=u&&u.indexOf(p)>=0,h=f&&-1!==f.indexOf(d),w="text"===p||"html"===p||"image"===p?i.target.result:r;if("html"===p&&l.purifyHtml&&window.DOMPurify&&(w=window.DOMPurify.sanitize(w)),g||h){o=l._generatePreviewTemplate(p,w,s,d,a,!1,v),l._clearDefaultPreview(),l._addToPreview(m,o);var _=m.find("#"+a+" img");l._validateImageOrientation(_,t,a,c,d,v,w)}else l._previewDefault(t,a);l._setThumbAttr(a,c,v),l._initSortable()}},_setThumbAttr:function(t,i,a){var r=this,n=e("#"+t);n.length&&(a=a&&a>0?r._getSize(a):"",n.data({caption:i,size:a}))},_setInitThumbAttr:function(){var e,i,a,r,n=this,o=n.previewCache.data,l=n.previewCache.count();if(0!==l)for(var s=0;l>s;s++)e=o.config[s],r=n.previewInitId+"-init_"+s,i=t.ifSet("caption",e,t.ifSet("filename",e)),a=t.ifSet("size",e),n._setThumbAttr(r,i,a)},_slugDefault:function(e){return t.isEmpty(e)?"":String(e).replace(/[\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g,"_")},_updateFileDetails:function(e){var i=this,a=i.$element,r=i.getFileStack(),n=t.isIE(9)&&t.findFileName(a.val())||a[0].files[0]&&a[0].files[0].name||r.length&&r[0].name||"",o=i.slug(n),l=i.isAjaxUpload?r.length:e,s=i.previewCache.count()+l,d=1===l?o:i._getMsgSelected(s);i.isError?(i.$previewContainer.removeClass("file-thumb-loading"), i.$previewStatus.html(""),i.$captionContainer.removeClass("icon-visible")):i._showFileIcon(),i._setCaption(d,i.isError),i.$container.removeClass("file-input-new file-input-ajax-new"),1===arguments.length&&i._raise("fileselect",[e,o]),i.previewCache.count()&&i._initPreviewActions()},_setThumbStatus:function(e,t){var i=this;if(i.showPreview){var a="indicator"+t,r=a+"Title",n="file-preview-"+t.toLowerCase(),o=e.find(".file-upload-indicator"),l=i.fileActionSettings;e.removeClass("file-preview-success file-preview-error file-preview-loading"),"Success"===t&&e.find(".file-drag-handle").remove(),o.html(l[a]),o.attr("title",l[r]),e.addClass(n),"Error"!==t||i.retryErrorUploads||e.find(".kv-file-upload").attr("disabled",!0)}},_setProgressCancelled:function(){var e=this;e._setProgress(101,e.$progress,e.msgCancelled)},_setProgress:function(e,i,a){var r,n=this,o=Math.min(e,100),l=n.progressUploadThreshold,s=100>=e?n.progressTemplate:n.progressCompleteTemplate,d=100>o?n.progressTemplate:a?n.progressErrorTemplate:s;i=i||n.$progress,t.isEmpty(d)||(r=l&&o>l&&100>=e?d.setTokens({percent:l,status:n.msgUploadThreshold}):d.setTokens({percent:o,status:e>100?n.msgUploadEnd:o+"%"}),i.html(r),a&&i.find('[role="progressbar"]').html(a))},_setFileDropZoneTitle:function(){var e,i=this,a=i.$container.find(".file-drop-zone"),r=i.dropZoneTitle;i.isClickable&&(e=t.isEmpty(i.$element.attr("multiple"))?i.fileSingle:i.filePlural,r+=i.dropZoneClickTitle.replace("{files}",e)),a.find("."+i.dropZoneTitleClass).remove(),!i.showPreview||0===a.length||i.getFileStack().length>0||!i.dropZoneEnabled||!i.isAjaxUpload&&i.$element.files||(0===a.find(t.FRAMES).length&&t.isEmpty(i.defaultPreviewContent)&&a.prepend('<div class="'+i.dropZoneTitleClass+'">'+r+"</div>"),i.$container.removeClass("file-input-new"),t.addCss(i.$container,"file-input-ajax-new"))},_setAsyncUploadStatus:function(t,i,a){var r=this,n=0;r._setProgress(i,e("#"+t).find(".file-thumb-progress")),r.uploadStatus[t]=i,e.each(r.uploadStatus,function(e,t){n+=t}),r._setProgress(Math.floor(n/a))},_validateMinCount:function(){var e=this,t=e.isAjaxUpload?e.getFileStack().length:e._inputFileCount();return e.validateInitialCount&&e.minFileCount>0&&e._getFileCount(t-1)<e.minFileCount?(e._noFilesError({}),!1):!0},_getFileCount:function(e){var t=this,i=0;return t.validateInitialCount&&!t.overwriteInitial&&(i=t.previewCache.count(),e+=i),e},_getFileId:function(e){var t,i=this,a=i.generateFileId;return"function"==typeof a?a(e,event):e?(t=String(e.webkitRelativePath||e.fileName||e.name||null),t?e.size+"-"+t.replace(/[^0-9a-zA-Z_-]/gim,""):null):null},_getFileName:function(e){return e&&e.name?this.slug(e.name):void 0},_getFileIds:function(e){var t=this;return t.fileids.filter(function(t){return e?void 0!==t:void 0!==t&&null!==t})},_getFileNames:function(e){var t=this;return t.filenames.filter(function(t){return e?void 0!==t:void 0!==t&&null!==t})},_setPreviewError:function(e,t,i,a){var r=this;if(void 0!==t&&r.updateStack(t,i),r.showPreview){if(r.removeFromPreviewOnError&&!a)return void e.remove();r._setThumbStatus(e,"Error"),r._refreshUploadButton(e,a)}},_refreshUploadButton:function(e,t){var i=this,a=e.find(".kv-file-upload"),r=i.fileActionSettings,n=r.uploadIcon,o=r.uploadTitle;a.length&&(t&&(n=r.uploadRetryIcon,o=r.uploadRetryTitle),a.attr("title",o).html(n))},_checkDimensions:function(e,i,a,r,n,o,l){var s,d,c,p,u=this,f="Small"===i?"min":"max",m=u[f+"Image"+o];!t.isEmpty(m)&&a.length&&(c=a[0],d="Width"===o?c.naturalWidth||c.width:c.naturalHeight||c.height,p="Small"===i?d>=m:m>=d,p||(s=u["msgImage"+o+i].setTokens({name:n,size:m}),u._showUploadError(s,l),u._setPreviewError(r,e,null)))},_getExifObj:function(e){var t=this,i=null;try{i=window.piexif?window.piexif.load(e):null}catch(a){i=null}return i||t._log("Error loading the piexif.js library."),i},_validateImageOrientation:function(e,i,a,r,n,o,l){var s,d,c=this;return s=e.length&&c.autoOrientImage?c._getExifObj(l):null,(d=s?s["0th"][piexif.ImageIFD.Orientation]:null)?(t.setImageOrientation(e,c.$preview.find("#zoom-"+a+" img"),d),c._raise("fileimageoriented",{$img:e,file:i}),void c._validateImage(a,r,n,o,l,s)):void c._validateImage(a,r,n,o,l,s)},_validateImage:function(t,i,a,r,n,o){var l,s,d,c=this,p=c.$preview,u=p.find("#"+t),f=u.attr("data-fileindex"),m=u.find("img");i=i||"Untitled",m.one("load",function(){s=u.width(),d=p.width(),s>d&&m.css("width","100%"),l={ind:f,id:t},c._checkDimensions(f,"Small",m,u,i,"Width",l),c._checkDimensions(f,"Small",m,u,i,"Height",l),c.resizeImage||(c._checkDimensions(f,"Large",m,u,i,"Width",l),c._checkDimensions(f,"Large",m,u,i,"Height",l)),c._raise("fileimageloaded",[t]),c.loadedImages.push({ind:f,img:m,thumb:u,pid:t,typ:a,siz:r,validated:!1,imgData:n,exifObj:o}),u.data("exif",o),c._validateAllImages()}).one("error",function(){c._raise("fileimageloaderror",[t])}).each(function(){this.complete?e(this).trigger("load"):this.error&&e(this).trigger("error")})},_validateAllImages:function(){var e,t,i,a=this,r={val:0},n=a.loadedImages.length,o=a.resizeIfSizeMoreThan;if(n===a.totalImagesCount&&(a._raise("fileimagesloaded"),a.resizeImage))for(e=0;e<a.loadedImages.length;e++)t=a.loadedImages[e],t.validated||(i=t.siz,i&&i>1e3*o&&a._getResizedImage(t,r,n),a.loadedImages[e].validated=!0)},_getResizedImage:function(i,a,r){var n,o,l,s,d,c,p,u=this,f=e(i.img)[0],m=f.naturalWidth,v=f.naturalHeight,g=1,h=u.maxImageWidth||m,w=u.maxImageHeight||v,_=!(!m||!v),b=u.imageCanvas,C=u.imageCanvasContext,y=i.typ,x=i.pid,T=i.ind,E=i.thumb,S=i.exifObj;if(d=function(e,t,i){u.isAjaxUpload?u._showUploadError(e,t,i):u._showError(e,t,i),u._setPreviewError(E,T)},(!u.filestack[T]||!_||h>=m&&w>=v)&&(_&&u.filestack[T]&&u._raise("fileimageresized",[x,T]),a.val++,a.val===r&&u._raise("fileimagesresized"),!_))return void d(u.msgImageResizeError,{id:x,index:T},"fileimageresizeerror");y=y||u.resizeDefaultImageType,o=m>h,l=v>w,g="width"===u.resizePreference?o?h/m:l?w/v:1:l?w/v:o?h/m:1,u._resetCanvas(),m*=g,v*=g,b.width=m,b.height=v;try{C.drawImage(f,0,0,m,v),s=b.toDataURL(y,u.resizeQuality),S&&(p=window.piexif.dump(S),s=window.piexif.insert(p,s)),n=t.dataURI2Blob(s),u.filestack[T]=n,u._raise("fileimageresized",[x,T]),a.val++,a.val===r&&u._raise("fileimagesresized",[void 0,void 0]),n instanceof Blob||d(u.msgImageResizeError,{id:x,index:T},"fileimageresizeerror")}catch(k){a.val++,a.val===r&&u._raise("fileimagesresized",[void 0,void 0]),c=u.msgImageResizeException.replace("{errors}",k.message),d(c,{id:x,index:T},"fileimageresizeexception")}},_initBrowse:function(e){var i=this,a=i.$element;i.showBrowse?i.$btnFile=e.find(".btn-file").append(a):(a.appendTo(e).attr("tabindex",-1),t.addCss(a,"file-no-browse"))},_initClickable:function(){var i,a,r=this;r.isClickable&&(i=r.$dropZone,r.isAjaxUpload||(a=r.$preview.find(".file-default-preview"),a.length&&(i=a)),t.addCss(i,"clickable"),i.attr("tabindex",-1),r._handler(i,"click",function(t){var a=e(t.target);e(r.elErrorContainer+":visible").length||a.parents(".file-preview-thumbnails").length&&!a.parents(".file-default-preview").length||(r.$element.data("zoneClicked",!0).trigger("click"),i.blur())}))},_initCaption:function(){var e=this,i=e.initialCaption||"";return e.overwriteInitial||t.isEmpty(i)?(e.$caption.val(""),!1):(e._setCaption(i),!0)},_setCaption:function(i,a){var r,n,o,l,s,d=this,c=d.getFileStack();if(d.$caption.length){if(d.$captionContainer.removeClass("icon-visible"),a)r=e("<div>"+d.msgValidationError+"</div>").text(),l=c.length,s=l?1===l&&c[0]?d._getFileNames()[0]:d._getMsgSelected(l):d._getMsgSelected(d.msgNo),n=t.isEmpty(i)?s:i,o='<span class="'+d.msgValidationErrorClass+'">'+d.msgValidationErrorIcon+"</span>";else{if(t.isEmpty(i))return;r=e("<div>"+i+"</div>").text(),n=r,o=d._getLayoutTemplate("fileIcon")}d.$captionContainer.addClass("icon-visible"),d.$caption.attr("title",r).val(n),d.$captionIcon.html(o)}},_createContainer:function(){var t=this,i={"class":"file-input file-input-new"+(t.rtl?" kv-rtl":"")},a=e(document.createElement("div")).attr(i).html(t._renderMain());return a.insertBefore(t.$element),t._initBrowse(a),t.theme&&a.addClass("theme-"+t.theme),a},_refreshContainer:function(){var e=this,t=e.$container,i=e.$element;i.insertAfter(t),t.html(e._renderMain()),e._initBrowse(t),e._validateDisabled()},_validateDisabled:function(){var e=this;e.$caption.attr({readonly:e.isDisabled})},_renderMain:function(){var e=this,t=e.dropZoneEnabled?" file-drop-zone":"file-drop-disabled",i=e.showClose?e._getLayoutTemplate("close"):"",a=e.showPreview?e._getLayoutTemplate("preview").setTokens({"class":e.previewClass,dropClass:t}):"",r=e.isDisabled?e.captionClass+" file-caption-disabled":e.captionClass,n=e.captionTemplate.setTokens({"class":r+" kv-fileinput-caption"});return e.mainTemplate.setTokens({"class":e.mainClass+(!e.showBrowse&&e.showCaption?" no-browse":""),preview:a,close:i,caption:n,upload:e._renderButton("upload"),remove:e._renderButton("remove"),cancel:e._renderButton("cancel"),browse:e._renderButton("browse")})},_renderButton:function(e){var i=this,a=i._getLayoutTemplate("btnDefault"),r=i[e+"Class"],n=i[e+"Title"],o=i[e+"Icon"],l=i[e+"Label"],s=i.isDisabled?" disabled":"",d="button";switch(e){case"remove":if(!i.showRemove)return"";break;case"cancel":if(!i.showCancel)return"";r+=" kv-hidden";break;case"upload":if(!i.showUpload)return"";i.isAjaxUpload&&!i.isDisabled?a=i._getLayoutTemplate("btnLink").replace("{href}",i.uploadUrl):d="submit";break;case"browse":if(!i.showBrowse)return"";a=i._getLayoutTemplate("btnBrowse");break;default:return""}return r+="browse"===e?" btn-file":" fileinput-"+e+" fileinput-"+e+"-button",t.isEmpty(l)||(l=' <span class="'+i.buttonLabelClass+'">'+l+"</span>"),a.setTokens({type:d,css:r,title:n,status:s,icon:o,label:l})},_renderThumbProgress:function(){var e=this;return'<div class="file-thumb-progress kv-hidden">'+e.progressTemplate.setTokens({percent:"0",status:e.msgUploadBegin})+"</div>"},_renderFileFooter:function(e,i,a,r){var n,o=this,l=o.fileActionSettings,s=l.showRemove,d=l.showDrag,c=l.showUpload,p=l.showZoom,u=o._getLayoutTemplate("footer"),f=o._getLayoutTemplate("indicator"),m=r?l.indicatorError:l.indicatorNew,v=r?l.indicatorErrorTitle:l.indicatorNewTitle,g=f.setTokens({indicator:m,indicatorTitle:v});return i=o._getSize(i),n=o.isAjaxUpload?u.setTokens({actions:o._renderFileActions(c,!1,s,p,d,!1,!1,!1),caption:e,size:i,width:a,progress:o._renderThumbProgress(),indicator:g}):u.setTokens({actions:o._renderFileActions(!1,!1,!1,p,d,!1,!1,!1),caption:e,size:i,width:a,progress:"",indicator:g}),n=t.replaceTags(n,o.previewThumbTags)},_renderFileActions:function(e,t,i,a,r,n,o,l,s,d,c){if(!(e||t||i||a||r))return"";var p,u=this,f=o===!1?"":' data-url="'+o+'"',m=l===!1?"":' data-key="'+l+'"',v="",g="",h="",w="",_="",b=u._getLayoutTemplate("actions"),C=u.fileActionSettings,y=u.otherActionButtons.setTokens({dataKey:m,key:l}),x=n?C.removeClass+" disabled":C.removeClass;return i&&(v=u._getLayoutTemplate("actionDelete").setTokens({removeClass:x,removeIcon:C.removeIcon,removeTitle:C.removeTitle,dataUrl:f,dataKey:m,key:l})),e&&(g=u._getLayoutTemplate("actionUpload").setTokens({uploadClass:C.uploadClass,uploadIcon:C.uploadIcon,uploadTitle:C.uploadTitle})),t&&(h=u._getLayoutTemplate("actionDownload").setTokens({downloadClass:C.downloadClass,downloadIcon:C.downloadIcon,downloadTitle:C.downloadTitle,downloadUrl:d||u.initialPreviewDownloadUrl}),h=h.setTokens({filename:c,key:l})),a&&(w=u._getLayoutTemplate("actionZoom").setTokens({zoomClass:C.zoomClass,zoomIcon:C.zoomIcon,zoomTitle:C.zoomTitle})),r&&s&&(p="drag-handle-init "+C.dragClass,_=u._getLayoutTemplate("actionDrag").setTokens({dragClass:p,dragTitle:C.dragTitle,dragIcon:C.dragIcon})),b.setTokens({"delete":v,upload:g,download:h,zoom:w,drag:_,other:y})},_browse:function(e){var t=this;e&&e.isDefaultPrevented()||!t._raise("filebrowse")||(t.isError&&!t.isAjaxUpload&&t.clear(),t.$captionContainer.focus())},_filterDuplicate:function(e,t,i){var a=this,r=a._getFileId(e);r&&i&&i.indexOf(r)>-1||(i||(i=[]),t.push(e),i.push(r))},_change:function(i){var a=this;if(!a.changeTriggered){var r,n,o=a.$element,l=arguments.length>1,s=a.isAjaxUpload,d=[],c=l?arguments[1]:o.get(0).files,p=!s&&t.isEmpty(o.attr("multiple"))?1:a.maxFileCount,u=a.filestack.length,f=t.isEmpty(o.attr("multiple")),m=f&&u>0,v=a._getFileIds(),g=function(t,i,r,n){var o=e.extend(!0,{},a._getOutData({},{},c),{id:r,index:n}),l={id:r,index:n,file:i,files:c};return s?a._showUploadError(t,o):a._showError(t,l)},h=function(e,t){var i=a.msgFilesTooMany.replace("{m}",t).replace("{n}",e);a.isError=g(i,null,null,null),a.$captionContainer.removeClass("icon-visible"),a._setCaption("",!0),a.$container.removeClass("file-input-new file-input-ajax-new")};if(a.reader=null,a._resetUpload(),a._hideFileIcon(),a.dropZoneEnabled&&a.$container.find(".file-drop-zone ."+a.dropZoneTitleClass).remove(),s?e.each(c,function(e,t){a._filterDuplicate(t,d,v)}):(c=i.target&&void 0===i.target.files?i.target.value?[{name:i.target.value.replace(/^.+\\/,"")}]:[]:i.target.files||{},d=c),t.isEmpty(d)||0===d.length)return s||a.clear(),void a._raise("fileselectnone");if(a._resetErrors(),n=d.length,r=a._getFileCount(s?a.getFileStack().length+n:n),p>0&&r>p){if(!a.autoReplace||n>p)return void h(a.autoReplace&&n>p?n:r,p);r>p&&a._resetPreviewThumbs(s)}else!s||m?(a._resetPreviewThumbs(!1),m&&a.clearStack()):!s||0!==u||a.previewCache.count()&&!a.overwriteInitial||a._resetPreviewThumbs(!0);a.isPreviewable?a.readFiles(d):a._updateFileDetails(1)}},_abort:function(t){var i,a=this;return a.ajaxAborted&&"object"==typeof a.ajaxAborted&&void 0!==a.ajaxAborted.message?(i=e.extend(!0,{},a._getOutData(),t),i.abortData=a.ajaxAborted.data||{},i.abortMessage=a.ajaxAborted.message,a._setProgress(101,a.$progress,a.msgCancelled),a._showUploadError(a.ajaxAborted.message,i,"filecustomerror"),a.cancel(),!0):!!a.ajaxAborted},_resetFileStack:function(){var i=this,a=0,r=[],n=[],o=[];i._getThumbs().each(function(){var l=e(this),s=l.attr("data-fileindex"),d=i.filestack[s],c=l.attr("id");"-1"!==s&&-1!==s&&(void 0!==d?(r[a]=d,n[a]=i._getFileName(d),o[a]=i._getFileId(d),l.attr({id:i.previewInitId+"-"+a,"data-fileindex":a}),a++):l.attr({id:"uploaded-"+t.uniqId(),"data-fileindex":"-1"}),i.$preview.find("#zoom-"+c).attr({id:"zoom-"+l.attr("id"),"data-fileindex":l.attr("data-fileindex")}))}),i.filestack=r,i.filenames=n,i.fileids=o},_isFileSelectionValid:function(e){var t=this;return e=e||0,t.required&&!t.getFilesCount()?(t.$errorContainer.html(""),t._showUploadError(t.msgFileRequired),!1):t.minFileCount>0&&t._getFileCount(e)<t.minFileCount?(t._noFilesError({}),!1):!0},clearStack:function(){var e=this;return e.filestack=[],e.filenames=[],e.fileids=[],e.$element},updateStack:function(e,t){var i=this;return i.filestack[e]=t,i.filenames[e]=i._getFileName(t),i.fileids[e]=t&&i._getFileId(t)||null,i.$element},addToStack:function(e){var t=this;return t.filestack.push(e),t.filenames.push(t._getFileName(e)),t.fileids.push(t._getFileId(e)),t.$element},getFileStack:function(e){var t=this;return t.filestack.filter(function(t){return e?void 0!==t:void 0!==t&&null!==t})},getFilesCount:function(){var e=this,t=e.isAjaxUpload?e.getFileStack().length:e._inputFileCount();return e._getFileCount(t)},readFiles:function(i){this.reader=new FileReader;var a,r=this,n=r.$element,o=r.$preview,l=r.reader,s=r.$previewContainer,d=r.$previewStatus,c=r.msgLoading,p=r.msgProgress,u=r.previewInitId,f=i.length,m=r.fileTypeSettings,v=r.filestack.length,g=r.allowedFileTypes,h=g?g.length:0,w=r.allowedFileExtensions,_=t.isEmpty(w)?"":w.join(", "),b=r.maxFilePreviewSize&&parseFloat(r.maxFilePreviewSize),C=o.length&&(!b||isNaN(b)),y=function(t,n,o,l){var s,d=e.extend(!0,{},r._getOutData({},{},i),{id:o,index:l}),c={id:o,index:l,file:n,files:i};r._previewDefault(n,o,!0),r.isAjaxUpload?(r.addToStack(void 0),setTimeout(function(){a(l+1)},100)):f=0,r._initFileActions(),s=e("#"+o),s.find(".kv-file-upload").hide(),r.removeFromPreviewOnError&&s.remove(),r.isError=r.isAjaxUpload?r._showUploadError(t,d):r._showError(t,c),r._updateFileDetails(f)};r.loadedImages=[],r.totalImagesCount=0,e.each(i,function(e,t){var i=r.fileTypeSettings.image;i&&i(t.type)&&r.totalImagesCount++}),a=function(x){if(t.isEmpty(n.attr("multiple"))&&(f=1),x>=f)return r.isAjaxUpload&&r.filestack.length>0?r._raise("filebatchselected",[r.getFileStack()]):r._raise("filebatchselected",[i]),s.removeClass("file-thumb-loading"),void d.html("");var T,E,S,k,F,P,I,A,D,z,$,j,U=v+x,R=u+"-"+U,B=i[x],O=m.text,L=m.image,M=m.html,Z=B&&B.name?r.slug(B.name):"",N=(B&&B.size||0)/1e3,H="",q=t.createObjectURL(B),W=0,V="",K=0,Y=function(){var e=p.setTokens({index:x+1,files:f,percent:50,name:Z});setTimeout(function(){d.html(e),r._updateFileDetails(f),a(x+1)},100),r._raise("fileloaded",[B,R,x,l])};if(B){if(h>0)for(E=0;h>E;E++)P=g[E],I=r.msgFileTypes[P]||P,V+=0===E?I:", "+I;if(Z===!1)return void a(x+1);if(0===Z.length)return S=r.msgInvalidFileName.replace("{name}",t.htmlEncode(B.name,"[unknown]")),void y(S,B,R,x);if(t.isEmpty(w)||(H=new RegExp("\\.("+w.join("|")+")$","i")),T=N.toFixed(2),r.maxFileSize>0&&N>r.maxFileSize)return S=r.msgSizeTooLarge.setTokens({name:Z,size:T,maxSize:r.maxFileSize}),void y(S,B,R,x);if(null!==r.minFileSize&&N<=t.getNum(r.minFileSize))return S=r.msgSizeTooSmall.setTokens({name:Z,size:T,minSize:r.minFileSize}),void y(S,B,R,x);if(!t.isEmpty(g)&&t.isArray(g)){for(E=0;E<g.length;E+=1)k=g[E],A=m[k],W+=A&&"function"==typeof A&&A(B.type,B.name)?1:0;if(0===W)return S=r.msgInvalidFileType.setTokens({name:Z,types:V}),void y(S,B,R,x)}if(0===W&&!t.isEmpty(w)&&t.isArray(w)&&!t.isEmpty(H)&&(F=t.compare(Z,H),W+=t.isEmpty(F)?0:F.length,0===W))return S=r.msgInvalidFileExtension.setTokens({name:Z,extensions:_}),void y(S,B,R,x);if(!r.showPreview)return r.isAjaxUpload&&r.addToStack(B),setTimeout(function(){a(x+1),r._updateFileDetails(f)},100),void r._raise("fileloaded",[B,R,x,l]);if(!C&&N>b)return r.addToStack(B),s.addClass("file-thumb-loading"),r._previewDefault(B,R),r._initFileActions(),r._updateFileDetails(f),void a(x+1);o.length&&void 0!==FileReader?(D=O(B.type,Z),z=M(B.type,Z),$=L(B.type,Z),d.html(c.replace("{index}",x+1).replace("{files}",f)),s.addClass("file-thumb-loading"),l.onerror=function(e){r._errorHandler(e,Z)},l.onload=function(i){var a,n,o,s,d,c,p=[],u=function(e){var t=new FileReader;t.onerror=function(e){r._errorHandler(e,Z)},t.onload=function(e){r._previewFile(x,B,e,R,q,n),r._initFileActions(),Y()},e?t.readAsText(B,r.textEncoding):t.readAsDataURL(B)};if(n={name:Z,type:B.type},e.each(m,function(e,t){"object"!==e&&"other"!==e&&"function"==typeof t&&t(B.type,Z)&&K++}),0===K){for(o=new Uint8Array(i.target.result),E=0;E<o.length;E++)s=o[E].toString(16),p.push(s);if(a=p.join("").toLowerCase().substring(0,8),c=t.getMimeType(a,"",""),t.isEmpty(c)&&(d=t.arrayBuffer2String(l.result),c=t.isSvg(d)?"image/svg+xml":t.getMimeType(a,d,B.type)),n={name:Z,type:c},D=O(c,""),z=M(c,""),$=L(c,""),j=D||z,j||$)return void u(j)}r._previewFile(x,B,i,R,q,n),r._initFileActions(),Y()},l.onprogress=function(e){if(e.lengthComputable){var t=e.loaded/e.total*100,i=Math.ceil(t);S=p.setTokens({index:x+1,files:f,percent:i,name:Z}),setTimeout(function(){d.html(S)},100)}},D||z?l.readAsText(B,r.textEncoding):$?l.readAsDataURL(B):l.readAsArrayBuffer(B)):(r._previewDefault(B,R),setTimeout(function(){a(x+1),r._updateFileDetails(f)},100),r._raise("fileloaded",[B,R,x,l])),r.addToStack(B)}},a(0),r._updateFileDetails(f,!1)},lock:function(){var e=this;return e._resetErrors(),e.disable(),e.showRemove&&e.$container.find(".fileinput-remove").hide(),e.showCancel&&e.$container.find(".fileinput-cancel").show(),e._raise("filelock",[e.filestack,e._getExtraData()]),e.$element},unlock:function(e){var t=this;return void 0===e&&(e=!0),t.enable(),t.showCancel&&t.$container.find(".fileinput-cancel").hide(),t.showRemove&&t.$container.find(".fileinput-remove").show(),e&&t._resetFileStack(),t._raise("fileunlock",[t.filestack,t._getExtraData()]),t.$element},cancel:function(){var t,i=this,a=i.ajaxRequests,r=a.length;if(r>0)for(t=0;r>t;t+=1)i.cancelling=!0,a[t].abort();return i._setProgressCancelled(),i._getThumbs().each(function(){var t=e(this),a=t.attr("data-fileindex");t.removeClass("file-uploading"),void 0!==i.filestack[a]&&(t.find(".kv-file-upload").removeClass("disabled").removeAttr("disabled"),t.find(".kv-file-remove").removeClass("disabled").removeAttr("disabled")),i.unlock()}),i.$element},clear:function(){var i,a=this;if(a._raise("fileclear"))return a.$btnUpload.removeAttr("disabled"),a._getThumbs().find("video,audio,img").each(function(){t.cleanMemory(e(this))}),a._clearFileInput(),a._resetUpload(),a.clearStack(),a._resetErrors(!0),a._hasInitialPreview()?(a._showFileIcon(),a._resetPreview(),a._initPreviewActions(),a.$container.removeClass("file-input-new")):(a._getThumbs().each(function(){a._clearObjects(e(this))}),a.isAjaxUpload&&(a.previewCache.data={}),a.$preview.html(""),i=!a.overwriteInitial&&a.initialCaption.length>0?a.initialCaption:"",a.$caption.attr("title","").val(i),t.addCss(a.$container,"file-input-new"),a._validateDefaultPreview()),0===a.$container.find(t.FRAMES).length&&(a._initCaption()||a.$captionContainer.removeClass("icon-visible")),a._hideFileIcon(),a._raise("filecleared"),a.$captionContainer.focus(),a._setFileDropZoneTitle(),a.$element},reset:function(){var e=this;if(e._raise("filereset"))return e._resetPreview(),e.$container.find(".fileinput-filename").text(""),t.addCss(e.$container,"file-input-new"),(e.getFrames().length||e.dropZoneEnabled)&&e.$container.removeClass("file-input-new"),e.clearStack(),e.formdata={},e._setFileDropZoneTitle(),e.$element},disable:function(){var e=this;return e.isDisabled=!0,e._raise("filedisabled"),e.$element.attr("disabled","disabled"),e.$container.find(".kv-fileinput-caption").addClass("file-caption-disabled"),e.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").attr("disabled",!0),t.addCss(e.$container.find(".btn-file"),"disabled"),e._initDragDrop(),e.$element},enable:function(){var e=this;return e.isDisabled=!1,e._raise("fileenabled"),e.$element.removeAttr("disabled"),e.$container.find(".kv-fileinput-caption").removeClass("file-caption-disabled"),e.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").removeAttr("disabled"),e.$container.find(".btn-file").removeClass("disabled"),e._initDragDrop(),e.$element},upload:function(){var i,a,r,n=this,o=n.getFileStack().length,l=!e.isEmptyObject(n._getExtraData());if(n.isAjaxUpload&&!n.isDisabled&&n._isFileSelectionValid(o)){if(n._resetUpload(),0===o&&!l)return void n._showUploadError(n.msgUploadEmpty);if(n.$progress.show(),n.uploadCount=0,n.uploadStatus={},n.uploadLog=[],n.lock(),n._setProgress(2),0===o&&l)return void n._uploadExtraOnly();if(r=n.filestack.length,n.hasInitData=!1,!n.uploadAsync)return n._uploadBatch(),n.$element;for(a=n._getOutData(),n._raise("filebatchpreupload",[a]),n.fileBatchCompleted=!1,n.uploadCache={content:[],config:[],tags:[],append:!0},n.uploadAsyncCount=n.getFileStack().length,i=0;r>i;i++)n.uploadCache.content[i]=null,n.uploadCache.config[i]=null,n.uploadCache.tags[i]=null;for(n.$preview.find(".file-preview-initial").removeClass(t.SORT_CSS),n._initSortable(),n.cacheInitialPreview=n.getPreview(),i=0;r>i;i++)n.filestack[i]&&n._uploadSingle(i,!0)}},destroy:function(){var t=this,i=t.$form,a=t.$container,r=t.$element,n=t.namespace;return e(document).off(n),e(window).off(n),i&&i.length&&i.off(n),t.isAjaxUpload&&t._clearFileInput(),t._cleanup(),t._initPreviewCache(),r.insertBefore(a).off(n).removeData(),a.off().remove(),r},refresh:function(i){var a=this,r=a.$element;return i="object"!=typeof i||t.isEmpty(i)?a.options:e.extend(!0,{},a.options,i),a._init(i,!0),a._listen(),r},zoom:function(e){var i=this,a=i._getFrame(e),r=i.$modal;a&&(t.initModal(r),r.html(i._getModalContent()),i._setZoomContent(a),r.modal("show"),i._initZoomButtons())},getExif:function(e){var t=this,i=t._getFrame(e);return i&&i.data("exif")||null},getFrames:function(i){var a,r=this;return i=i||"",a=r.$preview.find(t.FRAMES+i),r.reversePreviewOrder&&(a=e(a.get().reverse())),a},getPreview:function(){var e=this;return{content:e.initialPreview,config:e.initialPreviewConfig,tags:e.initialPreviewThumbTags}}},e.fn.fileinput=function(a){if(t.hasFileAPISupport()||t.isIE(9)){var r=Array.apply(null,arguments),n=[];switch(r.shift(),this.each(function(){var o,l=e(this),s=l.data("fileinput"),d="object"==typeof a&&a,c=d.theme||l.data("theme"),p={},u={},f=d.language||l.data("language")||e.fn.fileinput.defaults.language||"en";s||(c&&(u=e.fn.fileinputThemes[c]||{}),"en"===f||t.isEmpty(e.fn.fileinputLocales[f])||(p=e.fn.fileinputLocales[f]||{}),o=e.extend(!0,{},e.fn.fileinput.defaults,u,e.fn.fileinputLocales.en,p,d,l.data()),s=new i(this,o),l.data("fileinput",s)),"string"==typeof a&&n.push(s[a].apply(s,r))}),n.length){case 0:return this;case 1:return n[0];default:return n}}},e.fn.fileinput.defaults={language:"en",showCaption:!0,showBrowse:!0,showPreview:!0,showRemove:!0,showUpload:!0,showCancel:!0,showClose:!0,showUploadedThumbs:!0,browseOnZoneClick:!1,autoReplace:!1,autoOrientImage:!1,required:!1,rtl:!1,hideThumbnailContent:!1,encodeUrl:!0,generateFileId:null,previewClass:"",captionClass:"",frameClass:"krajee-default",mainClass:"file-caption-main",mainTemplate:null,purifyHtml:!0,fileSizeGetter:null,initialCaption:"",initialPreview:[],initialPreviewDelimiter:"*$$*",initialPreviewAsData:!1,initialPreviewFileType:"image",initialPreviewConfig:[],initialPreviewThumbTags:[],previewThumbTags:{},initialPreviewShowDelete:!0,initialPreviewDownloadUrl:"",removeFromPreviewOnError:!1,deleteUrl:"",deleteExtraData:{},overwriteInitial:!0,previewZoomButtonIcons:{prev:'<i class="glyphicon glyphicon-triangle-left"></i>',next:'<i class="glyphicon glyphicon-triangle-right"></i>',toggleheader:'<i class="glyphicon glyphicon-resize-vertical"></i>',fullscreen:'<i class="glyphicon glyphicon-fullscreen"></i>',borderless:'<i class="glyphicon glyphicon-resize-full"></i>',close:'<i class="glyphicon glyphicon-remove"></i>'},previewZoomButtonClasses:{prev:"btn btn-navigate",next:"btn btn-navigate",toggleheader:"btn btn-sm btn-kv btn-default btn-outline-secondary",fullscreen:"btn btn-sm btn-kv btn-default btn-outline-secondary",borderless:"btn btn-sm btn-kv btn-default btn-outline-secondary",close:"btn btn-sm btn-kv btn-default btn-outline-secondary"},previewTemplates:{},previewContentTemplates:{},preferIconicPreview:!1,preferIconicZoomPreview:!1,allowedPreviewTypes:void 0,allowedPreviewMimeTypes:null,allowedFileTypes:null,allowedFileExtensions:null,defaultPreviewContent:null,customLayoutTags:{},customPreviewTags:{},previewFileIcon:'<i class="glyphicon glyphicon-file"></i>',previewFileIconClass:"file-other-icon",previewFileIconSettings:{},previewFileExtSettings:{},buttonLabelClass:"hidden-xs",browseIcon:'<i class="glyphicon glyphicon-folder-open"></i> ',browseClass:"btn btn-primary",removeIcon:'<i class="glyphicon glyphicon-trash"></i>',removeClass:"btn btn-default btn-secondary",cancelIcon:'<i class="glyphicon glyphicon-ban-circle"></i>',cancelClass:"btn btn-default btn-secondary",uploadIcon:'<i class="glyphicon glyphicon-upload"></i>',uploadClass:"btn btn-default btn-secondary",uploadUrl:null,uploadUrlThumb:null,uploadAsync:!0,uploadExtraData:{},zoomModalHeight:480,minImageWidth:null,minImageHeight:null,maxImageWidth:null,maxImageHeight:null,resizeImage:!1,resizePreference:"width",resizeQuality:.92,resizeDefaultImageType:"image/jpeg",resizeIfSizeMoreThan:0,minFileSize:0,maxFileSize:0,maxFilePreviewSize:25600,minFileCount:0,maxFileCount:0,validateInitialCount:!1,msgValidationErrorClass:"text-danger",msgValidationErrorIcon:'<i class="glyphicon glyphicon-exclamation-sign"></i> ',msgErrorClass:"file-error-message",progressThumbClass:"progress-bar bg-success progress-bar-success progress-bar-striped active",progressClass:"progress-bar bg-success progress-bar-success progress-bar-striped active",progressCompleteClass:"progress-bar bg-success progress-bar-success",progressErrorClass:"progress-bar bg-danger progress-bar-danger",progressUploadThreshold:99,previewFileType:"image",elCaptionContainer:null,elCaptionText:null,elPreviewContainer:null,elPreviewImage:null,elPreviewStatus:null,elErrorContainer:null,errorCloseButton:t.closeButton("kv-error-close"),slugCallback:null,dropZoneEnabled:!0,dropZoneTitleClass:"file-drop-zone-title",fileActionSettings:{},otherActionButtons:"",textEncoding:"UTF-8",ajaxSettings:{},ajaxDeleteSettings:{},showAjaxErrorDetails:!0,mergeAjaxCallbacks:!1,mergeAjaxDeleteCallbacks:!1,retryErrorUploads:!0,reversePreviewOrder:!1},e.fn.fileinputLocales.en={fileSingle:"file",filePlural:"files",browseLabel:"Browse …",removeLabel:"Remove",removeTitle:"Clear selected files",cancelLabel:"Cancel",cancelTitle:"Abort ongoing upload",uploadLabel:"Upload",uploadTitle:"Upload selected files",msgNo:"No",msgNoFilesSelected:"No files selected",msgCancelled:"Cancelled",msgPlaceholder:"Select {files}...",msgZoomModalHeading:"Detailed Preview",msgFileRequired:"You must select a file to upload.",msgSizeTooSmall:'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',msgSizeTooLarge:'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxSize} KB</b>.',msgFilesTooLess:"You must select at least <b>{n}</b> {files} to upload.",msgFilesTooMany:"Number of files selected for upload <b>({n})</b> exceeds maximum allowed limit of <b>{m}</b>.",msgFileNotFound:'File "{name}" not found!',msgFileSecured:'Security restrictions prevent reading the file "{name}".',msgFileNotReadable:'File "{name}" is not readable.',msgFilePreviewAborted:'File preview aborted for "{name}".',msgFilePreviewError:'An error occurred while reading the file "{name}".',msgInvalidFileName:'Invalid or unsupported characters in file name "{name}".',msgInvalidFileType:'Invalid type for file "{name}". Only "{types}" files are supported.',msgInvalidFileExtension:'Invalid extension for file "{name}". Only "{extensions}" files are supported.',msgFileTypes:{image:"image",html:"HTML",text:"text",video:"video",audio:"audio",flash:"flash",pdf:"PDF",object:"object"},msgUploadAborted:"The file upload was aborted",msgUploadThreshold:"Processing...",msgUploadBegin:"Initializing...",msgUploadEnd:"Done",msgUploadEmpty:"No valid data available for upload.",msgUploadError:"Error",msgValidationError:"Validation Error",msgLoading:"Loading file {index} of {files} …",msgProgress:"Loading file {index} of {files} - {name} - {percent}% completed.",msgSelected:"{n} {files} selected",msgFoldersNotAllowed:"Drag & drop files only! {n} folder(s) dropped were skipped.",msgImageWidthSmall:'Width of image file "{name}" must be at least {size} px.',msgImageHeightSmall:'Height of image file "{name}" must be at least {size} px.',msgImageWidthLarge:'Width of image file "{name}" cannot exceed {size} px.',msgImageHeightLarge:'Height of image file "{name}" cannot exceed {size} px.',msgImageResizeError:"Could not get the image dimensions to resize.",msgImageResizeException:"Error while resizing the image.<pre>{errors}</pre>",msgAjaxError:"Something went wrong with the {operation} operation. Please try again later!",msgAjaxProgressError:"{operation} failed",ajaxOperations:{deleteThumb:"file delete",uploadThumb:"file upload",uploadBatch:"batch file upload",uploadExtra:"form data upload"},dropZoneTitle:"Drag & drop files here …",dropZoneClickTitle:"<br>(or click to select {files})",previewZoomButtonTitles:{prev:"View previous file",next:"View next file",toggleheader:"Toggle header",fullscreen:"Toggle full screen",borderless:"Toggle borderless mode",close:"Close detailed preview"},usePdfRenderer:function(){var e=!!window.MSInputMethodContext&&!!document.documentMode;return!!navigator.userAgent.match(/(iPod|iPhone|iPad|Android)/i)||e},pdfRendererUrl:"",pdfRendererTemplate:'<iframe class="kv-preview-data file-preview-pdf" src="{renderer}?file={data}" {style}></iframe>'},e.fn.fileinput.Constructor=i,e(document).ready(function(){ var t=e("input.file[type=file]");t.length&&t.fileinput()})}); +/* flatpickr v4.6.13,, @license MIT */ +!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).flatpickr=n()}(this,(function(){"use strict";var e=function(){return(e=Object.assign||function(e){for(var n,t=1,a=arguments.length;t<a;t++)for(var i in n=arguments[t])Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i]);return e}).apply(this,arguments)};function n(){for(var e=0,n=0,t=arguments.length;n<t;n++)e+=arguments[n].length;var a=Array(e),i=0;for(n=0;n<t;n++)for(var o=arguments[n],r=0,l=o.length;r<l;r++,i++)a[i]=o[r];return a}var t=["onChange","onClose","onDayCreate","onDestroy","onKeyDown","onMonthChange","onOpen","onParseConfig","onReady","onValueUpdate","onYearChange","onPreCalendarPosition"],a={_disable:[],allowInput:!1,allowInvalidPreload:!1,altFormat:"F j, Y",altInput:!1,altInputClass:"form-control input",animate:"object"==typeof window&&-1===window.navigator.userAgent.indexOf("MSIE"),ariaDateFormat:"F j, Y",autoFillDefaultTime:!0,clickOpens:!0,closeOnSelect:!0,conjunction:", ",dateFormat:"Y-m-d",defaultHour:12,defaultMinute:0,defaultSeconds:0,disable:[],disableMobile:!1,enableSeconds:!1,enableTime:!1,errorHandler:function(e){return"undefined"!=typeof console&&console.warn(e)},getWeek:function(e){var n=new Date(e.getTime());n.setHours(0,0,0,0),n.setDate(n.getDate()+3-(n.getDay()+6)%7);var t=new Date(n.getFullYear(),0,4);return 1+Math.round(((n.getTime()-t.getTime())/864e5-3+(t.getDay()+6)%7)/7)},hourIncrement:1,ignoredFocusElements:[],inline:!1,locale:"default",minuteIncrement:5,mode:"single",monthSelectorType:"dropdown",nextArrow:"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:"auto",positionElement:void 0,prevArrow:"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},i={weekdays:{shorthand:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],longhand:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},months:{shorthand:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],longhand:["January","February","March","April","May","June","July","August","September","October","November","December"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var n=e%100;if(n>3&&n<21)return"th";switch(n%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},rangeSeparator:" to ",weekAbbreviation:"Wk",scrollTitle:"Scroll to increment",toggleTitle:"Click to toggle",amPM:["AM","PM"],yearAriaLabel:"Year",monthAriaLabel:"Month",hourAriaLabel:"Hour",minuteAriaLabel:"Minute",time_24hr:!1},o=function(e,n){return void 0===n&&(n=2),("000"+e).slice(-1*n)},r=function(e){return!0===e?1:0};function l(e,n){var t;return function(){var a=this,i=arguments;clearTimeout(t),t=setTimeout((function(){return e.apply(a,i)}),n)}}var c=function(e){return e instanceof Array?e:[e]};function s(e,n,t){if(!0===t)return e.classList.add(n);e.classList.remove(n)}function d(e,n,t){var a=window.document.createElement(e);return n=n||"",t=t||"",a.className=n,void 0!==t&&(a.textContent=t),a}function u(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function f(e,n){return n(e)?e:e.parentNode?f(e.parentNode,n):void 0}function m(e,n){var t=d("div","numInputWrapper"),a=d("input","numInput "+e),i=d("span","arrowUp"),o=d("span","arrowDown");if(-1===navigator.userAgent.indexOf("MSIE 9.0")?a.type="number":(a.type="text",a.pattern="\\d*"),void 0!==n)for(var r in n)a.setAttribute(r,n[r]);return t.appendChild(a),t.appendChild(i),t.appendChild(o),t}function g(e){try{return"function"==typeof e.composedPath?e.composedPath()[0]:e.target}catch(n){return e.target}}var p=function(){},h=function(e,n,t){return t.months[n?"shorthand":"longhand"][e]},v={D:p,F:function(e,n,t){e.setMonth(t.months.longhand.indexOf(n))},G:function(e,n){e.setHours((e.getHours()>=12?12:0)+parseFloat(n))},H:function(e,n){e.setHours(parseFloat(n))},J:function(e,n){e.setDate(parseFloat(n))},K:function(e,n,t){e.setHours(e.getHours()%12+12*r(new RegExp(t.amPM[1],"i").test(n)))},M:function(e,n,t){e.setMonth(t.months.shorthand.indexOf(n))},S:function(e,n){e.setSeconds(parseFloat(n))},U:function(e,n){return new Date(1e3*parseFloat(n))},W:function(e,n,t){var a=parseInt(n),i=new Date(e.getFullYear(),0,2+7*(a-1),0,0,0,0);return i.setDate(i.getDate()-i.getDay()+t.firstDayOfWeek),i},Y:function(e,n){e.setFullYear(parseFloat(n))},Z:function(e,n){return new Date(n)},d:function(e,n){e.setDate(parseFloat(n))},h:function(e,n){e.setHours((e.getHours()>=12?12:0)+parseFloat(n))},i:function(e,n){e.setMinutes(parseFloat(n))},j:function(e,n){e.setDate(parseFloat(n))},l:p,m:function(e,n){e.setMonth(parseFloat(n)-1)},n:function(e,n){e.setMonth(parseFloat(n)-1)},s:function(e,n){e.setSeconds(parseFloat(n))},u:function(e,n){return new Date(parseFloat(n))},w:p,y:function(e,n){e.setFullYear(2e3+parseFloat(n))}},D={D:"",F:"",G:"(\\d\\d|\\d)",H:"(\\d\\d|\\d)",J:"(\\d\\d|\\d)\\w+",K:"",M:"",S:"(\\d\\d|\\d)",U:"(.+)",W:"(\\d\\d|\\d)",Y:"(\\d{4})",Z:"(.+)",d:"(\\d\\d|\\d)",h:"(\\d\\d|\\d)",i:"(\\d\\d|\\d)",j:"(\\d\\d|\\d)",l:"",m:"(\\d\\d|\\d)",n:"(\\d\\d|\\d)",s:"(\\d\\d|\\d)",u:"(.+)",w:"(\\d\\d|\\d)",y:"(\\d{2})"},w={Z:function(e){return e.toISOString()},D:function(e,n,t){return n.weekdays.shorthand[w.w(e,n,t)]},F:function(e,n,t){return h(w.n(e,n,t)-1,!1,n)},G:function(e,n,t){return o(w.h(e,n,t))},H:function(e){return o(e.getHours())},J:function(e,n){return void 0!==n.ordinal?e.getDate()+n.ordinal(e.getDate()):e.getDate()},K:function(e,n){return n.amPM[r(e.getHours()>11)]},M:function(e,n){return h(e.getMonth(),!0,n)},S:function(e){return o(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,n,t){return t.getWeek(e)},Y:function(e){return o(e.getFullYear(),4)},d:function(e){return o(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return o(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,n){return n.weekdays.longhand[e.getDay()]},m:function(e){return o(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},b=function(e){var n=e.config,t=void 0===n?a:n,o=e.l10n,r=void 0===o?i:o,l=e.isMobile,c=void 0!==l&&l;return function(e,n,a){var i=a||r;return void 0===t.formatDate||c?n.split("").map((function(n,a,o){return w[n]&&"\\"!==o[a-1]?w[n](e,i,t):"\\"!==n?n:""})).join(""):t.formatDate(e,n,i)}},C=function(e){var n=e.config,t=void 0===n?a:n,o=e.l10n,r=void 0===o?i:o;return function(e,n,i,o){if(0===e||e){var l,c=o||r,s=e;if(e instanceof Date)l=new Date(e.getTime());else if("string"!=typeof e&&void 0!==e.toFixed)l=new Date(e);else if("string"==typeof e){var d=n||(t||a).dateFormat,u=String(e).trim();if("today"===u)l=new Date,i=!0;else if(t&&t.parseDate)l=t.parseDate(e,d);else if(/Z$/.test(u)||/GMT$/.test(u))l=new Date(e);else{for(var f=void 0,m=[],g=0,p=0,h="";g<d.length;g++){var w=d[g],b="\\"===w,C="\\"===d[g-1]||b;if(D[w]&&!C){h+=D[w];var M=new RegExp(h).exec(e);M&&(f=!0)&&m["Y"!==w?"push":"unshift"]({fn:v[w],val:M[++p]})}else b||(h+=".")}l=t&&t.noCalendar?new Date((new Date).setHours(0,0,0,0)):new Date((new Date).getFullYear(),0,1,0,0,0,0),m.forEach((function(e){var n=e.fn,t=e.val;return l=n(l,t,c)||l})),l=f?l:void 0}}if(l instanceof Date&&!isNaN(l.getTime()))return!0===i&&l.setHours(0,0,0,0),l;t.errorHandler(new Error("Invalid date provided: "+s))}}};function M(e,n,t){return void 0===t&&(t=!0),!1!==t?new Date(e.getTime()).setHours(0,0,0,0)-new Date(n.getTime()).setHours(0,0,0,0):e.getTime()-n.getTime()}var y=function(e,n,t){return 3600*e+60*n+t},x=864e5;function E(e){var n=e.defaultHour,t=e.defaultMinute,a=e.defaultSeconds;if(void 0!==e.minDate){var i=e.minDate.getHours(),o=e.minDate.getMinutes(),r=e.minDate.getSeconds();n<i&&(n=i),n===i&&t<o&&(t=o),n===i&&t===o&&a<r&&(a=e.minDate.getSeconds())}if(void 0!==e.maxDate){var l=e.maxDate.getHours(),c=e.maxDate.getMinutes();(n=Math.min(n,l))===l&&(t=Math.min(c,t)),n===l&&t===c&&(a=e.maxDate.getSeconds())}return{hours:n,minutes:t,seconds:a}}"function"!=typeof Object.assign&&(Object.assign=function(e){for(var n=[],t=1;t<arguments.length;t++)n[t-1]=arguments[t];if(!e)throw TypeError("Cannot convert undefined or null to object");for(var a=function(n){n&&Object.keys(n).forEach((function(t){return e[t]=n[t]}))},i=0,o=n;i<o.length;i++){var r=o[i];a(r)}return e});function k(p,v){var w={config:e(e({},a),I.defaultConfig),l10n:i};function k(){var e;return(null===(e=w.calendarContainer)||void 0===e?void 0:e.getRootNode()).activeElement||document.activeElement}function T(e){return e.bind(w)}function S(){var e=w.config;!1===e.weekNumbers&&1===e.showMonths||!0!==e.noCalendar&&window.requestAnimationFrame((function(){if(void 0!==w.calendarContainer&&(w.calendarContainer.style.visibility="hidden",w.calendarContainer.style.display="block"),void 0!==w.daysContainer){var n=(w.days.offsetWidth+1)*e.showMonths;w.daysContainer.style.width=n+"px",w.calendarContainer.style.width=n+(void 0!==w.weekWrapper?w.weekWrapper.offsetWidth:0)+"px",w.calendarContainer.style.removeProperty("visibility"),w.calendarContainer.style.removeProperty("display")}}))}function _(e){if(0===w.selectedDates.length){var n=void 0===w.config.minDate||M(new Date,w.config.minDate)>=0?new Date:new Date(w.config.minDate.getTime()),t=E(w.config);n.setHours(t.hours,t.minutes,t.seconds,n.getMilliseconds()),w.selectedDates=[n],w.latestSelectedDateObj=n}void 0!==e&&"blur"!==e.type&&function(e){e.preventDefault();var n="keydown"===e.type,t=g(e),a=t;void 0!==w.amPM&&t===w.amPM&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]);var i=parseFloat(a.getAttribute("min")),l=parseFloat(a.getAttribute("max")),c=parseFloat(a.getAttribute("step")),s=parseInt(a.value,10),d=e.delta||(n?38===e.which?1:-1:0),u=s+c*d;if(void 0!==a.value&&2===a.value.length){var f=a===w.hourElement,m=a===w.minuteElement;u<i?(u=l+u+r(!f)+(r(f)&&r(!w.amPM)),m&&L(void 0,-1,w.hourElement)):u>l&&(u=a===w.hourElement?u-l-r(!w.amPM):i,m&&L(void 0,1,w.hourElement)),w.amPM&&f&&(1===c?u+s===23:Math.abs(u-s)>c)&&(w.amPM.textContent=w.l10n.amPM[r(w.amPM.textContent===w.l10n.amPM[0])]),a.value=o(u)}}(e);var a=w._input.value;O(),ye(),w._input.value!==a&&w._debouncedChange()}function O(){if(void 0!==w.hourElement&&void 0!==w.minuteElement){var e,n,t=(parseInt(w.hourElement.value.slice(-2),10)||0)%24,a=(parseInt(w.minuteElement.value,10)||0)%60,i=void 0!==w.secondElement?(parseInt(w.secondElement.value,10)||0)%60:0;void 0!==w.amPM&&(e=t,n=w.amPM.textContent,t=e%12+12*r(n===w.l10n.amPM[1]));var o=void 0!==w.config.minTime||w.config.minDate&&w.minDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.minDate,!0),l=void 0!==w.config.maxTime||w.config.maxDate&&w.maxDateHasTime&&w.latestSelectedDateObj&&0===M(w.latestSelectedDateObj,w.config.maxDate,!0);if(void 0!==w.config.maxTime&&void 0!==w.config.minTime&&w.config.minTime>w.config.maxTime){var c=y(w.config.minTime.getHours(),w.config.minTime.getMinutes(),w.config.minTime.getSeconds()),s=y(w.config.maxTime.getHours(),w.config.maxTime.getMinutes(),w.config.maxTime.getSeconds()),d=y(t,a,i);if(d>s&&d<c){var u=function(e){var n=Math.floor(e/3600),t=(e-3600*n)/60;return[n,t,e-3600*n-60*t]}(c);t=u[0],a=u[1],i=u[2]}}else{if(l){var f=void 0!==w.config.maxTime?w.config.maxTime:w.config.maxDate;(t=Math.min(t,f.getHours()))===f.getHours()&&(a=Math.min(a,f.getMinutes())),a===f.getMinutes()&&(i=Math.min(i,f.getSeconds()))}if(o){var m=void 0!==w.config.minTime?w.config.minTime:w.config.minDate;(t=Math.max(t,m.getHours()))===m.getHours()&&a<m.getMinutes()&&(a=m.getMinutes()),a===m.getMinutes()&&(i=Math.max(i,m.getSeconds()))}}A(t,a,i)}}function F(e){var n=e||w.latestSelectedDateObj;n&&n instanceof Date&&A(n.getHours(),n.getMinutes(),n.getSeconds())}function A(e,n,t){void 0!==w.latestSelectedDateObj&&w.latestSelectedDateObj.setHours(e%24,n,t||0,0),w.hourElement&&w.minuteElement&&!w.isMobile&&(w.hourElement.value=o(w.config.time_24hr?e:(12+e)%12+12*r(e%12==0)),w.minuteElement.value=o(n),void 0!==w.amPM&&(w.amPM.textContent=w.l10n.amPM[r(e>=12)]),void 0!==w.secondElement&&(w.secondElement.value=o(t)))}function N(e){var n=g(e),t=parseInt(n.value)+(e.delta||0);(t/1e3>1||"Enter"===e.key&&!/[^\d]/.test(t.toString()))&&ee(t)}function P(e,n,t,a){return n instanceof Array?n.forEach((function(n){return P(e,n,t,a)})):e instanceof Array?e.forEach((function(e){return P(e,n,t,a)})):(e.addEventListener(n,t,a),void w._handlers.push({remove:function(){return e.removeEventListener(n,t,a)}}))}function Y(){De("onChange")}function j(e,n){var t=void 0!==e?w.parseDate(e):w.latestSelectedDateObj||(w.config.minDate&&w.config.minDate>w.now?w.config.minDate:w.config.maxDate&&w.config.maxDate<w.now?w.config.maxDate:w.now),a=w.currentYear,i=w.currentMonth;try{void 0!==t&&(w.currentYear=t.getFullYear(),w.currentMonth=t.getMonth())}catch(e){e.message="Invalid date supplied: "+t,w.config.errorHandler(e)}n&&w.currentYear!==a&&(De("onYearChange"),q()),!n||w.currentYear===a&&w.currentMonth===i||De("onMonthChange"),w.redraw()}function H(e){var n=g(e);~n.className.indexOf("arrow")&&L(e,n.classList.contains("arrowUp")?1:-1)}function L(e,n,t){var a=e&&g(e),i=t||a&&a.parentNode&&a.parentNode.firstChild,o=we("increment");o.delta=n,i&&i.dispatchEvent(o)}function R(e,n,t,a){var i=ne(n,!0),o=d("span",e,n.getDate().toString());return o.dateObj=n,o.$i=a,o.setAttribute("aria-label",w.formatDate(n,w.config.ariaDateFormat)),-1===e.indexOf("hidden")&&0===M(n,w.now)&&(w.todayDateElem=o,o.classList.add("today"),o.setAttribute("aria-current","date")),i?(o.tabIndex=-1,be(n)&&(o.classList.add("selected"),w.selectedDateElem=o,"range"===w.config.mode&&(s(o,"startRange",w.selectedDates[0]&&0===M(n,w.selectedDates[0],!0)),s(o,"endRange",w.selectedDates[1]&&0===M(n,w.selectedDates[1],!0)),"nextMonthDay"===e&&o.classList.add("inRange")))):o.classList.add("flatpickr-disabled"),"range"===w.config.mode&&function(e){return!("range"!==w.config.mode||w.selectedDates.length<2)&&(M(e,w.selectedDates[0])>=0&&M(e,w.selectedDates[1])<=0)}(n)&&!be(n)&&o.classList.add("inRange"),w.weekNumbers&&1===w.config.showMonths&&"prevMonthDay"!==e&&a%7==6&&w.weekNumbers.insertAdjacentHTML("beforeend","<span class='flatpickr-day'>"+w.config.getWeek(n)+"</span>"),De("onDayCreate",o),o}function W(e){e.focus(),"range"===w.config.mode&&oe(e)}function B(e){for(var n=e>0?0:w.config.showMonths-1,t=e>0?w.config.showMonths:-1,a=n;a!=t;a+=e)for(var i=w.daysContainer.children[a],o=e>0?0:i.children.length-1,r=e>0?i.children.length:-1,l=o;l!=r;l+=e){var c=i.children[l];if(-1===c.className.indexOf("hidden")&&ne(c.dateObj))return c}}function J(e,n){var t=k(),a=te(t||document.body),i=void 0!==e?e:a?t:void 0!==w.selectedDateElem&&te(w.selectedDateElem)?w.selectedDateElem:void 0!==w.todayDateElem&&te(w.todayDateElem)?w.todayDateElem:B(n>0?1:-1);void 0===i?w._input.focus():a?function(e,n){for(var t=-1===e.className.indexOf("Month")?e.dateObj.getMonth():w.currentMonth,a=n>0?w.config.showMonths:-1,i=n>0?1:-1,o=t-w.currentMonth;o!=a;o+=i)for(var r=w.daysContainer.children[o],l=t-w.currentMonth===o?e.$i+n:n<0?r.children.length-1:0,c=r.children.length,s=l;s>=0&&s<c&&s!=(n>0?c:-1);s+=i){var d=r.children[s];if(-1===d.className.indexOf("hidden")&&ne(d.dateObj)&&Math.abs(e.$i-s)>=Math.abs(n))return W(d)}w.changeMonth(i),J(B(i),0)}(i,n):W(i)}function K(e,n){for(var t=(new Date(e,n,1).getDay()-w.l10n.firstDayOfWeek+7)%7,a=w.utils.getDaysInMonth((n-1+12)%12,e),i=w.utils.getDaysInMonth(n,e),o=window.document.createDocumentFragment(),r=w.config.showMonths>1,l=r?"prevMonthDay hidden":"prevMonthDay",c=r?"nextMonthDay hidden":"nextMonthDay",s=a+1-t,u=0;s<=a;s++,u++)o.appendChild(R("flatpickr-day "+l,new Date(e,n-1,s),0,u));for(s=1;s<=i;s++,u++)o.appendChild(R("flatpickr-day",new Date(e,n,s),0,u));for(var f=i+1;f<=42-t&&(1===w.config.showMonths||u%7!=0);f++,u++)o.appendChild(R("flatpickr-day "+c,new Date(e,n+1,f%i),0,u));var m=d("div","dayContainer");return m.appendChild(o),m}function U(){if(void 0!==w.daysContainer){u(w.daysContainer),w.weekNumbers&&u(w.weekNumbers);for(var e=document.createDocumentFragment(),n=0;n<w.config.showMonths;n++){var t=new Date(w.currentYear,w.currentMonth,1);t.setMonth(w.currentMonth+n),e.appendChild(K(t.getFullYear(),t.getMonth()))}w.daysContainer.appendChild(e),w.days=w.daysContainer.firstChild,"range"===w.config.mode&&1===w.selectedDates.length&&oe()}}function q(){if(!(w.config.showMonths>1||"dropdown"!==w.config.monthSelectorType)){var e=function(e){return!(void 0!==w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&e<w.config.minDate.getMonth())&&!(void 0!==w.config.maxDate&&w.currentYear===w.config.maxDate.getFullYear()&&e>w.config.maxDate.getMonth())};w.monthsDropdownContainer.tabIndex=-1,w.monthsDropdownContainer.innerHTML="";for(var n=0;n<12;n++)if(e(n)){var t=d("option","flatpickr-monthDropdown-month");t.value=new Date(w.currentYear,n).getMonth().toString(),t.textContent=h(n,w.config.shorthandCurrentMonth,w.l10n),t.tabIndex=-1,w.currentMonth===n&&(t.selected=!0),w.monthsDropdownContainer.appendChild(t)}}}function $(){var e,n=d("div","flatpickr-month"),t=window.document.createDocumentFragment();w.config.showMonths>1||"static"===w.config.monthSelectorType?e=d("span","cur-month"):(w.monthsDropdownContainer=d("select","flatpickr-monthDropdown-months"),w.monthsDropdownContainer.setAttribute("aria-label",w.l10n.monthAriaLabel),P(w.monthsDropdownContainer,"change",(function(e){var n=g(e),t=parseInt(n.value,10);w.changeMonth(t-w.currentMonth),De("onMonthChange")})),q(),e=w.monthsDropdownContainer);var a=m("cur-year",{tabindex:"-1"}),i=a.getElementsByTagName("input")[0];i.setAttribute("aria-label",w.l10n.yearAriaLabel),w.config.minDate&&i.setAttribute("min",w.config.minDate.getFullYear().toString()),w.config.maxDate&&(i.setAttribute("max",w.config.maxDate.getFullYear().toString()),i.disabled=!!w.config.minDate&&w.config.minDate.getFullYear()===w.config.maxDate.getFullYear());var o=d("div","flatpickr-current-month");return o.appendChild(e),o.appendChild(a),t.appendChild(o),n.appendChild(t),{container:n,yearElement:i,monthElement:e}}function V(){u(w.monthNav),w.monthNav.appendChild(w.prevMonthNav),w.config.showMonths&&(w.yearElements=[],w.monthElements=[]);for(var e=w.config.showMonths;e--;){var n=$();w.yearElements.push(n.yearElement),w.monthElements.push(n.monthElement),w.monthNav.appendChild(n.container)}w.monthNav.appendChild(w.nextMonthNav)}function z(){w.weekdayContainer?u(w.weekdayContainer):w.weekdayContainer=d("div","flatpickr-weekdays");for(var e=w.config.showMonths;e--;){var n=d("div","flatpickr-weekdaycontainer");w.weekdayContainer.appendChild(n)}return G(),w.weekdayContainer}function G(){if(w.weekdayContainer){var e=w.l10n.firstDayOfWeek,t=n(w.l10n.weekdays.shorthand);e>0&&e<t.length&&(t=n(t.splice(e,t.length),t.splice(0,e)));for(var a=w.config.showMonths;a--;)w.weekdayContainer.children[a].innerHTML="\n <span class='flatpickr-weekday'>\n "+t.join("</span><span class='flatpickr-weekday'>")+"\n </span>\n "}}function Z(e,n){void 0===n&&(n=!0);var t=n?e:e-w.currentMonth;t<0&&!0===w._hidePrevMonthArrow||t>0&&!0===w._hideNextMonthArrow||(w.currentMonth+=t,(w.currentMonth<0||w.currentMonth>11)&&(w.currentYear+=w.currentMonth>11?1:-1,w.currentMonth=(w.currentMonth+12)%12,De("onYearChange"),q()),U(),De("onMonthChange"),Ce())}function Q(e){return w.calendarContainer.contains(e)}function X(e){if(w.isOpen&&!w.config.inline){var n=g(e),t=Q(n),a=!(n===w.input||n===w.altInput||w.element.contains(n)||e.path&&e.path.indexOf&&(~e.path.indexOf(w.input)||~e.path.indexOf(w.altInput)))&&!t&&!Q(e.relatedTarget),i=!w.config.ignoredFocusElements.some((function(e){return e.contains(n)}));a&&i&&(w.config.allowInput&&w.setDate(w._input.value,!1,w.config.altInput?w.config.altFormat:w.config.dateFormat),void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement&&""!==w.input.value&&void 0!==w.input.value&&_(),w.close(),w.config&&"range"===w.config.mode&&1===w.selectedDates.length&&w.clear(!1))}}function ee(e){if(!(!e||w.config.minDate&&e<w.config.minDate.getFullYear()||w.config.maxDate&&e>w.config.maxDate.getFullYear())){var n=e,t=w.currentYear!==n;w.currentYear=n||w.currentYear,w.config.maxDate&&w.currentYear===w.config.maxDate.getFullYear()?w.currentMonth=Math.min(w.config.maxDate.getMonth(),w.currentMonth):w.config.minDate&&w.currentYear===w.config.minDate.getFullYear()&&(w.currentMonth=Math.max(w.config.minDate.getMonth(),w.currentMonth)),t&&(w.redraw(),De("onYearChange"),q())}}function ne(e,n){var t;void 0===n&&(n=!0);var a=w.parseDate(e,void 0,n);if(w.config.minDate&&a&&M(a,w.config.minDate,void 0!==n?n:!w.minDateHasTime)<0||w.config.maxDate&&a&&M(a,w.config.maxDate,void 0!==n?n:!w.maxDateHasTime)>0)return!1;if(!w.config.enable&&0===w.config.disable.length)return!0;if(void 0===a)return!1;for(var i=!!w.config.enable,o=null!==(t=w.config.enable)&&void 0!==t?t:w.config.disable,r=0,l=void 0;r<o.length;r++){if("function"==typeof(l=o[r])&&l(a))return i;if(l instanceof Date&&void 0!==a&&l.getTime()===a.getTime())return i;if("string"==typeof l){var c=w.parseDate(l,void 0,!0);return c&&c.getTime()===a.getTime()?i:!i}if("object"==typeof l&&void 0!==a&&l.from&&l.to&&a.getTime()>=l.from.getTime()&&a.getTime()<=l.to.getTime())return i}return!i}function te(e){return void 0!==w.daysContainer&&(-1===e.className.indexOf("hidden")&&-1===e.className.indexOf("flatpickr-disabled")&&w.daysContainer.contains(e))}function ae(e){var n=e.target===w._input,t=w._input.value.trimEnd()!==Me();!n||!t||e.relatedTarget&&Q(e.relatedTarget)||w.setDate(w._input.value,!0,e.target===w.altInput?w.config.altFormat:w.config.dateFormat)}function ie(e){var n=g(e),t=w.config.wrap?p.contains(n):n===w._input,a=w.config.allowInput,i=w.isOpen&&(!a||!t),o=w.config.inline&&t&&!a;if(13===e.keyCode&&t){if(a)return w.setDate(w._input.value,!0,n===w.altInput?w.config.altFormat:w.config.dateFormat),w.close(),n.blur();w.open()}else if(Q(n)||i||o){var r=!!w.timeContainer&&w.timeContainer.contains(n);switch(e.keyCode){case 13:r?(e.preventDefault(),_(),fe()):me(e);break;case 27:e.preventDefault(),fe();break;case 8:case 46:t&&!w.config.allowInput&&(e.preventDefault(),w.clear());break;case 37:case 39:if(r||t)w.hourElement&&w.hourElement.focus();else{e.preventDefault();var l=k();if(void 0!==w.daysContainer&&(!1===a||l&&te(l))){var c=39===e.keyCode?1:-1;e.ctrlKey?(e.stopPropagation(),Z(c),J(B(1),0)):J(void 0,c)}}break;case 38:case 40:e.preventDefault();var s=40===e.keyCode?1:-1;w.daysContainer&&void 0!==n.$i||n===w.input||n===w.altInput?e.ctrlKey?(e.stopPropagation(),ee(w.currentYear-s),J(B(1),0)):r||J(void 0,7*s):n===w.currentYearElement?ee(w.currentYear-s):w.config.enableTime&&(!r&&w.hourElement&&w.hourElement.focus(),_(e),w._debouncedChange());break;case 9:if(r){var d=[w.hourElement,w.minuteElement,w.secondElement,w.amPM].concat(w.pluginElements).filter((function(e){return e})),u=d.indexOf(n);if(-1!==u){var f=d[u+(e.shiftKey?-1:1)];e.preventDefault(),(f||w._input).focus()}}else!w.config.noCalendar&&w.daysContainer&&w.daysContainer.contains(n)&&e.shiftKey&&(e.preventDefault(),w._input.focus())}}if(void 0!==w.amPM&&n===w.amPM)switch(e.key){case w.l10n.amPM[0].charAt(0):case w.l10n.amPM[0].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[0],O(),ye();break;case w.l10n.amPM[1].charAt(0):case w.l10n.amPM[1].charAt(0).toLowerCase():w.amPM.textContent=w.l10n.amPM[1],O(),ye()}(t||Q(n))&&De("onKeyDown",e)}function oe(e,n){if(void 0===n&&(n="flatpickr-day"),1===w.selectedDates.length&&(!e||e.classList.contains(n)&&!e.classList.contains("flatpickr-disabled"))){for(var t=e?e.dateObj.getTime():w.days.firstElementChild.dateObj.getTime(),a=w.parseDate(w.selectedDates[0],void 0,!0).getTime(),i=Math.min(t,w.selectedDates[0].getTime()),o=Math.max(t,w.selectedDates[0].getTime()),r=!1,l=0,c=0,s=i;s<o;s+=x)ne(new Date(s),!0)||(r=r||s>i&&s<o,s<a&&(!l||s>l)?l=s:s>a&&(!c||s<c)&&(c=s));Array.from(w.rContainer.querySelectorAll("*:nth-child(-n+"+w.config.showMonths+") > ."+n)).forEach((function(n){var i,o,s,d=n.dateObj.getTime(),u=l>0&&d<l||c>0&&d>c;if(u)return n.classList.add("notAllowed"),void["inRange","startRange","endRange"].forEach((function(e){n.classList.remove(e)}));r&&!u||(["startRange","inRange","endRange","notAllowed"].forEach((function(e){n.classList.remove(e)})),void 0!==e&&(e.classList.add(t<=w.selectedDates[0].getTime()?"startRange":"endRange"),a<t&&d===a?n.classList.add("startRange"):a>t&&d===a&&n.classList.add("endRange"),d>=l&&(0===c||d<=c)&&(o=a,s=t,(i=d)>Math.min(o,s)&&i<Math.max(o,s))&&n.classList.add("inRange")))}))}}function re(){!w.isOpen||w.config.static||w.config.inline||de()}function le(e){return function(n){var t=w.config["_"+e+"Date"]=w.parseDate(n,w.config.dateFormat),a=w.config["_"+("min"===e?"max":"min")+"Date"];void 0!==t&&(w["min"===e?"minDateHasTime":"maxDateHasTime"]=t.getHours()>0||t.getMinutes()>0||t.getSeconds()>0),w.selectedDates&&(w.selectedDates=w.selectedDates.filter((function(e){return ne(e)})),w.selectedDates.length||"min"!==e||F(t),ye()),w.daysContainer&&(ue(),void 0!==t?w.currentYearElement[e]=t.getFullYear().toString():w.currentYearElement.removeAttribute(e),w.currentYearElement.disabled=!!a&&void 0!==t&&a.getFullYear()===t.getFullYear())}}function ce(){return w.config.wrap?p.querySelector("[data-input]"):p}function se(){"object"!=typeof w.config.locale&&void 0===I.l10ns[w.config.locale]&&w.config.errorHandler(new Error("flatpickr: invalid locale "+w.config.locale)),w.l10n=e(e({},I.l10ns.default),"object"==typeof w.config.locale?w.config.locale:"default"!==w.config.locale?I.l10ns[w.config.locale]:void 0),D.D="("+w.l10n.weekdays.shorthand.join("|")+")",D.l="("+w.l10n.weekdays.longhand.join("|")+")",D.M="("+w.l10n.months.shorthand.join("|")+")",D.F="("+w.l10n.months.longhand.join("|")+")",D.K="("+w.l10n.amPM[0]+"|"+w.l10n.amPM[1]+"|"+w.l10n.amPM[0].toLowerCase()+"|"+w.l10n.amPM[1].toLowerCase()+")",void 0===e(e({},v),JSON.parse(JSON.stringify(p.dataset||{}))).time_24hr&&void 0===I.defaultConfig.time_24hr&&(w.config.time_24hr=w.l10n.time_24hr),w.formatDate=b(w),w.parseDate=C({config:w.config,l10n:w.l10n})}function de(e){if("function"!=typeof w.config.position){if(void 0!==w.calendarContainer){De("onPreCalendarPosition");var n=e||w._positionElement,t=Array.prototype.reduce.call(w.calendarContainer.children,(function(e,n){return e+n.offsetHeight}),0),a=w.calendarContainer.offsetWidth,i=w.config.position.split(" "),o=i[0],r=i.length>1?i[1]:null,l=n.getBoundingClientRect(),c=window.innerHeight-l.bottom,d="above"===o||"below"!==o&&c<t&&l.top>t,u=window.pageYOffset+l.top+(d?-t-2:n.offsetHeight+2);if(s(w.calendarContainer,"arrowTop",!d),s(w.calendarContainer,"arrowBottom",d),!w.config.inline){var f=window.pageXOffset+l.left,m=!1,g=!1;"center"===r?(f-=(a-l.width)/2,m=!0):"right"===r&&(f-=a-l.width,g=!0),s(w.calendarContainer,"arrowLeft",!m&&!g),s(w.calendarContainer,"arrowCenter",m),s(w.calendarContainer,"arrowRight",g);var p=window.document.body.offsetWidth-(window.pageXOffset+l.right),h=f+a>window.document.body.offsetWidth,v=p+a>window.document.body.offsetWidth;if(s(w.calendarContainer,"rightMost",h),!w.config.static)if(w.calendarContainer.style.top=u+"px",h)if(v){var D=function(){for(var e=null,n=0;n<document.styleSheets.length;n++){var t=document.styleSheets[n];if(t.cssRules){try{t.cssRules}catch(e){continue}e=t;break}}return null!=e?e:(a=document.createElement("style"),document.head.appendChild(a),a.sheet);var a}();if(void 0===D)return;var b=window.document.body.offsetWidth,C=Math.max(0,b/2-a/2),M=D.cssRules.length,y="{left:"+l.left+"px;right:auto;}";s(w.calendarContainer,"rightMost",!1),s(w.calendarContainer,"centerMost",!0),D.insertRule(".flatpickr-calendar.centerMost:before,.flatpickr-calendar.centerMost:after"+y,M),w.calendarContainer.style.left=C+"px",w.calendarContainer.style.right="auto"}else w.calendarContainer.style.left="auto",w.calendarContainer.style.right=p+"px";else w.calendarContainer.style.left=f+"px",w.calendarContainer.style.right="auto"}}}else w.config.position(w,e)}function ue(){w.config.noCalendar||w.isMobile||(q(),Ce(),U())}function fe(){w._input.focus(),-1!==window.navigator.userAgent.indexOf("MSIE")||void 0!==navigator.msMaxTouchPoints?setTimeout(w.close,0):w.close()}function me(e){e.preventDefault(),e.stopPropagation();var n=f(g(e),(function(e){return e.classList&&e.classList.contains("flatpickr-day")&&!e.classList.contains("flatpickr-disabled")&&!e.classList.contains("notAllowed")}));if(void 0!==n){var t=n,a=w.latestSelectedDateObj=new Date(t.dateObj.getTime()),i=(a.getMonth()<w.currentMonth||a.getMonth()>w.currentMonth+w.config.showMonths-1)&&"range"!==w.config.mode;if(w.selectedDateElem=t,"single"===w.config.mode)w.selectedDates=[a];else if("multiple"===w.config.mode){var o=be(a);o?w.selectedDates.splice(parseInt(o),1):w.selectedDates.push(a)}else"range"===w.config.mode&&(2===w.selectedDates.length&&w.clear(!1,!1),w.latestSelectedDateObj=a,w.selectedDates.push(a),0!==M(a,w.selectedDates[0],!0)&&w.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()})));if(O(),i){var r=w.currentYear!==a.getFullYear();w.currentYear=a.getFullYear(),w.currentMonth=a.getMonth(),r&&(De("onYearChange"),q()),De("onMonthChange")}if(Ce(),U(),ye(),i||"range"===w.config.mode||1!==w.config.showMonths?void 0!==w.selectedDateElem&&void 0===w.hourElement&&w.selectedDateElem&&w.selectedDateElem.focus():W(t),void 0!==w.hourElement&&void 0!==w.hourElement&&w.hourElement.focus(),w.config.closeOnSelect){var l="single"===w.config.mode&&!w.config.enableTime,c="range"===w.config.mode&&2===w.selectedDates.length&&!w.config.enableTime;(l||c)&&fe()}Y()}}w.parseDate=C({config:w.config,l10n:w.l10n}),w._handlers=[],w.pluginElements=[],w.loadedPlugins=[],w._bind=P,w._setHoursFromDate=F,w._positionCalendar=de,w.changeMonth=Z,w.changeYear=ee,w.clear=function(e,n){void 0===e&&(e=!0);void 0===n&&(n=!0);w.input.value="",void 0!==w.altInput&&(w.altInput.value="");void 0!==w.mobileInput&&(w.mobileInput.value="");w.selectedDates=[],w.latestSelectedDateObj=void 0,!0===n&&(w.currentYear=w._initialDate.getFullYear(),w.currentMonth=w._initialDate.getMonth());if(!0===w.config.enableTime){var t=E(w.config),a=t.hours,i=t.minutes,o=t.seconds;A(a,i,o)}w.redraw(),e&&De("onChange")},w.close=function(){w.isOpen=!1,w.isMobile||(void 0!==w.calendarContainer&&w.calendarContainer.classList.remove("open"),void 0!==w._input&&w._input.classList.remove("active"));De("onClose")},w.onMouseOver=oe,w._createElement=d,w.createDay=R,w.destroy=function(){void 0!==w.config&&De("onDestroy");for(var e=w._handlers.length;e--;)w._handlers[e].remove();if(w._handlers=[],w.mobileInput)w.mobileInput.parentNode&&w.mobileInput.parentNode.removeChild(w.mobileInput),w.mobileInput=void 0;else if(w.calendarContainer&&w.calendarContainer.parentNode)if(w.config.static&&w.calendarContainer.parentNode){var n=w.calendarContainer.parentNode;if(n.lastChild&&n.removeChild(n.lastChild),n.parentNode){for(;n.firstChild;)n.parentNode.insertBefore(n.firstChild,n);n.parentNode.removeChild(n)}}else w.calendarContainer.parentNode.removeChild(w.calendarContainer);w.altInput&&(w.input.type="text",w.altInput.parentNode&&w.altInput.parentNode.removeChild(w.altInput),delete w.altInput);w.input&&(w.input.type=w.input._type,w.input.classList.remove("flatpickr-input"),w.input.removeAttribute("readonly"));["_showTimeInput","latestSelectedDateObj","_hideNextMonthArrow","_hidePrevMonthArrow","__hideNextMonthArrow","__hidePrevMonthArrow","isMobile","isOpen","selectedDateElem","minDateHasTime","maxDateHasTime","days","daysContainer","_input","_positionElement","innerContainer","rContainer","monthNav","todayDateElem","calendarContainer","weekdayContainer","prevMonthNav","nextMonthNav","monthsDropdownContainer","currentMonthElement","currentYearElement","navigationCurrentMonth","selectedDateElem","config"].forEach((function(e){try{delete w[e]}catch(e){}}))},w.isEnabled=ne,w.jumpToDate=j,w.updateValue=ye,w.open=function(e,n){void 0===n&&(n=w._positionElement);if(!0===w.isMobile){if(e){e.preventDefault();var t=g(e);t&&t.blur()}return void 0!==w.mobileInput&&(w.mobileInput.focus(),w.mobileInput.click()),void De("onOpen")}if(w._input.disabled||w.config.inline)return;var a=w.isOpen;w.isOpen=!0,a||(w.calendarContainer.classList.add("open"),w._input.classList.add("active"),De("onOpen"),de(n));!0===w.config.enableTime&&!0===w.config.noCalendar&&(!1!==w.config.allowInput||void 0!==e&&w.timeContainer.contains(e.relatedTarget)||setTimeout((function(){return w.hourElement.select()}),50))},w.redraw=ue,w.set=function(e,n){if(null!==e&&"object"==typeof e)for(var a in Object.assign(w.config,e),e)void 0!==ge[a]&&ge[a].forEach((function(e){return e()}));else w.config[e]=n,void 0!==ge[e]?ge[e].forEach((function(e){return e()})):t.indexOf(e)>-1&&(w.config[e]=c(n));w.redraw(),ye(!0)},w.setDate=function(e,n,t){void 0===n&&(n=!1);void 0===t&&(t=w.config.dateFormat);if(0!==e&&!e||e instanceof Array&&0===e.length)return w.clear(n);pe(e,t),w.latestSelectedDateObj=w.selectedDates[w.selectedDates.length-1],w.redraw(),j(void 0,n),F(),0===w.selectedDates.length&&w.clear(!1);ye(n),n&&De("onChange")},w.toggle=function(e){if(!0===w.isOpen)return w.close();w.open(e)};var ge={locale:[se,G],showMonths:[V,S,z],minDate:[j],maxDate:[j],positionElement:[ve],clickOpens:[function(){!0===w.config.clickOpens?(P(w._input,"focus",w.open),P(w._input,"click",w.open)):(w._input.removeEventListener("focus",w.open),w._input.removeEventListener("click",w.open))}]};function pe(e,n){var t=[];if(e instanceof Array)t=e.map((function(e){return w.parseDate(e,n)}));else if(e instanceof Date||"number"==typeof e)t=[w.parseDate(e,n)];else if("string"==typeof e)switch(w.config.mode){case"single":case"time":t=[w.parseDate(e,n)];break;case"multiple":t=e.split(w.config.conjunction).map((function(e){return w.parseDate(e,n)}));break;case"range":t=e.split(w.l10n.rangeSeparator).map((function(e){return w.parseDate(e,n)}))}else w.config.errorHandler(new Error("Invalid date supplied: "+JSON.stringify(e)));w.selectedDates=w.config.allowInvalidPreload?t:t.filter((function(e){return e instanceof Date&&ne(e,!1)})),"range"===w.config.mode&&w.selectedDates.sort((function(e,n){return e.getTime()-n.getTime()}))}function he(e){return e.slice().map((function(e){return"string"==typeof e||"number"==typeof e||e instanceof Date?w.parseDate(e,void 0,!0):e&&"object"==typeof e&&e.from&&e.to?{from:w.parseDate(e.from,void 0),to:w.parseDate(e.to,void 0)}:e})).filter((function(e){return e}))}function ve(){w._positionElement=w.config.positionElement||w._input}function De(e,n){if(void 0!==w.config){var t=w.config[e];if(void 0!==t&&t.length>0)for(var a=0;t[a]&&a<t.length;a++)t[a](w.selectedDates,w.input.value,w,n);"onChange"===e&&(w.input.dispatchEvent(we("change")),w.input.dispatchEvent(we("input")))}}function we(e){var n=document.createEvent("Event");return n.initEvent(e,!0,!0),n}function be(e){for(var n=0;n<w.selectedDates.length;n++){var t=w.selectedDates[n];if(t instanceof Date&&0===M(t,e))return""+n}return!1}function Ce(){w.config.noCalendar||w.isMobile||!w.monthNav||(w.yearElements.forEach((function(e,n){var t=new Date(w.currentYear,w.currentMonth,1);t.setMonth(w.currentMonth+n),w.config.showMonths>1||"static"===w.config.monthSelectorType?w.monthElements[n].textContent=h(t.getMonth(),w.config.shorthandCurrentMonth,w.l10n)+" ":w.monthsDropdownContainer.value=t.getMonth().toString(),e.value=t.getFullYear().toString()})),w._hidePrevMonthArrow=void 0!==w.config.minDate&&(w.currentYear===w.config.minDate.getFullYear()?w.currentMonth<=w.config.minDate.getMonth():w.currentYear<w.config.minDate.getFullYear()),w._hideNextMonthArrow=void 0!==w.config.maxDate&&(w.currentYear===w.config.maxDate.getFullYear()?w.currentMonth+1>w.config.maxDate.getMonth():w.currentYear>w.config.maxDate.getFullYear()))}function Me(e){var n=e||(w.config.altInput?w.config.altFormat:w.config.dateFormat);return w.selectedDates.map((function(e){return w.formatDate(e,n)})).filter((function(e,n,t){return"range"!==w.config.mode||w.config.enableTime||t.indexOf(e)===n})).join("range"!==w.config.mode?w.config.conjunction:w.l10n.rangeSeparator)}function ye(e){void 0===e&&(e=!0),void 0!==w.mobileInput&&w.mobileFormatStr&&(w.mobileInput.value=void 0!==w.latestSelectedDateObj?w.formatDate(w.latestSelectedDateObj,w.mobileFormatStr):""),w.input.value=Me(w.config.dateFormat),void 0!==w.altInput&&(w.altInput.value=Me(w.config.altFormat)),!1!==e&&De("onValueUpdate")}function xe(e){var n=g(e),t=w.prevMonthNav.contains(n),a=w.nextMonthNav.contains(n);t||a?Z(t?-1:1):w.yearElements.indexOf(n)>=0?n.select():n.classList.contains("arrowUp")?w.changeYear(w.currentYear+1):n.classList.contains("arrowDown")&&w.changeYear(w.currentYear-1)}return function(){w.element=w.input=p,w.isOpen=!1,function(){var n=["wrap","weekNumbers","allowInput","allowInvalidPreload","clickOpens","time_24hr","enableTime","noCalendar","altInput","shorthandCurrentMonth","inline","static","enableSeconds","disableMobile"],i=e(e({},JSON.parse(JSON.stringify(p.dataset||{}))),v),o={};w.config.parseDate=i.parseDate,w.config.formatDate=i.formatDate,Object.defineProperty(w.config,"enable",{get:function(){return w.config._enable},set:function(e){w.config._enable=he(e)}}),Object.defineProperty(w.config,"disable",{get:function(){return w.config._disable},set:function(e){w.config._disable=he(e)}});var r="time"===i.mode;if(!i.dateFormat&&(i.enableTime||r)){var l=I.defaultConfig.dateFormat||a.dateFormat;o.dateFormat=i.noCalendar||r?"H:i"+(i.enableSeconds?":S":""):l+" H:i"+(i.enableSeconds?":S":"")}if(i.altInput&&(i.enableTime||r)&&!i.altFormat){var s=I.defaultConfig.altFormat||a.altFormat;o.altFormat=i.noCalendar||r?"h:i"+(i.enableSeconds?":S K":" K"):s+" h:i"+(i.enableSeconds?":S":"")+" K"}Object.defineProperty(w.config,"minDate",{get:function(){return w.config._minDate},set:le("min")}),Object.defineProperty(w.config,"maxDate",{get:function(){return w.config._maxDate},set:le("max")});var d=function(e){return function(n){w.config["min"===e?"_minTime":"_maxTime"]=w.parseDate(n,"H:i:S")}};Object.defineProperty(w.config,"minTime",{get:function(){return w.config._minTime},set:d("min")}),Object.defineProperty(w.config,"maxTime",{get:function(){return w.config._maxTime},set:d("max")}),"time"===i.mode&&(w.config.noCalendar=!0,w.config.enableTime=!0);Object.assign(w.config,o,i);for(var u=0;u<n.length;u++)w.config[n[u]]=!0===w.config[n[u]]||"true"===w.config[n[u]];t.filter((function(e){return void 0!==w.config[e]})).forEach((function(e){w.config[e]=c(w.config[e]||[]).map(T)})),w.isMobile=!w.config.disableMobile&&!w.config.inline&&"single"===w.config.mode&&!w.config.disable.length&&!w.config.enable&&!w.config.weekNumbers&&/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);for(u=0;u<w.config.plugins.length;u++){var f=w.config.plugins[u](w)||{};for(var m in f)t.indexOf(m)>-1?w.config[m]=c(f[m]).map(T).concat(w.config[m]):void 0===i[m]&&(w.config[m]=f[m])}i.altInputClass||(w.config.altInputClass=ce().className+" "+w.config.altInputClass);De("onParseConfig")}(),se(),function(){if(w.input=ce(),!w.input)return void w.config.errorHandler(new Error("Invalid input element specified"));w.input._type=w.input.type,w.input.type="text",w.input.classList.add("flatpickr-input"),w._input=w.input,w.config.altInput&&(w.altInput=d(w.input.nodeName,w.config.altInputClass),w._input=w.altInput,w.altInput.placeholder=w.input.placeholder,w.altInput.disabled=w.input.disabled,w.altInput.required=w.input.required,w.altInput.tabIndex=w.input.tabIndex,w.altInput.type="text",w.input.setAttribute("type","hidden"),!w.config.static&&w.input.parentNode&&w.input.parentNode.insertBefore(w.altInput,w.input.nextSibling));w.config.allowInput||w._input.setAttribute("readonly","readonly");ve()}(),function(){w.selectedDates=[],w.now=w.parseDate(w.config.now)||new Date;var e=w.config.defaultDate||("INPUT"!==w.input.nodeName&&"TEXTAREA"!==w.input.nodeName||!w.input.placeholder||w.input.value!==w.input.placeholder?w.input.value:null);e&&pe(e,w.config.dateFormat);w._initialDate=w.selectedDates.length>0?w.selectedDates[0]:w.config.minDate&&w.config.minDate.getTime()>w.now.getTime()?w.config.minDate:w.config.maxDate&&w.config.maxDate.getTime()<w.now.getTime()?w.config.maxDate:w.now,w.currentYear=w._initialDate.getFullYear(),w.currentMonth=w._initialDate.getMonth(),w.selectedDates.length>0&&(w.latestSelectedDateObj=w.selectedDates[0]);void 0!==w.config.minTime&&(w.config.minTime=w.parseDate(w.config.minTime,"H:i"));void 0!==w.config.maxTime&&(w.config.maxTime=w.parseDate(w.config.maxTime,"H:i"));w.minDateHasTime=!!w.config.minDate&&(w.config.minDate.getHours()>0||w.config.minDate.getMinutes()>0||w.config.minDate.getSeconds()>0),w.maxDateHasTime=!!w.config.maxDate&&(w.config.maxDate.getHours()>0||w.config.maxDate.getMinutes()>0||w.config.maxDate.getSeconds()>0)}(),w.utils={getDaysInMonth:function(e,n){return void 0===e&&(e=w.currentMonth),void 0===n&&(n=w.currentYear),1===e&&(n%4==0&&n%100!=0||n%400==0)?29:w.l10n.daysInMonth[e]}},w.isMobile||function(){var e=window.document.createDocumentFragment();if(w.calendarContainer=d("div","flatpickr-calendar"),w.calendarContainer.tabIndex=-1,!w.config.noCalendar){if(e.appendChild((w.monthNav=d("div","flatpickr-months"),w.yearElements=[],w.monthElements=[],w.prevMonthNav=d("span","flatpickr-prev-month"),w.prevMonthNav.innerHTML=w.config.prevArrow,w.nextMonthNav=d("span","flatpickr-next-month"),w.nextMonthNav.innerHTML=w.config.nextArrow,V(),Object.defineProperty(w,"_hidePrevMonthArrow",{get:function(){return w.__hidePrevMonthArrow},set:function(e){w.__hidePrevMonthArrow!==e&&(s(w.prevMonthNav,"flatpickr-disabled",e),w.__hidePrevMonthArrow=e)}}),Object.defineProperty(w,"_hideNextMonthArrow",{get:function(){return w.__hideNextMonthArrow},set:function(e){w.__hideNextMonthArrow!==e&&(s(w.nextMonthNav,"flatpickr-disabled",e),w.__hideNextMonthArrow=e)}}),w.currentYearElement=w.yearElements[0],Ce(),w.monthNav)),w.innerContainer=d("div","flatpickr-innerContainer"),w.config.weekNumbers){var n=function(){w.calendarContainer.classList.add("hasWeeks");var e=d("div","flatpickr-weekwrapper");e.appendChild(d("span","flatpickr-weekday",w.l10n.weekAbbreviation));var n=d("div","flatpickr-weeks");return e.appendChild(n),{weekWrapper:e,weekNumbers:n}}(),t=n.weekWrapper,a=n.weekNumbers;w.innerContainer.appendChild(t),w.weekNumbers=a,w.weekWrapper=t}w.rContainer=d("div","flatpickr-rContainer"),w.rContainer.appendChild(z()),w.daysContainer||(w.daysContainer=d("div","flatpickr-days"),w.daysContainer.tabIndex=-1),U(),w.rContainer.appendChild(w.daysContainer),w.innerContainer.appendChild(w.rContainer),e.appendChild(w.innerContainer)}w.config.enableTime&&e.appendChild(function(){w.calendarContainer.classList.add("hasTime"),w.config.noCalendar&&w.calendarContainer.classList.add("noCalendar");var e=E(w.config);w.timeContainer=d("div","flatpickr-time"),w.timeContainer.tabIndex=-1;var n=d("span","flatpickr-time-separator",":"),t=m("flatpickr-hour",{"aria-label":w.l10n.hourAriaLabel});w.hourElement=t.getElementsByTagName("input")[0];var a=m("flatpickr-minute",{"aria-label":w.l10n.minuteAriaLabel});w.minuteElement=a.getElementsByTagName("input")[0],w.hourElement.tabIndex=w.minuteElement.tabIndex=-1,w.hourElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getHours():w.config.time_24hr?e.hours:function(e){switch(e%24){case 0:case 12:return 12;default:return e%12}}(e.hours)),w.minuteElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getMinutes():e.minutes),w.hourElement.setAttribute("step",w.config.hourIncrement.toString()),w.minuteElement.setAttribute("step",w.config.minuteIncrement.toString()),w.hourElement.setAttribute("min",w.config.time_24hr?"0":"1"),w.hourElement.setAttribute("max",w.config.time_24hr?"23":"12"),w.hourElement.setAttribute("maxlength","2"),w.minuteElement.setAttribute("min","0"),w.minuteElement.setAttribute("max","59"),w.minuteElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(t),w.timeContainer.appendChild(n),w.timeContainer.appendChild(a),w.config.time_24hr&&w.timeContainer.classList.add("time24hr");if(w.config.enableSeconds){w.timeContainer.classList.add("hasSeconds");var i=m("flatpickr-second");w.secondElement=i.getElementsByTagName("input")[0],w.secondElement.value=o(w.latestSelectedDateObj?w.latestSelectedDateObj.getSeconds():e.seconds),w.secondElement.setAttribute("step",w.minuteElement.getAttribute("step")),w.secondElement.setAttribute("min","0"),w.secondElement.setAttribute("max","59"),w.secondElement.setAttribute("maxlength","2"),w.timeContainer.appendChild(d("span","flatpickr-time-separator",":")),w.timeContainer.appendChild(i)}w.config.time_24hr||(w.amPM=d("span","flatpickr-am-pm",w.l10n.amPM[r((w.latestSelectedDateObj?w.hourElement.value:w.config.defaultHour)>11)]),w.amPM.title=w.l10n.toggleTitle,w.amPM.tabIndex=-1,w.timeContainer.appendChild(w.amPM));return w.timeContainer}());s(w.calendarContainer,"rangeMode","range"===w.config.mode),s(w.calendarContainer,"animate",!0===w.config.animate),s(w.calendarContainer,"multiMonth",w.config.showMonths>1),w.calendarContainer.appendChild(e);var i=void 0!==w.config.appendTo&&void 0!==w.config.appendTo.nodeType;if((w.config.inline||w.config.static)&&(w.calendarContainer.classList.add(w.config.inline?"inline":"static"),w.config.inline&&(!i&&w.element.parentNode?w.element.parentNode.insertBefore(w.calendarContainer,w._input.nextSibling):void 0!==w.config.appendTo&&w.config.appendTo.appendChild(w.calendarContainer)),w.config.static)){var l=d("div","flatpickr-wrapper");w.element.parentNode&&w.element.parentNode.insertBefore(l,w.element),l.appendChild(w.element),w.altInput&&l.appendChild(w.altInput),l.appendChild(w.calendarContainer)}w.config.static||w.config.inline||(void 0!==w.config.appendTo?w.config.appendTo:window.document.body).appendChild(w.calendarContainer)}(),function(){w.config.wrap&&["open","close","toggle","clear"].forEach((function(e){Array.prototype.forEach.call(w.element.querySelectorAll("[data-"+e+"]"),(function(n){return P(n,"click",w[e])}))}));if(w.isMobile)return void function(){var e=w.config.enableTime?w.config.noCalendar?"time":"datetime-local":"date";w.mobileInput=d("input",w.input.className+" flatpickr-mobile"),w.mobileInput.tabIndex=1,w.mobileInput.type=e,w.mobileInput.disabled=w.input.disabled,w.mobileInput.required=w.input.required,w.mobileInput.placeholder=w.input.placeholder,w.mobileFormatStr="datetime-local"===e?"Y-m-d\\TH:i:S":"date"===e?"Y-m-d":"H:i:S",w.selectedDates.length>0&&(w.mobileInput.defaultValue=w.mobileInput.value=w.formatDate(w.selectedDates[0],w.mobileFormatStr));w.config.minDate&&(w.mobileInput.min=w.formatDate(w.config.minDate,"Y-m-d"));w.config.maxDate&&(w.mobileInput.max=w.formatDate(w.config.maxDate,"Y-m-d"));w.input.getAttribute("step")&&(w.mobileInput.step=String(w.input.getAttribute("step")));w.input.type="hidden",void 0!==w.altInput&&(w.altInput.type="hidden");try{w.input.parentNode&&w.input.parentNode.insertBefore(w.mobileInput,w.input.nextSibling)}catch(e){}P(w.mobileInput,"change",(function(e){w.setDate(g(e).value,!1,w.mobileFormatStr),De("onChange"),De("onClose")}))}();var e=l(re,50);w._debouncedChange=l(Y,300),w.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&P(w.daysContainer,"mouseover",(function(e){"range"===w.config.mode&&oe(g(e))}));P(w._input,"keydown",ie),void 0!==w.calendarContainer&&P(w.calendarContainer,"keydown",ie);w.config.inline||w.config.static||P(window,"resize",e);void 0!==window.ontouchstart?P(window.document,"touchstart",X):P(window.document,"mousedown",X);P(window.document,"focus",X,{capture:!0}),!0===w.config.clickOpens&&(P(w._input,"focus",w.open),P(w._input,"click",w.open));void 0!==w.daysContainer&&(P(w.monthNav,"click",xe),P(w.monthNav,["keyup","increment"],N),P(w.daysContainer,"click",me));if(void 0!==w.timeContainer&&void 0!==w.minuteElement&&void 0!==w.hourElement){var n=function(e){return g(e).select()};P(w.timeContainer,["increment"],_),P(w.timeContainer,"blur",_,{capture:!0}),P(w.timeContainer,"click",H),P([w.hourElement,w.minuteElement],["focus","click"],n),void 0!==w.secondElement&&P(w.secondElement,"focus",(function(){return w.secondElement&&w.secondElement.select()})),void 0!==w.amPM&&P(w.amPM,"click",(function(e){_(e)}))}w.config.allowInput&&P(w._input,"blur",ae)}(),(w.selectedDates.length||w.config.noCalendar)&&(w.config.enableTime&&F(w.config.noCalendar?w.latestSelectedDateObj:void 0),ye(!1)),S();var n=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!w.isMobile&&n&&de(),De("onReady")}(),w}function T(e,n){for(var t=Array.prototype.slice.call(e).filter((function(e){return e instanceof HTMLElement})),a=[],i=0;i<t.length;i++){var o=t[i];try{if(null!==o.getAttribute("data-fp-omit"))continue;void 0!==o._flatpickr&&(o._flatpickr.destroy(),o._flatpickr=void 0),o._flatpickr=k(o,n||{}),a.push(o._flatpickr)}catch(e){console.error(e)}}return 1===a.length?a[0]:a}"undefined"!=typeof HTMLElement&&"undefined"!=typeof HTMLCollection&&"undefined"!=typeof NodeList&&(HTMLCollection.prototype.flatpickr=NodeList.prototype.flatpickr=function(e){return T(this,e)},HTMLElement.prototype.flatpickr=function(e){return T([this],e)});var I=function(e,n){return"string"==typeof e?T(window.document.querySelectorAll(e),n):e instanceof Node?T([e],n):T(e,n)};return I.defaultConfig={},I.l10ns={en:e({},i),default:e({},i)},I.localize=function(n){I.l10ns.default=e(e({},I.l10ns.default),n)},I.setDefaults=function(n){I.defaultConfig=e(e({},I.defaultConfig),n)},I.parseDate=C({}),I.formatDate=b({}),I.compareDates=M,"undefined"!=typeof jQuery&&void 0!==jQuery.fn&&(jQuery.fn.flatpickr=function(e){return T(this,e)}),Date.prototype.fp_incr=function(e){return new Date(this.getFullYear(),this.getMonth(),this.getDate()+("string"==typeof e?parseInt(e,10):e))},"undefined"!=typeof window&&(window.flatpickr=I),I})); +/*! Select2 4.1.0-rc.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(t){var e,n,s,p,r,o,h,f,g,m,y,v,i,a,_,s=((u=t&&t.fn&&t.fn.select2&&t.fn.select2.amd?t.fn.select2.amd:u)&&u.requirejs||(u?n=u:u={},g={},m={},y={},v={},i=Object.prototype.hasOwnProperty,a=[].slice,_=/\.js$/,h=function(e,t){var n,s,i=c(e),r=i[0],t=t[1];return e=i[1],r&&(n=x(r=l(r,t))),r?e=n&&n.normalize?n.normalize(e,(s=t,function(e){return l(e,s)})):l(e,t):(r=(i=c(e=l(e,t)))[0],e=i[1],r&&(n=x(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},f={require:function(e){return w(e)},exports:function(e){var t=g[e];return void 0!==t?t:g[e]={}},module:function(e){return{id:e,uri:"",exports:g[e],config:(t=e,function(){return y&&y.config&&y.config[t]||{}})};var t}},r=function(e,t,n,s){var i,r,o,a,l,c=[],u=typeof n,d=A(s=s||e);if("undefined"==u||"function"==u){for(t=!t.length&&n.length?["require","exports","module"]:t,a=0;a<t.length;a+=1)if("require"===(r=(o=h(t[a],d)).f))c[a]=f.require(e);else if("exports"===r)c[a]=f.exports(e),l=!0;else if("module"===r)i=c[a]=f.module(e);else if(b(g,r)||b(m,r)||b(v,r))c[a]=x(r);else{if(!o.p)throw new Error(e+" missing "+r);o.p.load(o.n,w(s,!0),function(t){return function(e){g[t]=e}}(r),{}),c[a]=g[r]}u=n?n.apply(g[e],c):void 0,e&&(i&&i.exports!==p&&i.exports!==g[e]?g[e]=i.exports:u===p&&l||(g[e]=u))}else e&&(g[e]=n)},e=n=o=function(e,t,n,s,i){if("string"==typeof e)return f[e]?f[e](t):x(h(e,A(t)).f);if(!e.splice){if((y=e).deps&&o(y.deps,y.callback),!t)return;t.splice?(e=t,t=n,n=null):e=p}return t=t||function(){},"function"==typeof n&&(n=s,s=i),s?r(p,e,t,n):setTimeout(function(){r(p,e,t,n)},4),o},o.config=function(e){return o(e)},e._defined=g,(s=function(e,t,n){if("string"!=typeof e)throw new Error("See almond README: incorrect module build, no module name");t.splice||(n=t,t=[]),b(g,e)||b(m,e)||(m[e]=[e,t,n])}).amd={jQuery:!0},u.requirejs=e,u.require=n,u.define=s),u.define("almond",function(){}),u.define("jquery",[],function(){var e=t||$;return null==e&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),e}),u.define("select2/utils",["jquery"],function(r){var s={};function c(e){var t,n=e.prototype,s=[];for(t in n)"function"==typeof n[t]&&"constructor"!==t&&s.push(t);return s}s.Extend=function(e,t){var n,s={}.hasOwnProperty;function i(){this.constructor=e}for(n in t)s.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.__super__=t.prototype,e},s.Decorate=function(s,i){var e=c(i),t=c(s);function r(){var e=Array.prototype.unshift,t=i.prototype.constructor.length,n=s.prototype.constructor;0<t&&(e.call(arguments,s.prototype.constructor),n=i.prototype.constructor),n.apply(this,arguments)}i.displayName=s.displayName,r.prototype=new function(){this.constructor=r};for(var n=0;n<t.length;n++){var o=t[n];r.prototype[o]=s.prototype[o]}for(var a=0;a<e.length;a++){var l=e[a];r.prototype[l]=function(e){var t=function(){};e in r.prototype&&(t=r.prototype[e]);var n=i.prototype[e];return function(){return Array.prototype.unshift.call(arguments,t),n.apply(this,arguments)}}(l)}return r};function e(){this.listeners={}}e.prototype.on=function(e,t){this.listeners=this.listeners||{},e in this.listeners?this.listeners[e].push(t):this.listeners[e]=[t]},e.prototype.trigger=function(e){var t=Array.prototype.slice,n=t.call(arguments,1);this.listeners=this.listeners||{},0===(n=null==n?[]:n).length&&n.push({}),(n[0]._type=e)in this.listeners&&this.invoke(this.listeners[e],t.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},e.prototype.invoke=function(e,t){for(var n=0,s=e.length;n<s;n++)e[n].apply(this,t)},s.Observable=e,s.generateChars=function(e){for(var t="",n=0;n<e;n++)t+=Math.floor(36*Math.random()).toString(36);return t},s.bind=function(e,t){return function(){e.apply(t,arguments)}},s._convertData=function(e){for(var t in e){var n=t.split("-"),s=e;if(1!==n.length){for(var i=0;i<n.length;i++){var r=n[i];(r=r.substring(0,1).toLowerCase()+r.substring(1))in s||(s[r]={}),i==n.length-1&&(s[r]=e[t]),s=s[r]}delete e[t]}}return e},s.hasScroll=function(e,t){var n=r(t),s=t.style.overflowX,i=t.style.overflowY;return(s!==i||"hidden"!==i&&"visible"!==i)&&("scroll"===s||"scroll"===i||(n.innerHeight()<t.scrollHeight||n.innerWidth()<t.scrollWidth))},s.escapeMarkup=function(e){var t={"\\":"\","&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},s.__cache={};var n=0;return s.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null!=t||(t=e.id?"select2-data-"+e.id:"select2-data-"+(++n).toString()+"-"+s.generateChars(4),e.setAttribute("data-select2-id",t)),t},s.StoreData=function(e,t,n){e=s.GetUniqueElementId(e);s.__cache[e]||(s.__cache[e]={}),s.__cache[e][t]=n},s.GetData=function(e,t){var n=s.GetUniqueElementId(e);return t?s.__cache[n]&&null!=s.__cache[n][t]?s.__cache[n][t]:r(e).data(t):s.__cache[n]},s.RemoveData=function(e){var t=s.GetUniqueElementId(e);null!=s.__cache[t]&&delete s.__cache[t],e.removeAttribute("data-select2-id")},s.copyNonInternalCssClasses=function(e,t){var n=(n=e.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0===e.indexOf("select2-")}),t=(t=t.getAttribute("class").trim().split(/\s+/)).filter(function(e){return 0!==e.indexOf("select2-")}),t=n.concat(t);e.setAttribute("class",t.join(" "))},s}),u.define("select2/results",["jquery","./utils"],function(d,p){function s(e,t,n){this.$element=e,this.data=n,this.options=t,s.__super__.constructor.call(this)}return p.Extend(s,p.Observable),s.prototype.render=function(){var e=d('<ul class="select2-results__options" role="listbox"></ul>');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},s.prototype.clear=function(){this.$results.empty()},s.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=d('<li role="alert" aria-live="assertive" class="select2-results__option"></li>'),s=this.options.get("translations").get(e.message);n.append(t(s(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},s.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},s.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n<e.results.length;n++){var s=e.results[n],s=this.option(s);t.push(s)}this.$results.append(t)}else 0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"})},s.prototype.position=function(e,t){t.find(".select2-results").append(e)},s.prototype.sort=function(e){return this.options.get("sorter")(e)},s.prototype.highlightFirstItem=function(){var e=this.$results.find(".select2-results__option--selectable"),t=e.filter(".select2-results__option--selected");(0<t.length?t:e).first().trigger("mouseenter"),this.ensureHighlightVisible()},s.prototype.setClasses=function(){var t=this;this.data.current(function(e){var s=e.map(function(e){return e.id.toString()});t.$results.find(".select2-results__option--selectable").each(function(){var e=d(this),t=p.GetData(this,"data"),n=""+t.id;null!=t.element&&t.element.selected||null==t.element&&-1<s.indexOf(n)?(this.classList.add("select2-results__option--selected"),e.attr("aria-selected","true")):(this.classList.remove("select2-results__option--selected"),e.attr("aria-selected","false"))})})},s.prototype.showLoading=function(e){this.hideLoading();e={disabled:!0,loading:!0,text:this.options.get("translations").get("searching")(e)},e=this.option(e);e.className+=" loading-results",this.$results.prepend(e)},s.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},s.prototype.option=function(e){var t=document.createElement("li");t.classList.add("select2-results__option"),t.classList.add("select2-results__option--selectable");var n,s={role:"option"},i=window.Element.prototype.matches||window.Element.prototype.msMatchesSelector||window.Element.prototype.webkitMatchesSelector;for(n in(null!=e.element&&i.call(e.element,":disabled")||null==e.element&&e.disabled)&&(s["aria-disabled"]="true",t.classList.remove("select2-results__option--selectable"),t.classList.add("select2-results__option--disabled")),null==e.id&&t.classList.remove("select2-results__option--selectable"),null!=e._resultId&&(t.id=e._resultId),e.title&&(t.title=e.title),e.children&&(s.role="group",s["aria-label"]=e.text,t.classList.remove("select2-results__option--selectable"),t.classList.add("select2-results__option--group")),s){var r=s[n];t.setAttribute(n,r)}if(e.children){var o=d(t),a=document.createElement("strong");a.className="select2-results__group",this.template(e,a);for(var l=[],c=0;c<e.children.length;c++){var u=e.children[c],u=this.option(u);l.push(u)}i=d("<ul></ul>",{class:"select2-results__options select2-results__options--nested",role:"none"});i.append(l),o.append(a),o.append(i)}else this.template(e,t);return p.StoreData(t,"data",e),t},s.prototype.bind=function(t,e){var i=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){i.clear(),i.append(e.data),t.isOpen()&&(i.setClasses(),i.highlightFirstItem())}),t.on("results:append",function(e){i.append(e.data),t.isOpen()&&i.setClasses()}),t.on("query",function(e){i.hideMessages(),i.showLoading(e)}),t.on("select",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(i.setClasses(),i.options.get("scrollAfterSelect")&&i.highlightFirstItem())}),t.on("open",function(){i.$results.attr("aria-expanded","true"),i.$results.attr("aria-hidden","false"),i.setClasses(),i.ensureHighlightVisible()}),t.on("close",function(){i.$results.attr("aria-expanded","false"),i.$results.attr("aria-hidden","true"),i.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=i.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e,t=i.getHighlightedResults();0!==t.length&&(e=p.GetData(t[0],"data"),t.hasClass("select2-results__option--selected")?i.trigger("close",{}):i.trigger("select",{data:e}))}),t.on("results:previous",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t);s<=0||(e=s-1,0===t.length&&(e=0),(s=n.eq(e)).trigger("mouseenter"),t=i.$results.offset().top,n=s.offset().top,s=i.$results.scrollTop()+(n-t),0===e?i.$results.scrollTop(0):n-t<0&&i.$results.scrollTop(s))}),t.on("results:next",function(){var e,t=i.getHighlightedResults(),n=i.$results.find(".select2-results__option--selectable"),s=n.index(t)+1;s>=n.length||((e=n.eq(s)).trigger("mouseenter"),t=i.$results.offset().top+i.$results.outerHeight(!1),n=e.offset().top+e.outerHeight(!1),e=i.$results.scrollTop()+n-t,0===s?i.$results.scrollTop(0):t<n&&i.$results.scrollTop(e))}),t.on("results:focus",function(e){e.element[0].classList.add("select2-results__option--highlighted"),e.element[0].setAttribute("aria-selected","true")}),t.on("results:message",function(e){i.displayMessage(e)}),d.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=i.$results.scrollTop(),n=i.$results.get(0).scrollHeight-t+e.deltaY,t=0<e.deltaY&&t-e.deltaY<=0,n=e.deltaY<0&&n<=i.$results.height();t?(i.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):n&&(i.$results.scrollTop(i.$results.get(0).scrollHeight-i.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option--selectable",function(e){var t=d(this),n=p.GetData(this,"data");t.hasClass("select2-results__option--selected")?i.options.get("multiple")?i.trigger("unselect",{originalEvent:e,data:n}):i.trigger("close",{}):i.trigger("select",{originalEvent:e,data:n})}),this.$results.on("mouseenter",".select2-results__option--selectable",function(e){var t=p.GetData(this,"data");i.getHighlightedResults().removeClass("select2-results__option--highlighted").attr("aria-selected","false"),i.trigger("results:focus",{data:t,element:d(this)})})},s.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},s.prototype.destroy=function(){this.$results.remove()},s.prototype.ensureHighlightVisible=function(){var e,t,n,s,i=this.getHighlightedResults();0!==i.length&&(e=this.$results.find(".select2-results__option--selectable").index(i),s=this.$results.offset().top,t=i.offset().top,n=this.$results.scrollTop()+(t-s),s=t-s,n-=2*i.outerHeight(!1),e<=2?this.$results.scrollTop(0):(s>this.$results.outerHeight()||s<0)&&this.$results.scrollTop(n))},s.prototype.template=function(e,t){var n=this.options.get("templateResult"),s=this.options.get("escapeMarkup"),e=n(e,t);null==e?t.style.display="none":"string"==typeof e?t.innerHTML=s(e):d(t).append(e)},s}),u.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),u.define("select2/selection/base",["jquery","../utils","../keys"],function(n,s,i){function r(e,t){this.$element=e,this.options=t,r.__super__.constructor.call(this)}return s.Extend(r,s.Observable),r.prototype.render=function(){var e=n('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=s.GetData(this.$element[0],"old-tabindex")?this._tabindex=s.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},r.prototype.bind=function(e,t){var n=this,s=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",s),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},r.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},r.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&s.GetData(this,"element").select2("close")})})},r.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},r.prototype.position=function(e,t){t.find(".selection").append(e)},r.prototype.destroy=function(){this._detachCloseHandler(this.container)},r.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},r.prototype.isEnabled=function(){return!this.isDisabled()},r.prototype.isDisabled=function(){return this.options.get("disabled")},r}),u.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,s){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e[0].classList.add("select2-selection--single"),e.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var s=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",s),this.$selection.attr("aria-controls",s),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("<span></span>")},i.prototype.update=function(e){var t,n;0!==e.length?(n=e[0],t=this.$selection.find(".select2-selection__rendered"),e=this.display(n,t),t.empty().append(e),(n=n.title||n.text)?t.attr("title",n):t.removeAttr("title")):this.clear()},i}),u.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,c){function r(e,t){r.__super__.constructor.apply(this,arguments)}return c.Extend(r,e),r.prototype.render=function(){var e=r.__super__.render.call(this);return e[0].classList.add("select2-selection--multiple"),e.html('<ul class="select2-selection__rendered"></ul>'),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var s=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",s),this.$selection.on("click",function(e){n.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){var t;n.isDisabled()||(t=i(this).parent(),t=c.GetData(t[0],"data"),n.trigger("unselect",{originalEvent:e,data:t}))}),this.$selection.on("keydown",".select2-selection__choice__remove",function(e){n.isDisabled()||e.stopPropagation()})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return i('<li class="select2-selection__choice"><button type="button" class="select2-selection__choice__remove" tabindex="-1"><span aria-hidden="true">×</span></button><span class="select2-selection__choice__display"></span></li>')},r.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=this.$selection.find(".select2-selection__rendered").attr("id")+"-choice-",s=0;s<e.length;s++){var i=e[s],r=this.selectionContainer(),o=this.display(i,r),a=n+c.generateChars(4)+"-";i.id?a+=i.id:a+=c.generateChars(4),r.find(".select2-selection__choice__display").append(o).attr("id",a);var l=i.title||i.text;l&&r.attr("title",l);o=this.options.get("translations").get("removeItem"),l=r.find(".select2-selection__choice__remove");l.attr("title",o()),l.attr("aria-label",o()),l.attr("aria-describedby",a),c.StoreData(r[0],"data",i),t.push(r)}this.$selection.find(".select2-selection__rendered").append(t)}},r}),u.define("select2/selection/placeholder",[],function(){function e(e,t,n){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n)}return e.prototype.normalizePlaceholder=function(e,t){return t="string"==typeof t?{id:"",text:t}:t},e.prototype.createPlaceholder=function(e,t){var n=this.selectionContainer();n.html(this.display(t)),n[0].classList.add("select2-selection__placeholder"),n[0].classList.remove("select2-selection__choice");t=t.title||t.text||n.text();return this.$selection.find(".select2-selection__rendered").attr("title",t),n},e.prototype.update=function(e,t){var n=1==t.length&&t[0].id!=this.placeholder.id;if(1<t.length||n)return e.call(this,t);this.clear();t=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(t)},e}),u.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(i,s,a){function e(){}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){s._handleClear(e)}),t.on("keypress",function(e){s._handleKeyboardClear(e,t)})},e.prototype._handleClear=function(e,t){if(!this.isDisabled()){var n=this.$selection.find(".select2-selection__clear");if(0!==n.length){t.stopPropagation();var s=a.GetData(n[0],"data"),i=this.$element.val();this.$element.val(this.placeholder.id);var r={data:s};if(this.trigger("clear",r),r.prevented)this.$element.val(i);else{for(var o=0;o<s.length;o++)if(r={data:s[o]},this.trigger("unselect",r),r.prevented)return void this.$element.val(i);this.$element.trigger("input").trigger("change"),this.trigger("toggle",{})}}}},e.prototype._handleKeyboardClear=function(e,t,n){n.isOpen()||t.which!=s.DELETE&&t.which!=s.BACKSPACE||this._handleClear(t)},e.prototype.update=function(e,t){var n,s;e.call(this,t),this.$selection.find(".select2-selection__clear").remove(),this.$selection[0].classList.remove("select2-selection--clearable"),0<this.$selection.find(".select2-selection__placeholder").length||0===t.length||(n=this.$selection.find(".select2-selection__rendered").attr("id"),s=this.options.get("translations").get("removeAllItems"),(e=i('<button type="button" class="select2-selection__clear" tabindex="-1"><span aria-hidden="true">×</span></button>')).attr("title",s()),e.attr("aria-label",s()),e.attr("aria-describedby",n),a.StoreData(e[0],"data",t),this.$selection.prepend(e),this.$selection[0].classList.add("select2-selection--clearable"))},e}),u.define("select2/selection/search",["jquery","../utils","../keys"],function(s,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=this.options.get("translations").get("search"),n=s('<span class="select2-search select2-search--inline"><textarea class="select2-search__field" type="search" tabindex="-1" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" ></textarea></span>');this.$searchContainer=n,this.$search=n.find("textarea"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",t());e=e.call(this);return this._transferTabIndex(),e.append(this.$searchContainer),e},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results",r=t.id+"-container";e.call(this,t,n),s.$search.attr("aria-describedby",r),t.on("open",function(){s.$search.attr("aria-controls",i),s.$search.trigger("focus")}),t.on("close",function(){s.$search.val(""),s.resizeSearch(),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.trigger("focus")}),t.on("enable",function(){s.$search.prop("disabled",!1),s._transferTabIndex()}),t.on("disable",function(){s.$search.prop("disabled",!0)}),t.on("focus",function(e){s.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){s.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){s._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){var t;e.stopPropagation(),s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented(),e.which!==l.BACKSPACE||""!==s.$search.val()||0<(t=s.$selection.find(".select2-selection__choice").last()).length&&(t=a.GetData(t[0],"data"),s.searchRemoveChoice(t),e.preventDefault())}),this.$selection.on("click",".select2-search--inline",function(e){s.$search.val()&&e.stopPropagation()});var t=document.documentMode,o=t&&t<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){o?s.$selection.off("input.search input.searchcheck"):s.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){var t;o&&"input"===e.type?s.$selection.off("input.search input.searchcheck"):(t=e.which)!=l.SHIFT&&t!=l.CTRL&&t!=l.ALT&&t!=l.TAB&&s.handleSearch(e)})},e.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},e.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},e.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.resizeSearch(),n&&this.$search.trigger("focus")},e.prototype.handleSearch=function(){var e;this.resizeSearch(),this._keyUpPrevented||(e=this.$search.val(),this.trigger("query",{term:e})),this._keyUpPrevented=!1},e.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},e.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="100%";""===this.$search.attr("placeholder")&&(e=.75*(this.$search.val().length+1)+"em"),this.$search.css("width",e)},e}),u.define("select2/selection/selectionCss",["../utils"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get("selectionCssClass")||"";return-1!==e.indexOf(":all:")&&(e=e.replace(":all:",""),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define("select2/selection/eventRelay",["jquery"],function(o){function e(){}return e.prototype.bind=function(e,t,n){var s=this,i=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],r=["opening","closing","selecting","unselecting","clearing"];e.call(this,t,n),t.on("*",function(e,t){var n;-1!==i.indexOf(e)&&(t=t||{},n=o.Event("select2:"+e,{params:t}),s.$element.trigger(n),-1!==r.indexOf(e)&&(t.prevented=n.isDefaultPrevented()))})},e}),u.define("select2/translation",["jquery","require"],function(t,n){function s(e){this.dict=e||{}}return s.prototype.all=function(){return this.dict},s.prototype.get=function(e){return this.dict[e]},s.prototype.extend=function(e){this.dict=t.extend({},e.all(),this.dict)},s._cache={},s.loadPath=function(e){var t;return e in s._cache||(t=n(e),s._cache[e]=t),new s(s._cache[e])},s}),u.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),u.define("select2/data/base",["../utils"],function(n){function s(e,t){s.__super__.constructor.call(this)}return n.Extend(s,n.Observable),s.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},s.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},s.prototype.bind=function(e,t){},s.prototype.destroy=function(){},s.prototype.generateResultId=function(e,t){e=e.id+"-result-";return e+=n.generateChars(4),null!=t.id?e+="-"+t.id.toString():e+="-"+n.generateChars(4),e},s}),u.define("select2/data/select",["./base","../utils","jquery"],function(e,a,l){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return a.Extend(n,e),n.prototype.current=function(e){var t=this;e(Array.prototype.map.call(this.$element[0].querySelectorAll(":checked"),function(e){return t.item(l(e))}))},n.prototype.select=function(i){var e,r=this;if(i.selected=!0,null!=i.element&&"option"===i.element.tagName.toLowerCase())return i.element.selected=!0,void this.$element.trigger("input").trigger("change");this.$element.prop("multiple")?this.current(function(e){var t=[];(i=[i]).push.apply(i,e);for(var n=0;n<i.length;n++){var s=i[n].id;-1===t.indexOf(s)&&t.push(s)}r.$element.val(t),r.$element.trigger("input").trigger("change")}):(e=i.id,this.$element.val(e),this.$element.trigger("input").trigger("change"))},n.prototype.unselect=function(i){var r=this;if(this.$element.prop("multiple")){if(i.selected=!1,null!=i.element&&"option"===i.element.tagName.toLowerCase())return i.element.selected=!1,void this.$element.trigger("input").trigger("change");this.current(function(e){for(var t=[],n=0;n<e.length;n++){var s=e[n].id;s!==i.id&&-1===t.indexOf(s)&&t.push(s)}r.$element.val(t),r.$element.trigger("input").trigger("change")})}},n.prototype.bind=function(e,t){var n=this;(this.container=e).on("select",function(e){n.select(e.data)}),e.on("unselect",function(e){n.unselect(e.data)})},n.prototype.destroy=function(){this.$element.find("*").each(function(){a.RemoveData(this)})},n.prototype.query=function(t,e){var n=[],s=this;this.$element.children().each(function(){var e;"option"!==this.tagName.toLowerCase()&&"optgroup"!==this.tagName.toLowerCase()||(e=l(this),e=s.item(e),null!==(e=s.matches(t,e))&&n.push(e))}),e({results:n})},n.prototype.addOptions=function(e){this.$element.append(e)},n.prototype.option=function(e){var t;e.children?(t=document.createElement("optgroup")).label=e.text:void 0!==(t=document.createElement("option")).textContent?t.textContent=e.text:t.innerText=e.text,void 0!==e.id&&(t.value=e.id),e.disabled&&(t.disabled=!0),e.selected&&(t.selected=!0),e.title&&(t.title=e.title);e=this._normalizeItem(e);return e.element=t,a.StoreData(t,"data",e),l(t)},n.prototype.item=function(e){var t={};if(null!=(t=a.GetData(e[0],"data")))return t;var n=e[0];if("option"===n.tagName.toLowerCase())t={id:e.val(),text:e.text(),disabled:e.prop("disabled"),selected:e.prop("selected"),title:e.prop("title")};else if("optgroup"===n.tagName.toLowerCase()){t={text:e.prop("label"),children:[],title:e.prop("title")};for(var s=e.children("option"),i=[],r=0;r<s.length;r++){var o=l(s[r]),o=this.item(o);i.push(o)}t.children=i}return(t=this._normalizeItem(t)).element=e[0],a.StoreData(e[0],"data",t),t},n.prototype._normalizeItem=function(e){e!==Object(e)&&(e={id:e,text:e});return null!=(e=l.extend({},{text:""},e)).id&&(e.id=e.id.toString()),null!=e.text&&(e.text=e.text.toString()),null==e._resultId&&e.id&&null!=this.container&&(e._resultId=this.generateResultId(this.container,e)),l.extend({},{selected:!1,disabled:!1},e)},n.prototype.matches=function(e,t){return this.options.get("matcher")(e,t)},n}),u.define("select2/data/array",["./select","../utils","jquery"],function(e,t,c){function s(e,t){this._dataToConvert=t.get("data")||[],s.__super__.constructor.call(this,e,t)}return t.Extend(s,e),s.prototype.bind=function(e,t){s.__super__.bind.call(this,e,t),this.addOptions(this.convertToOptions(this._dataToConvert))},s.prototype.select=function(n){var e=this.$element.find("option").filter(function(e,t){return t.value==n.id.toString()});0===e.length&&(e=this.option(n),this.addOptions(e)),s.__super__.select.call(this,n)},s.prototype.convertToOptions=function(e){var t=this,n=this.$element.find("option"),s=n.map(function(){return t.item(c(this)).id}).get(),i=[];for(var r=0;r<e.length;r++){var o,a,l=this._normalizeItem(e[r]);0<=s.indexOf(l.id)?(o=n.filter(function(e){return function(){return c(this).val()==e.id}}(l)),a=this.item(o),a=c.extend(!0,{},l,a),a=this.option(a),o.replaceWith(a)):(a=this.option(l),l.children&&(l=this.convertToOptions(l.children),a.append(l)),i.push(a))}return i},s}),u.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,r){function n(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),n.__super__.constructor.call(this,e,t)}return t.Extend(n,e),n.prototype._applyDefaults=function(e){var t={data:function(e){return r.extend({},e,{q:e.term})},transport:function(e,t,n){e=r.ajax(e);return e.then(t),e.fail(n),e}};return r.extend({},t,e,!0)},n.prototype.processResults=function(e){return e},n.prototype.query=function(t,n){var s=this;null!=this._request&&("function"==typeof this._request.abort&&this._request.abort(),this._request=null);var i=r.extend({type:"GET"},this.ajaxOptions);function e(){var e=i.transport(i,function(e){e=s.processResults(e,t);s.options.get("debug")&&window.console&&console.error&&(e&&e.results&&Array.isArray(e.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),n(e)},function(){"status"in e&&(0===e.status||"0"===e.status)||s.trigger("results:message",{message:"errorLoading"})});s._request=e}"function"==typeof i.url&&(i.url=i.url.call(this.$element,t)),"function"==typeof i.data&&(i.data=i.data.call(this.$element,t)),this.ajaxOptions.delay&&null!=t.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(e,this.ajaxOptions.delay)):e()},n}),u.define("select2/data/tags",["jquery"],function(t){function e(e,t,n){var s=n.get("tags"),i=n.get("createTag");void 0!==i&&(this.createTag=i);i=n.get("insertTag");if(void 0!==i&&(this.insertTag=i),e.call(this,t,n),Array.isArray(s))for(var r=0;r<s.length;r++){var o=s[r],o=this._normalizeItem(o),o=this.option(o);this.$element.append(o)}}return e.prototype.query=function(e,c,u){var d=this;this._removeOldTags(),null!=c.term&&null==c.page?e.call(this,c,function e(t,n){for(var s=t.results,i=0;i<s.length;i++){var r=s[i],o=null!=r.children&&!e({results:r.children},!0);if((r.text||"").toUpperCase()===(c.term||"").toUpperCase()||o)return!n&&(t.data=s,void u(t))}if(n)return!0;var a,l=d.createTag(c);null!=l&&((a=d.option(l)).attr("data-select2-tag","true"),d.addOptions([a]),d.insertTag(s,l)),t.results=s,u(t)}):e.call(this,c,u)},e.prototype.createTag=function(e,t){if(null==t.term)return null;t=t.term.trim();return""===t?null:{id:t,text:t}},e.prototype.insertTag=function(e,t,n){t.unshift(n)},e.prototype._removeOldTags=function(e){this.$element.find("option[data-select2-tag]").each(function(){this.selected||t(this).remove()})},e}),u.define("select2/data/tokenizer",["jquery"],function(c){function e(e,t,n){var s=n.get("tokenizer");void 0!==s&&(this.tokenizer=s),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){e.call(this,t,n),this.$search=t.dropdown.$search||t.selection.$search||n.find(".select2-search__field")},e.prototype.query=function(e,t,n){var s=this;t.term=t.term||"";var i=this.tokenizer(t,this.options,function(e){var t,n=s._normalizeItem(e);s.$element.find("option").filter(function(){return c(this).val()===n.id}).length||((t=s.option(n)).attr("data-select2-tag",!0),s._removeOldTags(),s.addOptions([t])),t=n,s.trigger("select",{data:t})});i.term!==t.term&&(this.$search.length&&(this.$search.val(i.term),this.$search.trigger("focus")),t.term=i.term),e.call(this,t,n)},e.prototype.tokenizer=function(e,t,n,s){for(var i=n.get("tokenSeparators")||[],r=t.term,o=0,a=this.createTag||function(e){return{id:e.term,text:e.term}};o<r.length;){var l=r[o];-1!==i.indexOf(l)?(l=r.substr(0,o),null!=(l=a(c.extend({},t,{term:l})))?(s(l),r=r.substr(o+1)||"",o=0):o++):o++}return{term:r}},e}),u.define("select2/data/minimumInputLength",[],function(){function e(e,t,n){this.minimumInputLength=n.get("minimumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",t.term.length<this.minimumInputLength?this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define("select2/data/maximumInputLength",[],function(){function e(e,t,n){this.maximumInputLength=n.get("maximumInputLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){t.term=t.term||"",0<this.maximumInputLength&&t.term.length>this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),u.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("select",function(){s._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var s=this;this._checkIfMaximumSelected(function(){e.call(s,t,n)})},e.prototype._checkIfMaximumSelected=function(e,t){var n=this;this.current(function(e){e=null!=e?e.length:0;0<n.maximumSelectionLength&&e>=n.maximumSelectionLength?n.trigger("results:message",{message:"maximumSelected",args:{maximum:n.maximumSelectionLength}}):t&&t()})},e}),u.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('<span class="select2-dropdown"><span class="select2-results"></span></span>');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),u.define("select2/dropdown/search",["jquery"],function(r){function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("translations").get("search"),e=r('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocorrect="off" autocapitalize="none" spellcheck="false" role="searchbox" aria-autocomplete="list" /></span>');return this.$searchContainer=e,this.$search=e.find("input"),this.$search.prop("autocomplete",this.options.get("autocomplete")),this.$search.attr("aria-label",n()),t.prepend(e),t},e.prototype.bind=function(e,t,n){var s=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){s.trigger("keypress",e),s._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){r(this).off("keyup")}),this.$search.on("keyup input",function(e){s.handleSearch(e)}),t.on("open",function(){s.$search.attr("tabindex",0),s.$search.attr("aria-controls",i),s.$search.trigger("focus"),window.setTimeout(function(){s.$search.trigger("focus")},0)}),t.on("close",function(){s.$search.attr("tabindex",-1),s.$search.removeAttr("aria-controls"),s.$search.removeAttr("aria-activedescendant"),s.$search.val(""),s.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||s.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(s.showSearch(e)?s.$searchContainer[0].classList.remove("select2-search--hide"):s.$searchContainer[0].classList.add("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?s.$search.attr("aria-activedescendant",e.data._resultId):s.$search.removeAttr("aria-activedescendant")})},e.prototype.handleSearch=function(e){var t;this._keyUpPrevented||(t=this.$search.val(),this.trigger("query",{term:t})),this._keyUpPrevented=!1},e.prototype.showSearch=function(e,t){return!0},e}),u.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,s){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,s)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return t="string"==typeof t?{id:"",text:t}:t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),s=t.length-1;0<=s;s--){var i=t[s];this.placeholder.id===i.id&&n.splice(s,1)}return n},e}),u.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,s){this.lastParams={},e.call(this,t,n,s),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("query",function(e){s.lastParams=e,s.loading=!0}),t.on("query:append",function(e){s.lastParams=e,s.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);!this.loading&&e&&(e=this.$results.offset().top+this.$results.outerHeight(!1),this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=e+50&&this.loadMore())},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('<li class="select2-results__option select2-results__option--load-more"role="option" aria-disabled="true"></li>'),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),u.define("select2/dropdown/attachBody",["jquery","../utils"],function(u,o){function e(e,t,n){this.$dropdownParent=u(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("open",function(){s._showDropdown(),s._attachPositioningHandler(t),s._bindContainerResultHandlers(t)}),t.on("close",function(){s._hideDropdown(),s._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t[0].classList.remove("select2"),t[0].classList.add("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=u("<span></span>"),e=e.call(this);return t.append(e),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){var n;this._containerResultsHandlersBound||(n=this,t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0)},e.prototype._attachPositioningHandler=function(e,t){var n=this,s="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id,t=this.$container.parents().filter(o.hasScroll);t.each(function(){o.StoreData(this,"select2-scroll-position",{x:u(this).scrollLeft(),y:u(this).scrollTop()})}),t.on(s,function(e){var t=o.GetData(this,"select2-scroll-position");u(this).scrollTop(t.y)}),u(window).on(s+" "+i+" "+r,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,s="resize.select2."+t.id,t="orientationchange.select2."+t.id;this.$container.parents().filter(o.hasScroll).off(n),u(window).off(n+" "+s+" "+t)},e.prototype._positionDropdown=function(){var e=u(window),t=this.$dropdown[0].classList.contains("select2-dropdown--above"),n=this.$dropdown[0].classList.contains("select2-dropdown--below"),s=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var r={height:this.$container.outerHeight(!1)};r.top=i.top,r.bottom=i.top+r.height;var o=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=a<i.top-o,e=l>i.bottom+o,a={left:i.left,top:r.bottom},l=this.$dropdownParent;"static"===l.css("position")&&(l=l.offsetParent());i={top:0,left:0};(u.contains(document.body,l[0])||l[0].isConnected)&&(i=l.offset()),a.top-=i.top,a.left-=i.left,t||n||(s="below"),e||!c||t?!c&&e&&t&&(s="below"):s="above",("above"==s||t&&"below"!==s)&&(a.top=r.top-i.top-o),null!=s&&(this.$dropdown[0].classList.remove("select2-dropdown--below"),this.$dropdown[0].classList.remove("select2-dropdown--above"),this.$dropdown[0].classList.add("select2-dropdown--"+s),this.$container[0].classList.remove("select2-container--below"),this.$container[0].classList.remove("select2-container--above"),this.$container[0].classList.add("select2-container--"+s)),this.$dropdownContainer.css(a)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),u.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,s){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,s)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,s=0;s<t.length;s++){var i=t[s];i.children?n+=e(i.children):n++}return n}(t.data.results)<this.minimumResultsForSearch)&&e.call(this,t)},e}),u.define("select2/dropdown/selectOnClose",["../utils"],function(s){function e(){}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("close",function(e){s._handleSelectOnClose(e)})},e.prototype._handleSelectOnClose=function(e,t){if(t&&null!=t.originalSelect2Event){var n=t.originalSelect2Event;if("select"===n._type||"unselect"===n._type)return}n=this.getHighlightedResults();n.length<1||(null!=(n=s.GetData(n[0],"data")).element&&n.element.selected||null==n.element&&n.selected||this.trigger("select",{data:n}))},e}),u.define("select2/dropdown/closeOnSelect",[],function(){function e(){}return e.prototype.bind=function(e,t,n){var s=this;e.call(this,t,n),t.on("select",function(e){s._selectTriggered(e)}),t.on("unselect",function(e){s._selectTriggered(e)})},e.prototype._selectTriggered=function(e,t){var n=t.originalEvent;n&&(n.ctrlKey||n.metaKey)||this.trigger("close",{originalEvent:n,originalSelect2Event:t})},e}),u.define("select2/dropdown/dropdownCss",["../utils"],function(n){function e(){}return e.prototype.render=function(e){var t=e.call(this),e=this.options.get("dropdownCssClass")||"";return-1!==e.indexOf(":all:")&&(e=e.replace(":all:",""),n.copyNonInternalCssClasses(t[0],this.$element[0])),t.addClass(e),t},e}),u.define("select2/dropdown/tagsSearchHighlight",["../utils"],function(s){function e(){}return e.prototype.highlightFirstItem=function(e){var t=this.$results.find(".select2-results__option--selectable:not(.select2-results__option--selected)");if(0<t.length){var n=t.first(),t=s.GetData(n[0],"data").element;if(t&&t.getAttribute&&"true"===t.getAttribute("data-select2-tag"))return void n.trigger("mouseenter")}e.call(this)},e}),u.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,e="Please delete "+t+" character";return 1!=t&&(e+="s"),e},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return 1!=e.maximum&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"},removeItem:function(){return"Remove item"},search:function(){return"Search"}}}),u.define("select2/defaults",["jquery","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/selectionCss","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./dropdown/dropdownCss","./dropdown/tagsSearchHighlight","./i18n/en"],function(l,r,o,a,c,u,d,p,h,f,g,t,m,y,v,_,b,$,w,x,A,D,S,E,O,C,L,T,q,I,e){function n(){this.reset()}return n.prototype.apply=function(e){var t;null==(e=l.extend(!0,{},this.defaults,e)).dataAdapter&&(null!=e.ajax?e.dataAdapter=v:null!=e.data?e.dataAdapter=y:e.dataAdapter=m,0<e.minimumInputLength&&(e.dataAdapter=f.Decorate(e.dataAdapter,$)),0<e.maximumInputLength&&(e.dataAdapter=f.Decorate(e.dataAdapter,w)),0<e.maximumSelectionLength&&(e.dataAdapter=f.Decorate(e.dataAdapter,x)),e.tags&&(e.dataAdapter=f.Decorate(e.dataAdapter,_)),null==e.tokenSeparators&&null==e.tokenizer||(e.dataAdapter=f.Decorate(e.dataAdapter,b))),null==e.resultsAdapter&&(e.resultsAdapter=r,null!=e.ajax&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,E)),null!=e.placeholder&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,S)),e.selectOnClose&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,L)),e.tags&&(e.resultsAdapter=f.Decorate(e.resultsAdapter,I))),null==e.dropdownAdapter&&(e.multiple?e.dropdownAdapter=A:(t=f.Decorate(A,D),e.dropdownAdapter=t),0!==e.minimumResultsForSearch&&(e.dropdownAdapter=f.Decorate(e.dropdownAdapter,C)),e.closeOnSelect&&(e.dropdownAdapter=f.Decorate(e.dropdownAdapter,T)),null!=e.dropdownCssClass&&(e.dropdownAdapter=f.Decorate(e.dropdownAdapter,q)),e.dropdownAdapter=f.Decorate(e.dropdownAdapter,O)),null==e.selectionAdapter&&(e.multiple?e.selectionAdapter=a:e.selectionAdapter=o,null!=e.placeholder&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,c)),e.allowClear&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,u)),e.multiple&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,d)),null!=e.selectionCssClass&&(e.selectionAdapter=f.Decorate(e.selectionAdapter,p)),e.selectionAdapter=f.Decorate(e.selectionAdapter,h)),e.language=this._resolveLanguage(e.language),e.language.push("en");for(var n=[],s=0;s<e.language.length;s++){var i=e.language[s];-1===n.indexOf(i)&&n.push(i)}return e.language=n,e.translations=this._processTranslations(e.language,e.debug),e},n.prototype.reset=function(){function a(e){return e.replace(/[^\u0000-\u007E]/g,function(e){return t[e]||e})}this.defaults={amdLanguageBase:"./i18n/",autocomplete:"off",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:f.escapeMarkup,language:{},matcher:function e(t,n){if(null==t.term||""===t.term.trim())return n;if(n.children&&0<n.children.length){for(var s=l.extend(!0,{},n),i=n.children.length-1;0<=i;i--)null==e(t,n.children[i])&&s.children.splice(i,1);return 0<s.children.length?s:e(t,s)}var r=a(n.text).toUpperCase(),o=a(t.term).toUpperCase();return-1<r.indexOf(o)?n:null},minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,scrollAfterSelect:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},n.prototype.applyFromElement=function(e,t){var n=e.language,s=this.defaults.language,i=t.prop("lang"),t=t.closest("[lang]").prop("lang"),t=Array.prototype.concat.call(this._resolveLanguage(i),this._resolveLanguage(n),this._resolveLanguage(s),this._resolveLanguage(t));return e.language=t,e},n.prototype._resolveLanguage=function(e){if(!e)return[];if(l.isEmptyObject(e))return[];if(l.isPlainObject(e))return[e];for(var t,n=Array.isArray(e)?e:[e],s=[],i=0;i<n.length;i++)s.push(n[i]),"string"==typeof n[i]&&0<n[i].indexOf("-")&&(t=n[i].split("-")[0],s.push(t));return s},n.prototype._processTranslations=function(e,t){for(var n=new g,s=0;s<e.length;s++){var i=new g,r=e[s];if("string"==typeof r)try{i=g.loadPath(r)}catch(e){try{r=this.defaults.amdLanguageBase+r,i=g.loadPath(r)}catch(e){t&&window.console&&console.warn&&console.warn('Select2: The language file for "'+r+'" could not be automatically loaded. A fallback will be used instead.')}}else i=l.isPlainObject(r)?new g(r):r;n.extend(i)}return n},n.prototype.set=function(e,t){var n={};n[l.camelCase(e)]=t;n=f._convertData(n);l.extend(!0,this.defaults,n)},new n}),u.define("select2/options",["jquery","./defaults","./utils"],function(c,n,u){function e(e,t){this.options=e,null!=t&&this.fromElement(t),null!=t&&(this.options=n.applyFromElement(this.options,t)),this.options=n.apply(this.options)}return e.prototype.fromElement=function(e){var t=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.autocomplete&&e.prop("autocomplete")&&(this.options.autocomplete=e.prop("autocomplete")),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),u.GetData(e[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),u.StoreData(e[0],"data",u.GetData(e[0],"select2Tags")),u.StoreData(e[0],"tags",!0)),u.GetData(e[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",u.GetData(e[0],"ajaxUrl")),u.StoreData(e[0],"ajax-Url",u.GetData(e[0],"ajaxUrl")));var n={};function s(e,t){return t.toUpperCase()}for(var i=0;i<e[0].attributes.length;i++){var r=e[0].attributes[i].name,o="data-";r.substr(0,o.length)==o&&(r=r.substring(o.length),o=u.GetData(e[0],r),n[r.replace(/-([a-z])/g,s)]=o)}c.fn.jquery&&"1."==c.fn.jquery.substr(0,2)&&e[0].dataset&&(n=c.extend(!0,{},e[0].dataset,n));var a,l=c.extend(!0,{},u.GetData(e[0]),n);for(a in l=u._convertData(l))-1<t.indexOf(a)||(c.isPlainObject(this.options[a])?c.extend(this.options[a],l[a]):this.options[a]=l[a]);return this},e.prototype.get=function(e){return this.options[e]},e.prototype.set=function(e,t){this.options[e]=t},e}),u.define("select2/core",["jquery","./options","./utils","./keys"],function(t,i,r,s){var o=function(e,t){null!=r.GetData(e[0],"select2")&&r.GetData(e[0],"select2").destroy(),this.$element=e,this.id=this._generateId(e),t=t||{},this.options=new i(t,e),o.__super__.constructor.call(this);var n=e.attr("tabindex")||0;r.StoreData(e[0],"old-tabindex",n),e.attr("tabindex","-1");t=this.options.get("dataAdapter");this.dataAdapter=new t(e,this.options);n=this.render();this._placeContainer(n);t=this.options.get("selectionAdapter");this.selection=new t(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,n);t=this.options.get("dropdownAdapter");this.dropdown=new t(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,n);n=this.options.get("resultsAdapter");this.results=new n(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var s=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){s.trigger("selection:update",{data:e})}),e[0].classList.add("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),r.StoreData(e[0],"select2",this),e.data("select2",this)};return r.Extend(o,r.Observable),o.prototype._generateId=function(e){return"select2-"+(null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+r.generateChars(2):r.generateChars(4)).replace(/(:|\.|\[|\]|,)/g,"")},o.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},o.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var s=this._resolveWidth(e,"style");return null!=s?s:this._resolveWidth(e,"element")}if("element"==t){s=e.outerWidth(!1);return s<=0?"auto":s+"px"}if("style"!=t)return"computedstyle"!=t?t:window.getComputedStyle(e[0]).width;e=e.attr("style");if("string"!=typeof e)return null;for(var i=e.split(";"),r=0,o=i.length;r<o;r+=1){var a=i[r].replace(/\s/g,"").match(n);if(null!==a&&1<=a.length)return a[1]}return null},o.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},o.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this.$element.on("focus.select2",function(e){t.trigger("focus",e)}),this._syncA=r.bind(this._syncAttributes,this),this._syncS=r.bind(this._syncSubtree,this),this._observer=new window.MutationObserver(function(e){t._syncA(),t._syncS(e)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})},o.prototype._registerDataEvents=function(){var n=this;this.dataAdapter.on("*",function(e,t){n.trigger(e,t)})},o.prototype._registerSelectionEvents=function(){var n=this,s=["toggle","focus"];this.selection.on("toggle",function(){n.toggleDropdown()}),this.selection.on("focus",function(e){n.focus(e)}),this.selection.on("*",function(e,t){-1===s.indexOf(e)&&n.trigger(e,t)})},o.prototype._registerDropdownEvents=function(){var n=this;this.dropdown.on("*",function(e,t){n.trigger(e,t)})},o.prototype._registerResultsEvents=function(){var n=this;this.results.on("*",function(e,t){n.trigger(e,t)})},o.prototype._registerEvents=function(){var n=this;this.on("open",function(){n.$container[0].classList.add("select2-container--open")}),this.on("close",function(){n.$container[0].classList.remove("select2-container--open")}),this.on("enable",function(){n.$container[0].classList.remove("select2-container--disabled")}),this.on("disable",function(){n.$container[0].classList.add("select2-container--disabled")}),this.on("blur",function(){n.$container[0].classList.remove("select2-container--focus")}),this.on("query",function(t){n.isOpen()||n.trigger("open",{}),this.dataAdapter.query(t,function(e){n.trigger("results:all",{data:e,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(e){n.trigger("results:append",{data:e,query:t})})}),this.on("keypress",function(e){var t=e.which;n.isOpen()?t===s.ESC||t===s.UP&&e.altKey?(n.close(e),e.preventDefault()):t===s.ENTER||t===s.TAB?(n.trigger("results:select",{}),e.preventDefault()):t===s.SPACE&&e.ctrlKey?(n.trigger("results:toggle",{}),e.preventDefault()):t===s.UP?(n.trigger("results:previous",{}),e.preventDefault()):t===s.DOWN&&(n.trigger("results:next",{}),e.preventDefault()):(t===s.ENTER||t===s.SPACE||t===s.DOWN&&e.altKey)&&(n.open(),e.preventDefault())})},o.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.isDisabled()?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},o.prototype._isChangeMutation=function(e){var t=this;if(e.addedNodes&&0<e.addedNodes.length){for(var n=0;n<e.addedNodes.length;n++)if(e.addedNodes[n].selected)return!0}else{if(e.removedNodes&&0<e.removedNodes.length)return!0;if(Array.isArray(e))return e.some(function(e){return t._isChangeMutation(e)})}return!1},o.prototype._syncSubtree=function(e){var e=this._isChangeMutation(e),t=this;e&&this.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})},o.prototype.trigger=function(e,t){var n=o.__super__.trigger,s={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===t&&(t={}),e in s){var i=s[e],s={prevented:!1,name:e,args:t};if(n.call(this,i,s),s.prevented)return void(t.prevented=!0)}n.call(this,e,t)},o.prototype.toggleDropdown=function(){this.isDisabled()||(this.isOpen()?this.close():this.open())},o.prototype.open=function(){this.isOpen()||this.isDisabled()||this.trigger("query",{})},o.prototype.close=function(e){this.isOpen()&&this.trigger("close",{originalEvent:e})},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o.prototype.isOpen=function(){return this.$container[0].classList.contains("select2-container--open")},o.prototype.hasFocus=function(){return this.$container[0].classList.contains("select2-container--focus")},o.prototype.focus=function(e){this.hasFocus()||(this.$container[0].classList.add("select2-container--focus"),this.trigger("focus",{}))},o.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.');e=!(e=null==e||0===e.length?[!0]:e)[0];this.$element.prop("disabled",e)},o.prototype.data=function(){this.options.get("debug")&&0<arguments.length&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var t=[];return this.dataAdapter.current(function(e){t=e}),t},o.prototype.val=function(e){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==e||0===e.length)return this.$element.val();e=e[0];Array.isArray(e)&&(e=e.map(function(e){return e.toString()})),this.$element.val(e).trigger("input").trigger("change")},o.prototype.destroy=function(){r.RemoveData(this.$container[0]),this.$container.remove(),this._observer.disconnect(),this._observer=null,this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",r.GetData(this.$element[0],"old-tabindex")),this.$element[0].classList.remove("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),r.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},o.prototype.render=function(){var e=t('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container[0].classList.add("select2-container--"+this.options.get("theme")),r.StoreData(e[0],"element",this.$element),e},o}),u.define("jquery-mousewheel",["jquery"],function(e){return e}),u.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,r,t,o){var a;return null==i.fn.select2&&(a=["open","close","destroy"],i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new r(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,s=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=o.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,s)}),-1<a.indexOf(t)?this:n}),null==i.fn.select2.defaults&&(i.fn.select2.defaults=t),r}),{define:u.define,require:u.require});function b(e,t){return i.call(e,t)}function l(e,t){var n,s,i,r,o,a,l,c,u,d,p=t&&t.split("/"),h=y.map,f=h&&h["*"]||{};if(e){for(t=(e=e.split("/")).length-1,y.nodeIdCompat&&_.test(e[t])&&(e[t]=e[t].replace(_,"")),"."===e[0].charAt(0)&&p&&(e=p.slice(0,p.length-1).concat(e)),c=0;c<e.length;c++)"."===(d=e[c])?(e.splice(c,1),--c):".."===d&&(0===c||1===c&&".."===e[2]||".."===e[c-1]||0<c&&(e.splice(c-1,2),c-=2));e=e.join("/")}if((p||f)&&h){for(c=(n=e.split("/")).length;0<c;--c){if(s=n.slice(0,c).join("/"),p)for(u=p.length;0<u;--u)if(i=h[p.slice(0,u).join("/")],i=i&&i[s]){r=i,o=c;break}if(r)break;!a&&f&&f[s]&&(a=f[s],l=c)}!r&&a&&(r=a,o=l),r&&(n.splice(0,o,r),e=n.join("/"))}return e}function w(t,n){return function(){var e=a.call(arguments,0);return"string"!=typeof e[0]&&1===e.length&&e.push(null),o.apply(p,e.concat([t,n]))}}function x(e){var t;if(b(m,e)&&(t=m[e],delete m[e],v[e]=!0,r.apply(p,t)),!b(g,e)&&!b(v,e))throw new Error("No "+e);return g[e]}function c(e){var t,n=e?e.indexOf("!"):-1;return-1<n&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function A(e){return e?c(e):[]}var u=s.require("jquery.select2");return t.fn.select2.amd=s,u}); +!function(t,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s():"function"==typeof define&&define.amd?define(s):(t||self).Typed=s()}(this,function(){function t(){return t=Object.assign?Object.assign.bind():function(t){for(var s=1;s<arguments.length;s++){var e=arguments[s];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])}return t},t.apply(this,arguments)}var s={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,smartBackspace:!0,shuffle:!1,backDelay:700,fadeOut:!1,fadeOutClass:"typed-fade-out",fadeOutDelay:500,loop:!1,loopCount:Infinity,showCursor:!0,cursorChar:"|",autoInsertCss:!0,attr:null,bindInputFocusEvents:!1,contentType:"html",onBegin:function(t){},onComplete:function(t){},preStringTyped:function(t,s){},onStringTyped:function(t,s){},onLastStringBackspaced:function(t){},onTypingPaused:function(t,s){},onTypingResumed:function(t,s){},onReset:function(t){},onStop:function(t,s){},onStart:function(t,s){},onDestroy:function(t){}},e=new(/*#__PURE__*/function(){function e(){}var n=e.prototype;return n.load=function(e,n,i){if(e.el="string"==typeof i?document.querySelector(i):i,e.options=t({},s,n),e.isInput="input"===e.el.tagName.toLowerCase(),e.attr=e.options.attr,e.bindInputFocusEvents=e.options.bindInputFocusEvents,e.showCursor=!e.isInput&&e.options.showCursor,e.cursorChar=e.options.cursorChar,e.cursorBlinking=!0,e.elContent=e.attr?e.el.getAttribute(e.attr):e.el.textContent,e.contentType=e.options.contentType,e.typeSpeed=e.options.typeSpeed,e.startDelay=e.options.startDelay,e.backSpeed=e.options.backSpeed,e.smartBackspace=e.options.smartBackspace,e.backDelay=e.options.backDelay,e.fadeOut=e.options.fadeOut,e.fadeOutClass=e.options.fadeOutClass,e.fadeOutDelay=e.options.fadeOutDelay,e.isPaused=!1,e.strings=e.options.strings.map(function(t){return t.trim()}),e.stringsElement="string"==typeof e.options.stringsElement?document.querySelector(e.options.stringsElement):e.options.stringsElement,e.stringsElement){e.strings=[],e.stringsElement.style.cssText="clip: rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px;";var r=Array.prototype.slice.apply(e.stringsElement.children),o=r.length;if(o)for(var a=0;a<o;a+=1)e.strings.push(r[a].innerHTML.trim())}for(var u in e.strPos=0,e.currentElContent=this.getCurrentElContent(e),e.currentElContent&&e.currentElContent.length>0&&(e.strPos=e.currentElContent.length-1,e.strings.unshift(e.currentElContent)),e.sequence=[],e.strings)e.sequence[u]=u;e.arrayPos=0,e.stopNum=0,e.loop=e.options.loop,e.loopCount=e.options.loopCount,e.curLoop=0,e.shuffle=e.options.shuffle,e.pause={status:!1,typewrite:!0,curString:"",curStrPos:0},e.typingComplete=!1,e.autoInsertCss=e.options.autoInsertCss,e.autoInsertCss&&(this.appendCursorAnimationCss(e),this.appendFadeOutAnimationCss(e))},n.getCurrentElContent=function(t){return t.attr?t.el.getAttribute(t.attr):t.isInput?t.el.value:"html"===t.contentType?t.el.innerHTML:t.el.textContent},n.appendCursorAnimationCss=function(t){var s="data-typed-js-cursor-css";if(t.showCursor&&!document.querySelector("["+s+"]")){var e=document.createElement("style");e.setAttribute(s,"true"),e.innerHTML="\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n ",document.body.appendChild(e)}},n.appendFadeOutAnimationCss=function(t){var s="data-typed-fadeout-js-css";if(t.fadeOut&&!document.querySelector("["+s+"]")){var e=document.createElement("style");e.setAttribute(s,"true"),e.innerHTML="\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n ",document.body.appendChild(e)}},e}()),n=new(/*#__PURE__*/function(){function t(){}var s=t.prototype;return s.typeHtmlChars=function(t,s,e){if("html"!==e.contentType)return s;var n=t.substring(s).charAt(0);if("<"===n||"&"===n){var i;for(i="<"===n?">":";";t.substring(s+1).charAt(0)!==i&&!(1+ ++s>t.length););s++}return s},s.backSpaceHtmlChars=function(t,s,e){if("html"!==e.contentType)return s;var n=t.substring(s).charAt(0);if(">"===n||";"===n){var i;for(i=">"===n?"<":"&";t.substring(s-1).charAt(0)!==i&&!(--s<0););s--}return s},t}());/*#__PURE__*/ +return function(){function t(t,s){e.load(this,s,t),this.begin()}var s=t.prototype;return s.toggle=function(){this.pause.status?this.start():this.stop()},s.stop=function(){this.typingComplete||this.pause.status||(this.toggleBlinking(!0),this.pause.status=!0,this.options.onStop(this.arrayPos,this))},s.start=function(){this.typingComplete||this.pause.status&&(this.pause.status=!1,this.pause.typewrite?this.typewrite(this.pause.curString,this.pause.curStrPos):this.backspace(this.pause.curString,this.pause.curStrPos),this.options.onStart(this.arrayPos,this))},s.destroy=function(){this.reset(!1),this.options.onDestroy(this)},s.reset=function(t){void 0===t&&(t=!0),clearInterval(this.timeout),this.replaceText(""),this.cursor&&this.cursor.parentNode&&(this.cursor.parentNode.removeChild(this.cursor),this.cursor=null),this.strPos=0,this.arrayPos=0,this.curLoop=0,t&&(this.insertCursor(),this.options.onReset(this),this.begin())},s.begin=function(){var t=this;this.options.onBegin(this),this.typingComplete=!1,this.shuffleStringsIfNeeded(this),this.insertCursor(),this.bindInputFocusEvents&&this.bindFocusEvents(),this.timeout=setTimeout(function(){0===t.strPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos):t.backspace(t.strings[t.sequence[t.arrayPos]],t.strPos)},this.startDelay)},s.typewrite=function(t,s){var e=this;this.fadeOut&&this.el.classList.contains(this.fadeOutClass)&&(this.el.classList.remove(this.fadeOutClass),this.cursor&&this.cursor.classList.remove(this.fadeOutClass));var i=this.humanizer(this.typeSpeed),r=1;!0!==this.pause.status?this.timeout=setTimeout(function(){s=n.typeHtmlChars(t,s,e);var i=0,o=t.substring(s);if("^"===o.charAt(0)&&/^\^\d+/.test(o)){var a=1;a+=(o=/\d+/.exec(o)[0]).length,i=parseInt(o),e.temporaryPause=!0,e.options.onTypingPaused(e.arrayPos,e),t=t.substring(0,s)+t.substring(s+a),e.toggleBlinking(!0)}if("`"===o.charAt(0)){for(;"`"!==t.substring(s+r).charAt(0)&&(r++,!(s+r>t.length)););var u=t.substring(0,s),p=t.substring(u.length+1,s+r),c=t.substring(s+r+1);t=u+p+c,r--}e.timeout=setTimeout(function(){e.toggleBlinking(!1),s>=t.length?e.doneTyping(t,s):e.keepTyping(t,s,r),e.temporaryPause&&(e.temporaryPause=!1,e.options.onTypingResumed(e.arrayPos,e))},i)},i):this.setPauseStatus(t,s,!0)},s.keepTyping=function(t,s,e){0===s&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this));var n=t.substring(0,s+=e);this.replaceText(n),this.typewrite(t,s)},s.doneTyping=function(t,s){var e=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),!1===this.loop||this.curLoop===this.loopCount)||(this.timeout=setTimeout(function(){e.backspace(t,s)},this.backDelay))},s.backspace=function(t,s){var e=this;if(!0!==this.pause.status){if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var i=this.humanizer(this.backSpeed);this.timeout=setTimeout(function(){s=n.backSpaceHtmlChars(t,s,e);var i=t.substring(0,s);if(e.replaceText(i),e.smartBackspace){var r=e.strings[e.arrayPos+1];e.stopNum=r&&i===r.substring(0,s)?s:0}s>e.stopNum?(s--,e.backspace(t,s)):s<=e.stopNum&&(e.arrayPos++,e.arrayPos===e.strings.length?(e.arrayPos=0,e.options.onLastStringBackspaced(),e.shuffleStringsIfNeeded(),e.begin()):e.typewrite(e.strings[e.sequence[e.arrayPos]],s))},i)}else this.setPauseStatus(t,s,!1)},s.complete=function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0},s.setPauseStatus=function(t,s,e){this.pause.typewrite=e,this.pause.curString=t,this.pause.curStrPos=s},s.toggleBlinking=function(t){this.cursor&&(this.pause.status||this.cursorBlinking!==t&&(this.cursorBlinking=t,t?this.cursor.classList.add("typed-cursor--blink"):this.cursor.classList.remove("typed-cursor--blink")))},s.humanizer=function(t){return Math.round(Math.random()*t/2)+t},s.shuffleStringsIfNeeded=function(){this.shuffle&&(this.sequence=this.sequence.sort(function(){return Math.random()-.5}))},s.initFadeOut=function(){var t=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout(function(){t.arrayPos++,t.replaceText(""),t.strings.length>t.arrayPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],0):(t.typewrite(t.strings[0],0),t.arrayPos=0)},this.fadeOutDelay)},s.replaceText=function(t){this.attr?this.el.setAttribute(this.attr,t):this.isInput?this.el.value=t:"html"===this.contentType?this.el.innerHTML=t:this.el.textContent=t},s.bindFocusEvents=function(){var t=this;this.isInput&&(this.el.addEventListener("focus",function(s){t.stop()}),this.el.addEventListener("blur",function(s){t.el.value&&0!==t.el.value.length||t.start()}))},s.insertCursor=function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.setAttribute("aria-hidden",!0),this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))},t}()}); +//# sourceMappingURL=typed.umd.js.map + /*! jQuery UI - v1.12.1 - 2021-07-14 * http://jqueryui.com * Includes: widget.js, position.js, jquery-1-7.js, keycode.js, unique-id.js, widgets/autocomplete.js, widgets/menu.js @@ -207,19 +215,6 @@ function checkAll(bx) { } } -/* - * jQuery dotdotdot 1.8.1 - * - * Copyright (c) Fred Heusschen - * www.frebsite.nl - * - * Plugin website: - * dotdotdot.frebsite.nl - * - * Licensed under the MIT license. - * http://en.wikipedia.org/wiki/MIT_License - */ -!function(t,e){function n(t,e,n){var r=t.children(),o=!1;t.empty();for(var i=0,d=r.length;d>i;i++){var l=r.eq(i);if(t.append(l),n&&t.append(n),a(t,e)){l.remove(),o=!0;break}n&&n.detach()}return o}function r(e,n,i,d,l){var s=!1,c="a, table, thead, tbody, tfoot, tr, col, colgroup, object, embed, param, ol, ul, dl, blockquote, select, optgroup, option, textarea, script, style",u="script, .dotdotdot-keep";return e.contents().detach().each(function(){var h=this,f=t(h);if("undefined"==typeof h)return!0;if(f.is(u))e.append(f);else{if(s)return!0;e.append(f),!l||f.is(d.after)||f.find(d.after).length||e[e.is(c)?"after":"append"](l),a(i,d)&&(s=3==h.nodeType?o(f,n,i,d,l):r(f,n,i,d,l)),s||l&&l.detach()}}),n.addClass("is-truncated"),s}function o(e,n,r,o,d){var c=e[0];if(!c)return!1;var h=s(c),f=-1!==h.indexOf(" ")?" ":" ",p="letter"==o.wrap?"":f,g=h.split(p),v=-1,w=-1,b=0,y=g.length-1;for(o.fallbackToLetter&&0==b&&0==y&&(p="",g=h.split(p),y=g.length-1);y>=b&&(0!=b||0!=y);){var m=Math.floor((b+y)/2);if(m==w)break;w=m,l(c,g.slice(0,w+1).join(p)+o.ellipsis),r.children().each(function(){t(this).toggle().toggle()}),a(r,o)?(y=w,o.fallbackToLetter&&0==b&&0==y&&(p="",g=g[0].split(p),v=-1,w=-1,b=0,y=g.length-1)):(v=w,b=w)}if(-1==v||1==g.length&&0==g[0].length){var x=e.parent();e.detach();var C=d&&d.closest(x).length?d.length:0;x.contents().length>C?c=u(x.contents().eq(-1-C),n):(c=u(x,n,!0),C||x.detach()),c&&(h=i(s(c),o),l(c,h),C&&d&&t(c).parent().append(d))}else h=i(g.slice(0,v+1).join(p),o),l(c,h);return!0}function a(t,e){return t.innerHeight()>e.maxHeight}function i(e,n){for(;t.inArray(e.slice(-1),n.lastCharacter.remove)>-1;)e=e.slice(0,-1);return t.inArray(e.slice(-1),n.lastCharacter.noEllipsis)<0&&(e+=n.ellipsis),e}function d(t){return{width:t.innerWidth(),height:t.innerHeight()}}function l(t,e){t.innerText?t.innerText=e:t.nodeValue?t.nodeValue=e:t.textContent&&(t.textContent=e)}function s(t){return t.innerText?t.innerText:t.nodeValue?t.nodeValue:t.textContent?t.textContent:""}function c(t){do t=t.previousSibling;while(t&&1!==t.nodeType&&3!==t.nodeType);return t}function u(e,n,r){var o,a=e&&e[0];if(a){if(!r){if(3===a.nodeType)return a;if(t.trim(e.text()))return u(e.contents().last(),n)}for(o=c(a);!o;){if(e=e.parent(),e.is(n)||!e.length)return!1;o=c(e[0])}if(o)return u(t(o),n)}return!1}function h(e,n){return e?"string"==typeof e?(e=t(e,n),e.length?e:!1):e.jquery?e:!1:!1}function f(t){for(var e=t.innerHeight(),n=["paddingTop","paddingBottom"],r=0,o=n.length;o>r;r++){var a=parseInt(t.css(n[r]),10);isNaN(a)&&(a=0),e-=a}return e}if(!t.fn.dotdotdot){t.fn.dotdotdot=function(e){if(0==this.length)return t.fn.dotdotdot.debug('No element found for "'+this.selector+'".'),this;if(this.length>1)return this.each(function(){t(this).dotdotdot(e)});var o=this,i=o.contents();o.data("dotdotdot")&&o.trigger("destroy.dot"),o.data("dotdotdot-style",o.attr("style")||""),o.css("word-wrap","break-word"),"nowrap"===o.css("white-space")&&o.css("white-space","normal"),o.bind_events=function(){return o.bind("update.dot",function(e,d){switch(o.removeClass("is-truncated"),e.preventDefault(),e.stopPropagation(),typeof l.height){case"number":l.maxHeight=l.height;break;case"function":l.maxHeight=l.height.call(o[0]);break;default:l.maxHeight=f(o)}l.maxHeight+=l.tolerance,"undefined"!=typeof d&&(("string"==typeof d||"nodeType"in d&&1===d.nodeType)&&(d=t("<div />").append(d).contents()),d instanceof t&&(i=d)),g=o.wrapInner('<div class="dotdotdot" />').children(),g.contents().detach().end().append(i.clone(!0)).find("br").replaceWith(" <br /> ").end().css({height:"auto",width:"auto",border:"none",padding:0,margin:0});var c=!1,u=!1;return s.afterElement&&(c=s.afterElement.clone(!0),c.show(),s.afterElement.detach()),a(g,l)&&(u="children"==l.wrap?n(g,l,c):r(g,o,g,l,c)),g.replaceWith(g.contents()),g=null,t.isFunction(l.callback)&&l.callback.call(o[0],u,i),s.isTruncated=u,u}).bind("isTruncated.dot",function(t,e){return t.preventDefault(),t.stopPropagation(),"function"==typeof e&&e.call(o[0],s.isTruncated),s.isTruncated}).bind("originalContent.dot",function(t,e){return t.preventDefault(),t.stopPropagation(),"function"==typeof e&&e.call(o[0],i),i}).bind("destroy.dot",function(t){t.preventDefault(),t.stopPropagation(),o.unwatch().unbind_events().contents().detach().end().append(i).attr("style",o.data("dotdotdot-style")||"").removeClass("is-truncated").data("dotdotdot",!1)}),o},o.unbind_events=function(){return o.unbind(".dot"),o},o.watch=function(){if(o.unwatch(),"window"==l.watch){var e=t(window),n=e.width(),r=e.height();e.bind("resize.dot"+s.dotId,function(){n==e.width()&&r==e.height()&&l.windowResizeFix||(n=e.width(),r=e.height(),u&&clearInterval(u),u=setTimeout(function(){o.trigger("update.dot")},100))})}else c=d(o),u=setInterval(function(){if(o.is(":visible")){var t=d(o);c.width==t.width&&c.height==t.height||(o.trigger("update.dot"),c=t)}},500);return o},o.unwatch=function(){return t(window).unbind("resize.dot"+s.dotId),u&&clearInterval(u),o};var l=t.extend(!0,{},t.fn.dotdotdot.defaults,e),s={},c={},u=null,g=null;return l.lastCharacter.remove instanceof Array||(l.lastCharacter.remove=t.fn.dotdotdot.defaultArrays.lastCharacter.remove),l.lastCharacter.noEllipsis instanceof Array||(l.lastCharacter.noEllipsis=t.fn.dotdotdot.defaultArrays.lastCharacter.noEllipsis),s.afterElement=h(l.after,o),s.isTruncated=!1,s.dotId=p++,o.data("dotdotdot",!0).bind_events().trigger("update.dot"),l.watch&&o.watch(),o},t.fn.dotdotdot.defaults={ellipsis:"... ",wrap:"word",fallbackToLetter:!0,lastCharacter:{},tolerance:0,callback:null,after:null,height:null,watch:!1,windowResizeFix:!0},t.fn.dotdotdot.defaultArrays={lastCharacter:{remove:[" "," ",",",";",".","!","?"],noEllipsis:[]}},t.fn.dotdotdot.debug=function(t){};var p=1,g=t.fn.html;t.fn.html=function(n){return n!=e&&!t.isFunction(n)&&this.data("dotdotdot")?this.trigger("update",[n]):g.apply(this,arguments)};var v=t.fn.text;t.fn.text=function(n){return n!=e&&!t.isFunction(n)&&this.data("dotdotdot")?(n=t("<div />").text(n).html(),this.trigger("update",[n])):v.apply(this,arguments)}}}(jQuery),jQuery(document).ready(function(t){t(".dot-ellipsis").each(function(){var e=t(this).hasClass("dot-resize-update"),n=t(this).hasClass("dot-timer-update"),r=0,o=t(this).attr("class").split(/\s+/);t.each(o,function(t,e){var n=e.match(/^dot-height-(\d+)$/);null!==n&&(r=Number(n[1]))});var a=new Object;n&&(a.watch=!0),e&&(a.watch="window"),r>0&&(a.height=r),t(this).dotdotdot(a)})}),jQuery(window).load(function(){jQuery(".dot-ellipsis.dot-load-update").trigger("update.dot")}); var drawer = function () { @@ -439,15 +434,6 @@ function vote(pollid, groupurl, csrf) { }); } -/*! - * Fuel UX v3.1.0 - * Copyright 2012-2014 ExactTarget - * Licensed under the BSD-3-Clause license () - */ -!function(a){"function"==typeof define&&define.amd?define(["jquery","bootstrap"],a):a(jQuery)}(function(a){if("undefined"==typeof a)throw new Error("Fuel UX's JavaScript requires jQuery");if("undefined"==typeof a.fn.dropdown||"undefined"==typeof a.fn.collapse)throw new Error("Fuel UX's JavaScript requires Bootstrap");!function(a){var b=a.fn.checkbox,c=function(b,c){this.options=a.extend({},a.fn.checkbox.defaults,c),this.$element=a(b).is('input[type="checkbox"]')?a(b):a(b).find('input[type="checkbox"]:first'),this.$label=this.$element.parent(),this.$parent=this.$label.parent(".checkbox"),this.$toggleContainer=this.$element.attr("data-toggle"),this.state={disabled:!1,checked:!1},0===this.$parent.length&&(this.$parent=null),this.$toggleContainer=Boolean(this.$toggleContainer)?a(this.$toggleContainer):null,this.$element.on("change.fu.checkbox",a.proxy(this.itemchecked,this)),this.setState()};c.prototype={constructor:c,setState:function(a){a=a||this.$element,this.state.disabled=Boolean(a.prop("disabled")),this.state.checked=Boolean(a.is(":checked")),this._resetClasses(),this._toggleCheckedState(),this._toggleDisabledState(),this.toggleContainer()},enable:function(){this.state.disabled=!1,this.$element.attr("disabled",!1),this._resetClasses(),this.$element.trigger("enabled.fu.checkbox")},disable:function(){this.state.disabled=!0,this.$element.attr("disabled",!0),this._setDisabledClass(),this.$element.trigger("disabled.fu.checkbox")},check:function(){this.state.checked=!0,this.$element.prop("checked",!0),this._setCheckedClass(),this.$element.trigger("checked.fu.checkbox")},uncheck:function(){this.state.checked=!1,this.$element.prop("checked",!1),this._resetClasses(),this.$element.trigger("unchecked.fu.checkbox")},isChecked:function(){return this.state.checked},toggle:function(){this.state.checked=!this.state.checked,this._toggleCheckedState()},toggleContainer:function(){Boolean(this.$toggleContainer)&&(this.state.checked?(this.$toggleContainer.removeClass("hide"),this.$toggleContainer.attr("aria-hidden","false")):(this.$toggleContainer.addClass("hide"),this.$toggleContainer.attr("aria-hidden","true")))},itemchecked:function(b){this.setState(a(b.target))},destroy:function(){return this.$parent.remove(),this.$parent[0].outerHTML},_resetClasses:function(){var a=[];this.state.checked||a.push("checked"),this.state.disabled||a.push("disabled"),a=a.join(" "),this.$label.removeClass(a),this.$parent&&this.$parent.removeClass(a)},_toggleCheckedState:function(){this.state.checked?this.check():this.uncheck()},_toggleDisabledState:function(){this.state.disabled?this.disable():this.enable()},_setCheckedClass:function(){this.$label.addClass("checked"),this.$parent&&this.$parent.addClass("checked")},_setDisabledClass:function(){this.$label.addClass("disabled"),this.$parent&&this.$parent.addClass("disabled")}},a.fn.checkbox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.checkbox"),h="object"==typeof b&&b;g||f.data("fu.checkbox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.checkbox.defaults={},a.fn.checkbox.Constructor=c,a.fn.checkbox.noConflict=function(){return a.fn.checkbox=b,this},a(document).on("mouseover.fu.checkbox.data-api","[data-initialize=checkbox]",function(b){var c=a(b.target).closest(".checkbox").find("[type=checkbox]");c.data("fu.checkbox")||c.checkbox(c.data())}),a(function(){a("[data-initialize=checkbox] [type=checkbox]").each(function(){var b=a(this);b.data("fu.checkbox")||b.checkbox(b.data())})})}(a),function(a){var b=a.fn.combobox,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.combobox.defaults,c),this.$dropMenu=this.$element.find(".dropdown-menu"),this.$input=this.$element.find("input"),this.$button=this.$element.find(".btn"),this.$element.on("click.fu.combobox","a",a.proxy(this.itemclicked,this)),this.$element.on("change.fu.combobox","input",a.proxy(this.inputchanged,this)),this.$element.on("shown.bs.dropdown",a.proxy(this.menuShown,this)),this.setDefaultSelection()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},doSelect:function(a){"undefined"!=typeof a[0]?(this.$selectedItem=a,this.$input.val(this.$selectedItem.text())):this.$selectedItem=null},menuShown:function(){this.options.autoResizeMenu&&this.resizeMenu()},resizeMenu:function(){var a=this.$element.outerWidth();this.$dropMenu.outerWidth(a)},selectedItem:function(){var b=this.$selectedItem,c={};if(b){var d=this.$selectedItem.text();c=a.extend({text:d},this.$selectedItem.data())}else c={text:this.$input.val()};return c},selectByText:function(b){var c=a([]);this.$element.find("li").each(function(){return(this.textContent||this.innerText||a(this).text()||"").toLowerCase()===(b||"").toLowerCase()?(c=a(this),!1):void 0}),this.doSelect(c)},selectByValue:function(a){var b='li[data-value="'+a+'"]';this.selectBySelector(b)},selectByIndex:function(a){var b="li:eq("+a+")";this.selectBySelector(b)},selectBySelector:function(a){var b=this.$element.find(a);this.doSelect(b)},setDefaultSelection:function(){var a="li[data-selected=true]:first",b=this.$element.find(a);b.length>0&&(this.selectBySelector(a),b.removeData("selected"),b.removeAttr("data-selected"))},enable:function(){this.$element.removeClass("disabled"),this.$input.removeAttr("disabled"),this.$button.removeClass("disabled")},disable:function(){this.$element.addClass("disabled"),this.$input.attr("disabled",!0),this.$button.addClass("disabled")},itemclicked:function(b){this.$selectedItem=a(b.target).parent(),this.$input.val(this.$selectedItem.text()).trigger("change",{synthetic:!0});var c=this.selectedItem();this.$element.trigger("changed.fu.combobox",c),b.preventDefault(),this.$element.find(".dropdown-toggle").focus()},inputchanged:function(b,c){if(!c||!c.synthetic){var d=a(b.target).val();this.selectByText(d);var e=this.selectedItem();0===e.text.length&&(e={text:d}),this.$element.trigger("changed.fu.combobox",e)}}},a.fn.combobox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.combobox"),h="object"==typeof b&&b;g||f.data("fu.combobox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.combobox.defaults={autoResizeMenu:!0},a.fn.combobox.Constructor=c,a.fn.combobox.noConflict=function(){return a.fn.combobox=b,this},a(document).on("mousedown.fu.combobox.data-api","[data-initialize=combobox]",function(b){var c=a(b.target).closest(".combobox");c.data("fu.combobox")||c.combobox(c.data())}),a(function(){a("[data-initialize=combobox]").each(function(){var b=a(this);b.data("fu.combobox")||b.combobox(b.data())})})}(a),function(a){var b="Invalid Date",c="moment.js is not available so you cannot use this function",d=[],e=!1,f=a.fn.datepicker,g=!1,h=function(){var a,b;for(g=!0,a=0,b=d.length;b>a;a++)d[a].init.call(d[a].scope);d=[]};"function"==typeof define&&define.amd?require(["moment"],function(a){e=a,h()},function(a){var b=a.requireModules&&a.requireModules[0];"moment"===b&&h()}):h();var i=function(b,c){this.$element=a(b),this.options=a.extend(!0,{},a.fn.datepicker.defaults,c),this.$calendar=this.$element.find(".datepicker-calendar"),this.$days=this.$calendar.find(".datepicker-calendar-days"),this.$header=this.$calendar.find(".datepicker-calendar-header"),this.$headerTitle=this.$header.find(".title"),this.$input=this.$element.find("input"),this.$wheels=this.$element.find(".datepicker-wheels"),this.$wheelsMonth=this.$element.find(".datepicker-wheels-month"),this.$wheelsYear=this.$element.find(".datepicker-wheels-year"),this.artificialScrolling=!1,this.formatDate=this.options.formatDate||this.formatDate,this.inputValue=null,this.moment=!1,this.momentFormat=null,this.parseDate=this.options.parseDate||this.parseDate,this.preventBlurHide=!1,this.restricted=this.options.restricted||[],this.restrictedParsed=[],this.restrictedText=this.options.restrictedText,this.sameYearOnly=this.options.sameYearOnly,this.selectedDate=null,this.yearRestriction=null,this.$calendar.find(".datepicker-today").on("click.fu.datepicker",a.proxy(this.todayClicked,this)),this.$days.on("click.fu.datepicker","tr td button",a.proxy(this.dateClicked,this)),this.$element.find(".dropdown-menu").on("mousedown.fu.datepicker",a.proxy(this.dropdownMousedown,this)),this.$header.find(".next").on("click.fu.datepicker",a.proxy(this.next,this)),this.$header.find(".prev").on("click.fu.datepicker",a.proxy(this.prev,this)),this.$headerTitle.on("click.fu.datepicker",a.proxy(this.titleClicked,this)),this.$input.on("blur.fu.datepicker",a.proxy(this.inputBlurred,this)),this.$input.on("focus.fu.datepicker",a.proxy(this.inputFocused,this)),this.$wheels.find(".datepicker-wheels-back").on("click.fu.datepicker",a.proxy(this.backClicked,this)),this.$wheels.find(".datepicker-wheels-select").on("click.fu.datepicker",a.proxy(this.selectClicked,this)),this.$wheelsMonth.on("click.fu.datepicker","ul button",a.proxy(this.monthClicked,this)),this.$wheelsYear.on("click.fu.datepicker","ul button",a.proxy(this.yearClicked,this)),this.$wheelsYear.find("ul").on("scroll.fu.datepicker",a.proxy(this.onYearScroll,this));var f=function(){this.checkForMomentJS()&&(e=e||window.moment,this.moment=!0,this.momentFormat=this.options.momentConfig.format,this.setCulture(this.options.momentConfig.culture)),this.setRestrictedDates(this.restricted),this.setDate(this.options.date)||(this.$input.val(""),this.inputValue=this.$input.val()),this.sameYearOnly&&(this.yearRestriction=this.selectedDate?this.selectedDate.getFullYear():(new Date).getFullYear())};g?f.call(this):d.push({init:f,scope:this})};i.prototype={constructor:i,backClicked:function(){this.changeView("calendar")},changeView:function(a,b){"wheels"===a?(this.$calendar.hide().attr("aria-hidden","true"),this.$wheels.show().removeAttr("aria-hidden",""),b&&this.renderWheel(b)):(this.$wheels.hide().attr("aria-hidden","true"),this.$calendar.show().removeAttr("aria-hidden",""),b&&this.renderMonth(b))},checkForMomentJS:function(){return(a.isFunction(window.moment)||"undefined"!=typeof e&&a.isFunction(e))&&a.isPlainObject(this.options.momentConfig)&&this.options.momentConfig.culture&&this.options.momentConfig.format?!0:!1},dateClicked:function(b){var c,d=a(b.currentTarget).parents("td:first");d.hasClass("restricted")||(this.$days.find("td.selected").removeClass("selected"),d.addClass("selected"),c=new Date(d.attr("data-year"),d.attr("data-month"),d.attr("data-date")),this.selectedDate=c,this.$input.val(this.formatDate(c)),this.inputValue=this.$input.val(),this.$input.focus(),this.$element.trigger("dateClicked.fu.datepicker",c))},destroy:function(){return this.$element.remove(),this.$days.find("tbody").empty(),this.$wheelsYear.find("ul").empty(),this.$element[0].outerHTML},disable:function(){this.$element.addClass("disabled"),this.$element.find("input, button").attr("disabled","disabled"),this.$element.find(".input-group-btn").removeClass("open")},dropdownMousedown:function(){var a=this;this.preventBlurHide=!0,setTimeout(function(){a.preventBlurHide=!1},0)},enable:function(){this.$element.removeClass("disabled"),this.$element.find("input, button").removeAttr("disabled")},formatDate:function(a){var b=function(a){var b="0"+a;return b.substr(b.length-2)};return this.moment?e(a).format(this.momentFormat):b(a.getMonth()+1)+"/"+b(a.getDate())+"/"+a.getFullYear()},getCulture:function(){if(this.moment)return e.locale();throw c},getDate:function(){return this.selectedDate?this.selectedDate:new Date(0/0)},getFormat:function(){if(this.moment)return this.momentFormat;throw c},getFormattedDate:function(){return this.selectedDate?this.formatDate(this.selectedDate):b},getRestrictedDates:function(){return this.restricted},inputBlurred:function(){var a,b=this.$input.val();b!==this.inputValue&&(a=this.setDate(b),null===a?this.$element.trigger("inputParsingFailed.fu.datepicker",b):a===!1?this.$element.trigger("inputRestrictedDate.fu.datepicker",a):this.$element.trigger("changed.fu.datepicker",a)),this.preventBlurHide||this.$element.find(".input-group-btn").removeClass("open")},inputFocused:function(){this.$element.find(".input-group-btn").addClass("open")},isInvalidDate:function(a){var c=a.toString();return c===b||"NaN"===c?!0:!1},isRestricted:function(a,b,c){var d,e,f,g,h=this.restrictedParsed;if(this.sameYearOnly&&null!==this.yearRestriction&&c!==this.yearRestriction)return!0;for(d=0,f=h.length;f>d;d++)if(e=h[d].from,g=h[d].to,(c>e.year||c===e.year&&b>e.month||c===e.year&&b===e.month&&a>=e.date)&&(c<g.year||c===g.year&&b<g.month||c===g.year&&b===g.month&&a<=g.date))return!0;return!1},monthClicked:function(b){this.$wheelsMonth.find(".selected").removeClass("selected"),a(b.currentTarget).parent().addClass("selected")},next:function(){var a=this.$headerTitle.attr("data-month"),b=this.$headerTitle.attr("data-year");if(a++,a>11){if(this.sameYearOnly)return;a=0,b++}this.renderMonth(new Date(b,a,1))},onYearScroll:function(b){if(!this.artificialScrolling){var c,d,e=a(b.currentTarget),f="border-box"===e.css("box-sizing")?e.outerHeight():e.height(),g=e.get(0).scrollHeight,h=e.scrollTop(),i=f/(g-h)*100,j=h/g*100;if(5>j){for(d=parseInt(e.find("li:first").attr("data-year"),10),c=d-1;c>d-11;c--)e.prepend('<li data-year="'+c+'"><button type="button">'+c+"</button></li>");this.artificialScrolling=!0,e.scrollTop(e.get(0).scrollHeight-g+h),this.artificialScrolling=!1}else if(i>90)for(d=parseInt(e.find("li:last").attr("data-year"),10),c=d+1;d+11>c;c++)e.append('<li data-year="'+c+'"><button type="button">'+c+"</button></li>")}},parseDate:function(a){var b,c,d,f,g,h,i=this;if(a)if(this.moment){if(d=function(a,b){return b="b"===a?e(b,i.momentFormat):e(b),b.isValid()===!0?b.toDate():new Date(0/0)},h="string"==typeof a?["b","a"]:["a","b"],b=d(h[0],a),!this.isInvalidDate(b))return b;if(b=d(h[1],a),!this.isInvalidDate(b))return b}else if("string"==typeof a){if(b=new Date(Date.parse(a)),!this.isInvalidDate(b))return b;if(a=a.split("T")[0],c=/^\s*(\d{4})-(\d\d)-(\d\d)\s*$/,g=c.exec(a),g&&(f=parseInt(g[2],10),b=new Date(g[1],f-1,g[3]),f===b.getMonth()+1))return b}else if(b=new Date(a),!this.isInvalidDate(b))return b;return new Date(0/0)},prev:function(){var a=this.$headerTitle.attr("data-month"),b=this.$headerTitle.attr("data-year");if(a--,0>a){if(this.sameYearOnly)return;a=11,b--}this.renderMonth(new Date(b,a,1))},renderMonth:function(b){b=b||new Date;var c,d,e,f,g,h,i,j,k,l=new Date(b.getFullYear(),b.getMonth(),1).getDay(),m=new Date(b.getFullYear(),b.getMonth()+1,0).getDate(),n=new Date(b.getFullYear(),b.getMonth(),0).getDate(),o=this.$headerTitle.find(".month"),p=b.getMonth(),q=new Date,r=q.getDate(),s=q.getMonth(),t=q.getFullYear(),u=this.selectedDate,v=this.$days.find("tbody"),w=b.getFullYear();for(u&&(u={date:u.getDate(),month:u.getMonth(),year:u.getFullYear()}),o.find(".current").removeClass("current"),o.find('span[data-month="'+p+'"]').addClass("current"),this.$headerTitle.find(".year").text(w),this.$headerTitle.attr({"data-month":p,"data-year":w}),v.empty(),0!==l?(c=n-l+1,i=-1):(c=1,i=0),h=35-l>=m?5:6,f=0;h>f;f++){for(k=a("<tr></tr>"),g=0;7>g;g++)j=a("<td></td>"),-1===i?j.addClass("last-month"):1===i&&j.addClass("next-month"),d=p+i,e=w,0>d?(d=11,e--):d>11&&(d=0,e++),j.attr({"data-date":c,"data-month":d,"data-year":e}),e===t&&d===s&&c===r?j.addClass("current-day"):(t>e||e===t&&s>d||e===t&&d===s&&r>c)&&(j.addClass("past"),this.options.allowPastDates||j.addClass("restricted").attr("title",this.restrictedText)),this.isRestricted(c,d,e)&&j.addClass("restricted").attr("title",this.restrictedText),u&&e===u.year&&d===u.month&&c===u.date&&j.addClass("selected"),j.html(j.hasClass("restricted")?'<span><b class="datepicker-date">'+c+"</b></span>":'<span><button type="button" class="datepicker-date">'+c+"</button></span>"),c++,-1===i&&c>n?(c=1,i=0):0===i&&c>m&&(c=1,i=1),k.append(j);v.append(k)}},renderWheel:function(a){var b,c,d,e=a.getMonth(),f=this.$wheelsMonth.find("ul"),g=a.getFullYear(),h=this.$wheelsYear.find("ul");for(this.sameYearOnly?(this.$wheelsMonth.addClass("full"),this.$wheelsYear.addClass("hide")):(this.$wheelsMonth.removeClass("full"),this.$wheelsYear.removeClass("hide")),f.find(".selected").removeClass("selected"),c=f.find('li[data-month="'+e+'"]'),c.addClass("selected"),f.scrollTop(f.scrollTop()+(c.position().top-f.outerHeight()/2-c.outerHeight(!0)/2)),h.empty(),b=g-10;g+11>b;b++)h.append('<li data-year="'+b+'"><button type="button">'+b+"</button></li>");d=h.find('li[data-year="'+g+'"]'),d.addClass("selected"),this.artificialScrolling=!0,h.scrollTop(h.scrollTop()+(d.position().top-h.outerHeight()/2-d.outerHeight(!0)/2)),this.artificialScrolling=!1,c.find("button").focus()},selectClicked:function(){var a=this.$wheelsMonth.find(".selected").attr("data-month"),b=this.$wheelsYear.find(".selected").attr("data-year");this.changeView("calendar",new Date(b,a,1))},setCulture:function(a){if(!a)return!1;if(!this.moment)throw c;e.locale(a)},setDate:function(a){var b=this.parseDate(a);return this.isInvalidDate(b)?(this.selectedDate=null,this.renderMonth()):this.isRestricted(b.getDate(),b.getMonth(),b.getFullYear())?(this.selectedDate=!1,this.renderMonth()):(this.selectedDate=b,this.renderMonth(b),this.$input.val(this.formatDate(b))),this.inputValue=this.$input.val(),this.selectedDate},setFormat:function(a){if(!a)return!1;if(!this.moment)throw c;this.momentFormat=a},setRestrictedDates:function(a){var b,c,d=[],e=this,f=function(a){return a===-1/0?{date:-1/0,month:-1/0,year:-1/0}:1/0===a?{date:1/0,month:1/0,year:1/0}:(a=e.parseDate(a),{date:a.getDate(),month:a.getMonth(),year:a.getFullYear()})};for(this.restricted=a,b=0,c=a.length;c>b;b++)d.push({from:f(a[b].from),to:f(a[b].to)});this.restrictedParsed=d},titleClicked:function(){this.changeView("wheels",new Date(this.$headerTitle.attr("data-year"),this.$headerTitle.attr("data-month"),1))},todayClicked:function(){var a=new Date;(a.getMonth()+""!==this.$headerTitle.attr("data-month")||a.getFullYear()+""!==this.$headerTitle.attr("data-year"))&&this.renderMonth(a)},yearClicked:function(b){this.$wheelsYear.find(".selected").removeClass("selected"),a(b.currentTarget).parent().addClass("selected")}},a.fn.datepicker=function(b){var c,d=Array.prototype.slice.call(arguments,1),e=this.each(function(){var e=a(this),f=e.data("fu.datepicker"),g="object"==typeof b&&b;f||e.data("fu.datepicker",f=new i(this,g)),"string"==typeof b&&(c=f[b].apply(f,d))});return void 0===c?e:c},a.fn.datepicker.defaults={allowPastDates:!1,date:new Date,formatDate:null,momentConfig:{culture:"en",format:"L"},parseDate:null,restricted:[],restrictedText:"Restricted",sameYearOnly:!1},a.fn.datepicker.Constructor=i,a.fn.datepicker.noConflict=function(){return a.fn.datepicker=f,this},a(document).on("mousedown.fu.datepicker.data-api","[data-initialize=datepicker]",function(b){var c=a(b.target).closest(".datepicker");c.data("datepicker")||c.datepicker(c.data())}),a(document).on("click.fu.datepicker.data-api",".datepicker .dropdown-menu",function(b){var c=a(b.target);(!c.is(".datepicker-date")||c.closest(".restricted").length)&&b.stopPropagation()}),a(document).on("click.fu.datepicker.data-api",".datepicker input",function(a){a.stopPropagation()}),a(function(){a("[data-initialize=datepicker]").each(function(){var b=a(this);b.data("datepicker")||b.datepicker(b.data())})})}(a),function(a){function b(b){a(b).css({visibility:"hidden"}),c(b)?b.parent().addClass("dropup"):b.parent().removeClass("dropup"),a(b).css({visibility:"visible"})}function c(a){var b=d(a),c={};return c.parentHeight=a.parent().outerHeight(),c.parentOffsetTop=a.parent().offset().top,c.dropdownHeight=a.outerHeight(),c.containerHeight=b.overflowElement.outerHeight(),c.containerOffsetTop=b.isWindow?b.overflowElement.scrollTop():b.overflowElement.offset().top,c.fromTop=c.parentOffsetTop-c.containerOffsetTop,c.fromBottom=c.containerHeight-c.parentHeight-(c.parentOffsetTop-c.containerOffsetTop),c.dropdownHeight<c.fromBottom?!1:c.dropdownHeight<c.fromTop?!0:c.dropdownHeight>=c.fromTop&&c.dropdownHeight>=c.fromBottom?c.fromTop>=c.fromBottom?!0:!1:void 0}function d(b){var c=window,d=!0;return a.each(b.parents(),function(b,e){return"visible"!==a(e).css("overflow")?(c=e,d=!1,!1):void 0}),{overflowElement:a(c),isWindow:d}}a(document.body).on("click.fu.dropdown-autoflip","[data-toggle=dropdown][data-flip]",function(){"auto"===a(this).data().flip&&b(a(this).next(".dropdown-menu"))}),a(document.body).on("suggested.fu.pillbox",function(c,d){b(a(d)),a(d).parent().addClass("open")}),a.fn.dropdownautoflip=function(){}}(a),function(a){var b=a.fn.loader,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.loader.defaults,c),this.begin=this.$element.is("[data-begin]")?parseInt(this.$element.attr("data-begin"),10):1,this.delay=this.$element.is("[data-delay]")?parseFloat(this.$element.attr("data-delay")):150,this.end=this.$element.is("[data-end]")?parseInt(this.$element.attr("data-end"),10):8,this.frame=this.$element.is("[data-frame]")?parseInt(this.$element.attr("data-frame"),10):this.begin,this.isIElt9=!1,this.timeout={};var d=this.msieVersion();d!==!1&&9>d&&(this.$element.addClass("iefix"),this.isIElt9=!0),this.$element.attr("data-frame",this.frame+""),this.play()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},ieRepaint:function(){this.isIElt9&&this.$element.addClass("iefix_repaint").removeClass("iefix_repaint")},msieVersion:function(){var a=window.navigator.userAgent,b=a.indexOf("MSIE ");return b>0?parseInt(a.substring(b+5,a.indexOf(".",b)),10):!1},next:function(){this.frame++,this.frame>this.end&&(this.frame=this.begin),this.$element.attr("data-frame",this.frame+""),this.ieRepaint()},pause:function(){clearTimeout(this.timeout)},play:function(){var a=this;clearTimeout(this.timeout),this.timeout=setTimeout(function(){a.next(),a.play()},this.delay)},previous:function(){this.frame--,this.frame<this.begin&&(this.frame=this.end),this.$element.attr("data-frame",this.frame+""),this.ieRepaint()},reset:function(){this.frame=this.begin,this.$element.attr("data-frame",this.frame+""),this.ieRepaint()}},a.fn.loader=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.loader"),h="object"==typeof b&&b;g||f.data("fu.loader",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.loader.defaults={},a.fn.loader.Constructor=c,a.fn.loader.noConflict=function(){return a.fn.loader=b,this},a(function(){a("[data-initialize=loader]").each(function(){var b=a(this);b.data("fu.loader")||b.loader(b.data())})})}(a),function(a){var b=a.fn.placard,c=function(b,c){var d=this;this.$element=a(b),this.options=a.extend({},a.fn.placard.defaults,c),this.$accept=this.$element.find(".placard-accept"),this.$cancel=this.$element.find(".placard-cancel"),this.$field=this.$element.find(".placard-field"),this.$footer=this.$element.find(".placard-footer"),this.$header=this.$element.find(".placard-header"),this.$popup=this.$element.find(".placard-popup"),this.actualValue=null,this.clickStamp="_",this.previousValue="",-1===this.options.revertOnCancel&&(this.options.revertOnCancel=this.$accept.length>0?!0:!1),this.$field.on("focus.fu.placard",a.proxy(this.show,this)),this.$accept.on("click.fu.placard",a.proxy(this.complete,this,"accept")),this.$cancel.on("click.fu.placard",function(a){a.preventDefault(),d.complete("cancel")}),this.ellipsis()};c.prototype={constructor:c,complete:function(a){var b=this.options["on"+a[0].toUpperCase()+a.substring(1)],c={previousValue:this.previousValue,value:this.$field.val()};b?(b(c),this.$element.trigger(a,c)):("cancel"===a&&this.options.revertOnCancel&&this.$field.val(this.previousValue),this.$element.trigger(a,c),this.hide())},destroy:function(){return this.$element.remove(),a(document).off("click.fu.placard.externalClick."+this.clickStamp),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},disable:function(){this.$element.addClass("disabled"),this.$field.attr("disabled","disabled"),this.hide()},ellipsis:function(){var a,b,c;if("true"===this.$element.attr("data-ellipsis"))if(a=this.$field.get(0),this.$field.is("input"))a.scrollLeft=0;else if(a.scrollTop=0,a.clientHeight<a.scrollHeight){for(this.actualValue=this.$field.val(),this.$field.val(""),c="",b=0;a.clientHeight>=a.scrollHeight;)c+=this.actualValue[b],this.$field.val(c+"..."),b++;c=c.length>0?c.substring(0,c.length-1):"",this.$field.val(c+"...")}},enable:function(){this.$element.removeClass("disabled"),this.$field.removeAttr("disabled")},externalClickListener:function(a,b){(b===!0||this.isExternalClick(a))&&this.complete(this.options.externalClickAction)},getValue:function(){return null!==this.actualValue?this.actualValue:this.$field.val()},hide:function(){this.$element.hasClass("showing")&&(this.$element.removeClass("showing"),this.ellipsis(),a(document).off("click.fu.placard.externalClick."+this.clickStamp),this.$element.trigger("hidden.fu.placard"))},isExternalClick:function(b){var c,d,e=this.$element.get(0),f=this.options.externalClickExceptions||[],g=a(b.target);if(b.target===e||g.parents(".placard:first").get(0)===e)return!1;for(c=0,d=f.length;d>c;c++)if(g.is(f[c])||g.parents(f[c]).length>0)return!1;return!0},setValue:function(a){this.$field.val(a),this.$element.hasClass("showing")||this.ellipsis()},show:function(){var b;if(!this.$element.hasClass("showing")){if(b=a(document).find(".placard.showing"),b.length>0){if(b.data("fu.placard")&&b.data("fu.placard").options.explicit)return;b.placard("externalClickListener",{},!0)}this.previousValue=this.$field.val(),this.$element.addClass("showing"),null!==this.actualValue&&(this.$field.val(this.actualValue),this.actualValue=null),this.$header.length>0&&this.$popup.css("top","-"+this.$header.outerHeight(!0)+"px"),this.$footer.length>0&&this.$popup.css("bottom","-"+this.$footer.outerHeight(!0)+"px"),this.$element.trigger("shown.fu.placard"),this.clickStamp=(new Date).getTime()+(Math.floor(100*Math.random())+1),this.options.explicit||a(document).on("click.fu.placard.externalClick."+this.clickStamp,a.proxy(this.externalClickListener,this))}}},a.fn.placard=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.placard"),h="object"==typeof b&&b;g||f.data("fu.placard",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.placard.defaults={onAccept:void 0,onCancel:void 0,externalClickAction:"cancel",externalClickExceptions:[],explicit:!1,revertOnCancel:-1},a.fn.placard.Constructor=c,a.fn.placard.noConflict=function(){return a.fn.placard=b,this},a(document).on("focus.fu.placard.data-api","[data-initialize=placard]",function(b){var c=a(b.target).closest(".placard");c.data("fu.placard")||c.placard(c.data())}),a(function(){a("[data-initialize=placard]").each(function(){var b=a(this);b.data("fu.placard")||b.placard(b.data())})})}(a),function(a){var b=a.fn.radio,c=function(b,c){this.options=a.extend({},a.fn.radio.defaults,c),this.$radio=a(b).is('input[type="radio"]')?a(b):a(b).find('input[type="radio"]:first'),this.$label=this.$radio.parent(),this.groupName=this.$radio.attr("name"),this.$parent=this.$label.parent(".radio"),this.$toggleContainer=null,0===this.$parent.length&&(this.$parent=null);var d=this.$radio.attr("data-toggle");d&&(this.$toggleContainer=a(d)),this.setState(this.$radio),this.$radio.on("change.fu.radio",a.proxy(this.itemchecked,this))};c.prototype={constructor:c,destroy:function(){return this.$parent.remove(),this.$parent[0].outerHTML},setState:function(a){a=a||this.$radio;var b=a.is(":checked"),c=!!a.prop("disabled");this.$label.removeClass("checked"),this.$parent&&this.$parent.removeClass("checked disabled"),b===!0&&(this.$label.addClass("checked"),this.$parent&&this.$parent.addClass("checked")),c===!0&&(this.$label.addClass("disabled"),this.$parent&&this.$parent.addClass("disabled")),this.toggleContainer()},resetGroup:function(){var b=a('input[name="'+this.groupName+'"]');b.each(function(){var b=a(this).parent("label");b.removeClass("checked"),b.parent(".radio").removeClass("checked")})},enable:function(){this.$radio.attr("disabled",!1),this.$label.removeClass("disabled"),this.$parent&&this.$parent.removeClass("disabled")},disable:function(){this.$radio.attr("disabled",!0),this.$label.addClass("disabled"),this.$parent&&this.$parent.addClass("disabled")},itemchecked:function(b){var c=a(b.target);this.resetGroup(),this.setState(c)},check:function(){this.resetGroup(),this.$radio.prop("checked",!0),this.setState(this.$radio)},toggleContainer:function(){var b;this.$toggleContainer&&(this.isChecked()?(b=a('input[name="'+this.groupName+'"]'),b.each(function(){var b=a(this).attr("data-toggle");a(b).addClass("hide"),a(b).attr("aria-hidden","true")}),this.$toggleContainer.removeClass("hide"),this.$toggleContainer.attr("aria-hidden","false")):(this.$toggleContainer.addClass("hide"),this.$toggleContainer.attr("aria-hidden","true")))},uncheck:function(){this.$radio.prop("checked",!1),this.setState(this.$radio)},isChecked:function(){return this.$radio.is(":checked")}},a.fn.radio=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.radio"),h="object"==typeof b&&b;g||f.data("fu.radio",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.radio.defaults={},a.fn.radio.Constructor=c,a.fn.radio.noConflict=function(){return a.fn.radio=b,this},a(document).on("mouseover.fu.checkbox.data-api","[data-initialize=radio]",function(b){var c=a(b.target).closest(".radio").find("[type=radio]");c.data("fu.radio")||c.radio(c.data())}),a(function(){a("[data-initialize=radio] [type=radio]").each(function(){var b=a(this);b.data("fu.radio")||b.radio(b.data())})})}(a),function(a){var b=a.fn.search,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.search.defaults,c),this.$button=this.$element.find("button"),this.$input=this.$element.find("input"),this.$icon=this.$element.find(".glyphicon"),this.$button.on("click.fu.search",a.proxy(this.buttonclicked,this)),this.$input.on("keydown.fu.search",a.proxy(this.keypress,this)),this.$input.on("keyup.fu.search",a.proxy(this.keypressed,this)),this.activeSearch=""};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},search:function(a){this.$icon.hasClass("glyphicon")&&this.$icon.removeClass("glyphicon-search").addClass("glyphicon-remove"),this.activeSearch=a,this.$element.addClass("searched"),this.$element.trigger("searched.fu.search",a)},clear:function(){this.$icon.hasClass("glyphicon")&&this.$icon.removeClass("glyphicon-remove").addClass("glyphicon-search"),this.activeSearch="",this.$input.val(""),this.$element.removeClass("searched"),this.$element.trigger("cleared.fu.search")},action:function(){var a=this.$input.val(),b=""===a||a===this.activeSearch;this.activeSearch&&b?this.clear():a&&this.search(a)},buttonclicked:function(b){b.preventDefault(),a(b.currentTarget).is(".disabled, :disabled")||this.action()},keypress:function(a){13===a.which&&a.preventDefault()},keypressed:function(a){var b,c="glyphicon-remove",d="glyphicon-search";13===a.which?(a.preventDefault(),this.action()):(b=this.$input.val(),b?b!==this.activeSearch?this.$icon.removeClass(c).addClass(d):this.$icon.removeClass(d).addClass(c):this.clear())},disable:function(){this.$element.addClass("disabled"),this.$input.attr("disabled","disabled"),this.$button.addClass("disabled")},enable:function(){this.$element.removeClass("disabled"),this.$input.removeAttr("disabled"),this.$button.removeClass("disabled")}},a.fn.search=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.search"),h="object"==typeof b&&b;g||f.data("fu.search",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e)) -});return void 0===d?f:d},a.fn.search.defaults={},a.fn.search.Constructor=c,a.fn.search.noConflict=function(){return a.fn.search=b,this},a(document).on("mousedown.fu.search.data-api","[data-initialize=search]",function(b){var c=a(b.target).closest(".search");c.data("fu.search")||c.search(c.data())}),a(function(){a("[data-initialize=search]").each(function(){var b=a(this);b.data("fu.search")||b.search(b.data())})})}(a),function(a){var b=a.fn.selectlist,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.selectlist.defaults,c),this.$button=this.$element.find(".btn.dropdown-toggle"),this.$hiddenField=this.$element.find(".hidden-field"),this.$label=this.$element.find(".selected-label"),this.$element.on("click.fu.selectlist",".dropdown-menu a",a.proxy(this.itemClicked,this)),this.setDefaultSelection(),"auto"===c.resize&&this.resize()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},doSelect:function(b){var c;this.$selectedItem=c=b,this.$hiddenField.val(this.$selectedItem.attr("data-value")),this.$label.html(a(this.$selectedItem.children()[0]).html()),this.$element.find("li").each(function(){c.is(a(this))?a(this).attr("data-selected",!0):a(this).removeData("selected").removeAttr("data-selected")})},itemClicked:function(b){this.$element.trigger("clicked.fu.selectlist",this.$selectedItem),b.preventDefault(),a(b.target).parent().is(this.$selectedItem)||this.itemChanged(b),this.$element.find(".dropdown-toggle").focus()},itemChanged:function(b){this.doSelect(a(b.target).closest("li"));var c=this.selectedItem();this.$element.trigger("changed.fu.selectlist",c)},resize:function(){var b=0,c=a("<div/>").addClass("selectlist-sizer"),d=0;Boolean(a(document).find("html").hasClass("fuelux"))?a(document.body).append(c):a(".fuelux:first").append(c),this.$element.find("a").each(function(){c.text(a(this).text()),b=c.outerWidth(),b>d&&(d=b)}),c.remove(),this.$label.width(d)},selectedItem:function(){var b=this.$selectedItem.text();return a.extend({text:b},this.$selectedItem.data())},selectByText:function(b){var c=a([]);this.$element.find("li").each(function(){return(this.textContent||this.innerText||a(this).text()||"").toLowerCase()===(b||"").toLowerCase()?(c=a(this),!1):void 0}),this.doSelect(c)},selectByValue:function(a){var b='li[data-value="'+a+'"]';this.selectBySelector(b)},selectByIndex:function(a){var b="li:eq("+a+")";this.selectBySelector(b)},selectBySelector:function(a){var b=this.$element.find(a);this.doSelect(b)},setDefaultSelection:function(){var a=this.$element.find("li[data-selected=true]").eq(0);0===a.length&&(a=this.$element.find("li").has("a").eq(0)),this.doSelect(a)},enable:function(){this.$element.removeClass("disabled"),this.$button.removeClass("disabled")},disable:function(){this.$element.addClass("disabled"),this.$button.addClass("disabled")}},a.fn.selectlist=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.selectlist"),h="object"==typeof b&&b;g||f.data("fu.selectlist",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.selectlist.defaults={},a.fn.selectlist.Constructor=c,a.fn.selectlist.noConflict=function(){return a.fn.selectlist=b,this},a(document).on("mousedown.fu.selectlist.data-api","[data-initialize=selectlist]",function(b){var c=a(b.target).closest(".selectlist");c.data("fu.selectlist")||c.selectlist(c.data())}),a(function(){a("[data-initialize=selectlist]").each(function(){var b=a(this);b.data("fu.selectlist")||b.selectlist(b.data())})})}(a),function(a){var b=a.fn.spinbox,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.spinbox.defaults,c),this.$input=this.$element.find(".spinbox-input"),this.$element.on("focusin.fu.spinbox",this.$input,a.proxy(this.changeFlag,this)),this.$element.on("focusout.fu.spinbox",this.$input,a.proxy(this.change,this)),this.$element.on("keydown.fu.spinbox",this.$input,a.proxy(this.keydown,this)),this.$element.on("keyup.fu.spinbox",this.$input,a.proxy(this.keyup,this)),this.bindMousewheelListeners(),this.mousewheelTimeout={},this.options.hold?(this.$element.on("mousedown.fu.spinbox",".spinbox-up",a.proxy(function(){this.startSpin(!0)},this)),this.$element.on("mouseup.fu.spinbox",".spinbox-up, .spinbox-down",a.proxy(this.stopSpin,this)),this.$element.on("mouseout.fu.spinbox",".spinbox-up, .spinbox-down",a.proxy(this.stopSpin,this)),this.$element.on("mousedown.fu.spinbox",".spinbox-down",a.proxy(function(){this.startSpin(!1)},this))):(this.$element.on("click.fu.spinbox",".spinbox-up",a.proxy(function(){this.step(!0)},this)),this.$element.on("click.fu.spinbox",".spinbox-down",a.proxy(function(){this.step(!1)},this))),this.switches={count:1,enabled:!0},this.switches.speed="medium"===this.options.speed?300:"fast"===this.options.speed?100:500,this.lastValue=this.options.value,this.render(),this.options.disabled&&this.disable()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element[0].outerHTML},render:function(){var b=this.parseInput(this.$input.val()),c="";""!==b&&0===this.options.value?this.value(b):this.output(this.options.value),this.options.units.length&&a.each(this.options.units,function(a,b){b.length>c.length&&(c=b)})},output:function(a,b){return a=(a+"").split(".").join(this.options.decimalMark),b=b||!0,b&&this.$input.val(a),a},parseInput:function(a){return a=(a+"").split(this.options.decimalMark).join(".")},change:function(){var a=this.parseInput(this.$input.val())||"";this.options.units.length||"."!==this.options.decimalMark?a=this.parseValueWithUnit(a):a/1?a=this.options.value=this.checkMaxMin(a/1):(a=this.checkMaxMin(a.replace(/[^0-9.-]/g,"")||""),this.options.value=a/1),this.output(a),this.changeFlag=!1,this.triggerChangedEvent()},changeFlag:function(){this.changeFlag=!0},stopSpin:function(){void 0!==this.switches.timeout&&(clearTimeout(this.switches.timeout),this.switches.count=1,this.triggerChangedEvent())},triggerChangedEvent:function(){var a=this.value();a!==this.lastValue&&(this.lastValue=a,this.$element.trigger("changed.fu.spinbox",this.output(a,!1)))},startSpin:function(b){if(!this.options.disabled){var c=this.switches.count;1===c?(this.step(b),c=1):c=3>c?1.5:8>c?2.5:4,this.switches.timeout=setTimeout(a.proxy(function(){this.iterate(b)},this),this.switches.speed/c),this.switches.count++}},iterate:function(a){this.step(a),this.startSpin(a)},step:function(a){var b,c,d,e;if(this.changeFlag&&this.change(),d=this.options.value,e=a?this.options.max:this.options.min,a?e>d:d>e){var f=d+(a?1:-1)*this.options.step;this.options.step%1!==0&&(b=(this.options.step+"").split(".")[1].length,c=Math.pow(10,b),f=Math.round(f*c)/c),this.value((a?f>e:e>f)?e:f)}else if(this.options.cycle){var g=a?this.options.min:this.options.max;this.value(g)}},value:function(a){return a||0===a?this.options.units.length||"."!==this.options.decimalMark?(this.output(this.parseValueWithUnit(a+(this.unit||""))),this):!isNaN(parseFloat(a))&&isFinite(a)?(this.options.value=a/1,this.output(a+(this.unit?this.unit:"")),this):void 0:(this.changeFlag&&this.change(),this.unit?this.options.value+this.unit:this.output(this.options.value,!1))},isUnitLegal:function(b){var c;return a.each(this.options.units,function(a,d){return d.toLowerCase()===b.toLowerCase()?(c=b.toLowerCase(),!1):void 0}),c},parseValueWithUnit:function(a){var b=a.replace(/[^a-zA-Z]/g,""),c=a.replace(/[^0-9.-]/g,"");return b&&(b=this.isUnitLegal(b)),this.options.value=this.checkMaxMin(c/1),this.unit=b||void 0,this.options.value+(b||"")},checkMaxMin:function(a){return isNaN(parseFloat(a))?a:(a<=this.options.max&&a>=this.options.min||(a=a>=this.options.max?this.options.max:this.options.min),a)},disable:function(){this.options.disabled=!0,this.$element.addClass("disabled"),this.$input.attr("disabled",""),this.$element.find("button").addClass("disabled")},enable:function(){this.options.disabled=!1,this.$element.removeClass("disabled"),this.$input.removeAttr("disabled"),this.$element.find("button").removeClass("disabled")},keydown:function(a){var b=a.keyCode;38===b?this.step(!0):40===b&&this.step(!1)},keyup:function(a){var b=a.keyCode;(38===b||40===b)&&this.triggerChangedEvent()},bindMousewheelListeners:function(){var b=this.$input.get(0);b.addEventListener?(b.addEventListener("mousewheel",a.proxy(this.mousewheelHandler,this),!1),b.addEventListener("DOMMouseScroll",a.proxy(this.mousewheelHandler,this),!1)):b.attachEvent("onmousewheel",a.proxy(this.mousewheelHandler,this))},mousewheelHandler:function(a){var b=window.event||a,c=Math.max(-1,Math.min(1,b.wheelDelta||-b.detail)),d=this;return clearTimeout(this.mousewheelTimeout),this.mousewheelTimeout=setTimeout(function(){d.triggerChangedEvent()},300),this.step(0>c?!0:!1),b.preventDefault?b.preventDefault():b.returnValue=!1,!1}},a.fn.spinbox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.spinbox"),h="object"==typeof b&&b;g||f.data("fu.spinbox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.spinbox.defaults={value:0,min:0,max:999,step:1,hold:!0,speed:"medium",disabled:!1,cycle:!1,units:[],decimalMark:"."},a.fn.spinbox.Constructor=c,a.fn.spinbox.noConflict=function(){return a.fn.spinbox=b,this},a(document).on("mousedown.fu.spinbox.data-api","[data-initialize=spinbox]",function(b){var c=a(b.target).closest(".spinbox");c.data("fu.spinbox")||c.spinbox(c.data())}),a(function(){a("[data-initialize=spinbox]").each(function(){var b=a(this);b.data("fu.spinbox")||b.spinbox(b.data())})})}(a),function(a){var b=a.fn.tree,c=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.tree.defaults,c),this.$element.on("click.fu.tree",".tree-item",a.proxy(function(a){this.selectItem(a.currentTarget)},this)),this.$element.on("click.fu.tree",".tree-branch-name",a.proxy(function(a){this.openFolder(a.currentTarget)},this)),this.options.folderSelect&&(this.$element.off("click.fu.tree",".tree-branch-name"),this.$element.on("click.fu.tree",".icon-caret",a.proxy(function(b){this.openFolder(a(b.currentTarget).parent())},this)),this.$element.on("click.fu.tree",".tree-branch-name",a.proxy(function(b){this.selectFolder(a(b.currentTarget))},this))),this.render()};c.prototype={constructor:c,destroy:function(){return this.$element.find("li:not([data-template])").remove(),this.$element.remove(),this.$element[0].outerHTML},render:function(){this.populate(this.$element)},populate:function(b){var c=this,d=b.hasClass("tree")?b:b.parent(),e=d.find(".tree-loader:eq(0)");e.removeClass("hide"),this.options.dataSource(d.data(),function(f){e.addClass("hide"),a.each(f.data,function(e,f){var g;"folder"===f.type?(g=c.$element.find("[data-template=treebranch]:eq(0)").clone().removeClass("hide").removeAttr("data-template"),g.data(f),g.find(".tree-branch-name > .tree-label").html(f.name)):"item"===f.type&&(g=c.$element.find("[data-template=treeitem]:eq(0)").clone().removeClass("hide").removeAttr("data-template"),g.find(".tree-item-name > .tree-label").html(f.name),g.data(f));var h=f.attr||f.dataAttributes||[];a.each(h,function(a,b){switch(a){case"cssClass":case"class":case"className":g.addClass(b);break;case"data-icon":g.find(".icon-item").removeClass().addClass("icon-item "+b),g.attr(a,b);break;case"id":g.attr(a,b),g.attr("aria-labelledby",b+"-label"),g.find(".tree-branch-name > .tree-label").attr("id",b+"-label");break;default:g.attr(a,b)}}),b.hasClass("tree-branch-header")?d.find(".tree-branch-children:eq(0)").append(g):b.append(g)}),c.$element.trigger("loaded.fu.tree",d)})},selectItem:function(b){var c=a(b),d=c.data(),e=this.$element.find(".tree-selected"),f=[],g=c.find(".icon-item");this.options.multiSelect?a.each(e,function(b,d){var e=a(d);e[0]!==c[0]&&f.push(a(d).data())}):e[0]!==c[0]&&(e.removeClass("tree-selected").find(".glyphicon").removeClass("glyphicon-ok").addClass("fueluxicon-bullet"),f.push(d));var h="selected";c.hasClass("tree-selected")?(h="deselected",c.removeClass("tree-selected"),(g.hasClass("glyphicon-ok")||g.hasClass("fueluxicon-bullet"))&&g.removeClass("glyphicon-ok").addClass("fueluxicon-bullet")):(c.addClass("tree-selected"),(g.hasClass("glyphicon-ok")||g.hasClass("fueluxicon-bullet"))&&g.removeClass("fueluxicon-bullet").addClass("glyphicon-ok"),this.options.multiSelect&&f.push(d)),this.$element.trigger(h+".fu.tree",{target:d,selected:f}),c.trigger("updated.fu.tree",{selected:f,item:c,eventType:h})},openFolder:function(b){var c,d,e,f=a(b);this.options.folderSelect||(f=a(b).parent()),c=f.closest(".tree-branch"),d=c.find(".tree-branch-children"),e=d.eq(0);var g,h,i;f.find(".glyphicon-folder-close").length?(g="opened",h=".glyphicon-folder-close",i="glyphicon-folder-open",c.addClass("tree-open"),c.attr("aria-expanded","true"),e.removeClass("hide"),d.children().length||this.populate(d)):f.find(".glyphicon-folder-open")&&(g="closed",h=".glyphicon-folder-open",i="glyphicon-folder-close",c.removeClass("tree-open"),c.attr("aria-expanded","false"),e.addClass("hide"),this.options.cacheItems||e.empty()),c.find("> .tree-branch-header .icon-folder").eq(0).removeClass("glyphicon-folder-close glyphicon-folder-open").addClass(i),this.$element.trigger(g+"fu.tree",c.data())},selectFolder:function(b){var c=a(b),d=c.closest(".tree-branch"),e=this.$element.find(".tree-branch.tree-selected"),f=d.data(),g=[],h="selected";d.hasClass("tree-selected")?(h="deselected",d.removeClass("tree-selected")):d.addClass("tree-selected"),this.options.multiSelect?(e=this.$element.find(".tree-branch.tree-selected"),a.each(e,function(b,d){var e=a(d);e[0]!==c[0]&&g.push(a(d).data())})):e[0]!==c[0]&&(e.removeClass("tree-selected"),g.push(f)),this.$element.trigger(h+".fu.tree",{target:f,selected:g}),c.trigger("updated.fu.tree",{selected:g,item:c,eventType:h})},selectedItems:function(){var b=this.$element.find(".tree-selected"),c=[];return a.each(b,function(b,d){c.push(a(d).data())}),c},collapse:function(){var b=this.options.cacheItems;this.$element.find(".icon-folder-open").each(function(){var c=a(this).removeClass("icon-folder-close icon-folder-open").addClass("icon-folder-close"),d=c.parent().parent(),e=d.children(".tree-branch-children");e.addClass("hide"),b||e.empty()})}},a.fn.tree=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.tree"),h="object"==typeof b&&b;g||f.data("fu.tree",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.tree.defaults={dataSource:function(){},multiSelect:!1,cacheItems:!0,folderSelect:!0},a.fn.tree.Constructor=c,a.fn.tree.noConflict=function(){return a.fn.tree=b,this}}(a),function(a){var b=a.fn.wizard,c=function(b,c){var d;this.$element=a(b),this.options=a.extend({},a.fn.wizard.defaults,c),this.options.disablePreviousStep="previous"===this.$element.attr("data-restrict")?!0:this.options.disablePreviousStep,this.currentStep=this.options.selectedItem.step,this.numSteps=this.$element.find(".steps li").length,this.$prevBtn=this.$element.find("button.btn-prev"),this.$nextBtn=this.$element.find("button.btn-next"),d=this.$nextBtn.children().detach(),this.nextText=a.trim(this.$nextBtn.text()),this.$nextBtn.append(d),this.$prevBtn.on("click.fu.wizard",a.proxy(this.previous,this)),this.$nextBtn.on("click.fu.wizard",a.proxy(this.next,this)),this.$element.on("click.fu.wizard","li.complete",a.proxy(this.stepclicked,this)),this.selectedItem(this.options.selectedItem),this.options.disablePreviousStep&&(this.$prevBtn.attr("disabled",!0),this.$element.find(".steps").addClass("previous-disabled"))};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},addSteps:function(b){var c,d,e,f,g,h,i=[].slice.call(arguments).slice(1),j=this.$element.find(".steps"),k=this.$element.find(".step-content");for(b=-1===b||b>this.numSteps+1?this.numSteps+1:b,i[0]instanceof Array&&(i=i[0]),g=j.find("li:nth-child("+b+")"),f=k.find(".step-pane:nth-child("+b+")"),g.length<1&&(g=null),c=0,d=i.length;d>c;c++)h=a('<li data-step="'+b+'"><span class="badge badge-info"></span></li>'),h.append(i[c].label||"").append('<span class="chevron"></span>'),h.find(".badge").append(i[c].badge||b),e=a('<div class="step-pane" data-step="'+b+'"></div>'),e.append(i[c].pane||""),g?(g.before(h),f.before(e)):(j.append(h),k.append(e)),b++;this.syncSteps(),this.numSteps=j.find("li").length,this.setState()},removeSteps:function(b,c){var d,e="nextAll",f=0,g=this.$element.find(".steps"),h=this.$element.find(".step-content");c=void 0!==c?c:1,b>g.find("li").length?d=g.find("li:last"):(d=g.find("li:nth-child("+b+")").prev(),d.length<1&&(e="children",d=g)),d[e]().each(function(){var b=a(this),d=b.attr("data-step");return c>f?(b.remove(),h.find('.step-pane[data-step="'+d+'"]:first').remove(),void f++):!1}),this.syncSteps(),this.numSteps=g.find("li").length,this.setState()},setState:function(){var b=this.currentStep>1,c=1===this.currentStep,d=this.currentStep===this.numSteps;this.options.disablePreviousStep||this.$prevBtn.attr("disabled",c===!0||b===!1);var e=this.$nextBtn.attr("data-last");if(e){this.lastText=e;var f=this.nextText;d===!0?(f=this.lastText,this.$element.addClass("complete")):this.$element.removeClass("complete");var g=this.$nextBtn.children().detach();this.$nextBtn.text(f).append(g)}var h=this.$element.find(".steps li");h.removeClass("active").removeClass("complete"),h.find("span.badge").removeClass("badge-info").removeClass("badge-success");var i=".steps li:lt("+(this.currentStep-1)+")",j=this.$element.find(i);j.addClass("complete"),j.find("span.badge").addClass("badge-success");var k=".steps li:eq("+(this.currentStep-1)+")",l=this.$element.find(k);l.addClass("active"),l.find("span.badge").addClass("badge-info");var m=this.$element.find(".step-content"),n=l.attr("data-step");m.find(".step-pane").removeClass("active"),m.find('.step-pane[data-step="'+n+'"]:first').addClass("active"),this.$element.find(".steps").first().attr("style","margin-left: 0");var o=0;this.$element.find(".steps > li").each(function(){o+=a(this).outerWidth()});var p=0;if(p=this.$element.find(".actions").length?this.$element.width()-this.$element.find(".actions").first().outerWidth():this.$element.width(),o>p){var q=o-p;this.$element.find(".steps").first().attr("style","margin-left: -"+q+"px"),this.$element.find("li.active").first().position().left<200&&(q+=this.$element.find("li.active").first().position().left-200,1>q?this.$element.find(".steps").first().attr("style","margin-left: 0"):this.$element.find(".steps").first().attr("style","margin-left: -"+q+"px"))}if("undefined"!=typeof this.initialized){var r=a.Event("changed.fu.wizard");this.$element.trigger(r,{step:this.currentStep})}this.initialized=!0},stepclicked:function(b){var c=a(b.currentTarget),d=this.$element.find(".steps li").index(c),e=!0;if(this.options.disablePreviousStep&&d<this.currentStep&&(e=!1),e){var f=a.Event("stepclicked.fu.wizard");if(this.$element.trigger(f,{step:d+1}),f.isDefaultPrevented())return;this.currentStep=d+1,this.setState()}},syncSteps:function(){var b=1,c=this.$element.find(".steps"),d=this.$element.find(".step-content");c.children().each(function(){var c=a(this),e=c.find(".badge"),f=c.attr("data-step");isNaN(parseInt(e.html(),10))||e.html(b),c.attr("data-step",b),d.find('.step-pane[data-step="'+f+'"]:last').attr("data-step",b),b++})},previous:function(){var b=this.currentStep>1;if(this.options.disablePreviousStep&&(b=!1),b){var c=a.Event("actionclicked.fu.wizard");if(this.$element.trigger(c,{step:this.currentStep,direction:"previous"}),c.isDefaultPrevented())return;this.currentStep-=1,this.setState()}this.$prevBtn.is(":disabled")?this.$nextBtn.focus():this.$prevBtn.focus()},next:function(){var b=this.currentStep+1<=this.numSteps,c=this.currentStep===this.numSteps;if(b){var d=a.Event("actionclicked.fu.wizard");if(this.$element.trigger(d,{step:this.currentStep,direction:"next"}),d.isDefaultPrevented())return;this.currentStep+=1,this.setState()}else c&&this.$element.trigger("finished.fu.wizard");this.$nextBtn.is(":disabled")?this.$prevBtn.focus():this.$nextBtn.focus()},selectedItem:function(a){var b,c;return a?(c=a.step||-1,c>=1&&c<=this.numSteps?(this.currentStep=c,this.setState()):(c=this.$element.find(".steps li.active:first").attr("data-step"),isNaN(c)||(this.currentStep=parseInt(c,10),this.setState())),b=this):b={step:this.currentStep},b}},a.fn.wizard=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.wizard"),h="object"==typeof b&&b;g||f.data("fu.wizard",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.wizard.defaults={disablePreviousStep:!1,selectedItem:{step:-1}},a.fn.wizard.Constructor=c,a.fn.wizard.noConflict=function(){return a.fn.wizard=b,this},a(document).on("mouseover.fu.wizard.data-api","[data-initialize=wizard]",function(b){var c=a(b.target).closest(".wizard");c.data("fu.wizard")||c.wizard(c.data())}),a(function(){a("[data-initialize=wizard]").each(function(){var b=a(this);b.data("fu.wizard")||b.wizard(b.data())})})}(a),function(a){var b=a.fn.infinitescroll,c=function(b,c){this.$element=a(b),this.$element.addClass("infinitescroll"),this.options=a.extend({},a.fn.infinitescroll.defaults,c),this.curScrollTop=this.$element.scrollTop(),this.curPercentage=this.getPercentage(),this.fetchingData=!1,this.$element.on("scroll.fu.infinitescroll",a.proxy(this.onScroll,this)),this.onScroll()};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element.empty(),this.$element[0].outerHTML},disable:function(){this.$element.off("scroll.fu.infinitescroll")},enable:function(){this.$element.on("scroll.fu.infinitescroll",a.proxy(this.onScroll,this))},end:function(b){var c=a('<div class="infinitescroll-end"></div>');c.append(b?b:"---------"),this.$element.append(c),this.disable()},getPercentage:function(){var a="border-box"===this.$element.css("box-sizing")?this.$element.outerHeight():this.$element.height(),b=this.$element.get(0).scrollHeight;return b>a?a/(b-this.curScrollTop)*100:0},fetchData:function(b){var c,d=a('<div class="infinitescroll-load"></div>'),e=this,f=function(){var b={percentage:e.curPercentage,scrollTop:e.curScrollTop},c=a('<div class="loader"></div>');d.append(c),c.loader(),e.options.dataSource&&e.options.dataSource(b,function(a){var b;d.remove(),a.content&&e.$element.append(a.content),a.end&&(b=a.end!==!0?a.end:void 0,e.end(b)),e.fetchingData=!1})};this.fetchingData=!0,this.$element.append(d),this.options.hybrid&&b!==!0?(c=a('<button type="button" class="btn btn-primary"></button>'),c.append("object"==typeof this.options.hybrid?this.options.hybrid.label:'<span class="glyphicon glyphicon-repeat"></span>'),c.on("click.fu.infinitescroll",function(){c.remove(),f()}),d.append(c)):f()},onScroll:function(){this.curScrollTop=this.$element.scrollTop(),this.curPercentage=this.getPercentage(),!this.fetchingData&&this.curPercentage>=this.options.percentage&&this.fetchData()}},a.fn.infinitescroll=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.infinitescroll"),h="object"==typeof b&&b;g||f.data("fu.infinitescroll",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.infinitescroll.defaults={dataSource:null,hybrid:!1,percentage:95},a.fn.infinitescroll.Constructor=c,a.fn.infinitescroll.noConflict=function(){return a.fn.infinitescroll=b,this}}(a),function(a){var b=a.fn.pillbox,c=function(b,c){this.$element=a(b),this.$moreCount=this.$element.find(".pillbox-more-count"),this.$pillGroup=this.$element.find(".pill-group"),this.$addItem=this.$element.find(".pillbox-add-item"),this.$addItemWrap=this.$addItem.parent(),this.$suggest=this.$element.find(".suggest"),this.$pillHTML='<li class="btn btn-default pill"> <span></span> <span class="glyphicon glyphicon-close"> <span class="sr-only">Remove</span> </span></li>',this.options=a.extend({},a.fn.pillbox.defaults,c),-1===this.options.readonly?void 0!==this.$element.attr("data-readonly")&&this.readonly(!0):this.options.readonly&&this.readonly(!0),this.acceptKeyCodes=this._generateObject(this.options.acceptKeyCodes),this.$element.on("click.fu.pillbox",".pill-group > .pill",a.proxy(this.itemClicked,this)),this.$element.on("click.fu.pillbox",a.proxy(this.inputFocus,this)),this.$element.on("keydown.fu.pillbox",".pillbox-add-item",a.proxy(this.inputEvent,this)),this.options.onKeyDown&&this.$element.on("mousedown.fu.pillbox",".suggest > li",a.proxy(this.suggestionClick,this)),this.options.edit&&(this.$element.addClass("pills-editable"),this.$element.on("blur.fu.pillbox",".pillbox-add-item",a.proxy(this.cancelEdit,this)))};c.prototype={constructor:c,destroy:function(){return this.$element.remove(),this.$element[0].outerHTML},items:function(){var b=this;return this.$pillGroup.children(".pill").map(function(){return b.getItemData(a(this))}).get()},itemClicked:function(b){var c,d=a(b.target);if(b.preventDefault(),b.stopPropagation(),this._closeSuggestions(),d.hasClass("pill"))c=d;else if(c=d.parent(),void 0===this.$element.attr("data-readonly")){if(d.hasClass("glyphicon-close"))return this.options.onRemove?this.options.onRemove(this.getItemData(c,{el:c}),a.proxy(this._removeElement,this)):this._removeElement(this.getItemData(c,{el:c})),!1;if(this.options.edit){if(c.find(".pillbox-list-edit").length)return!1;this.openEdit(c)}}this.$element.trigger("clicked.fu.pillbox",this.getItemData(c))},readonly:function(a){a?this.$element.attr("data-readonly","readonly"):this.$element.removeAttr("data-readonly"),this.options.truncate&&this.truncate(a)},suggestionClick:function(b){var c=a(b.currentTarget),d={text:c.html(),value:c.data("value")};b.preventDefault(),this.$addItem.val(""),c.data("attr")&&(d.attr=JSON.parse(c.data("attr"))),d.data=c.data("data"),this.addItems(d,!0),this._closeSuggestions()},itemCount:function(){return this.$pillGroup.children(".pill").length},addItems:function(){var b,c,d,e=this;!isFinite(String(arguments[0]))||arguments[0]instanceof Array?(b=[].slice.call(arguments).slice(0),d=b[1]&&!b[1].text):(b=[].slice.call(arguments).slice(1),c=arguments[0]),b[0]instanceof Array&&(b=b[0]),b.length&&(a.each(b,function(a,c){var d={text:c.text,value:c.value?c.value:c.text,el:e.$pillHTML};c.attr&&(d.attr=c.attr),c.data&&(d.data=c.data),b[a]=d}),this.options.edit&&this.currentEdit&&(b[0].el=this.currentEdit.wrap("<div></div>").parent().html()),d&&b.pop(1),e.options.onAdd&&d?this.options.edit&&this.currentEdit?e.options.onAdd(b[0],a.proxy(e.saveEdit,this)):e.options.onAdd(b[0],a.proxy(e.placeItems,this)):this.options.edit&&this.currentEdit?e.saveEdit(b):c?e.placeItems(c,b):e.placeItems(b,d))},removeItems:function(a,b){var c,d,e=this;if(a)for(b=b?b:1,c=0;b>c&&(d=e.$pillGroup.find("> .pill:nth-child("+a+")"),d);c++)d.remove();else this.$pillGroup.find(".pill").remove(),this._removePillTrigger({method:"removeAll"})},placeItems:function(){var b,c,d,e,f=[];!isFinite(String(arguments[0]))||arguments[0]instanceof Array?(b=[].slice.call(arguments).slice(0),e=b[1]&&!b[1].text):(b=[].slice.call(arguments).slice(1),c=arguments[0]),b[0]instanceof Array&&(b=b[0]),b.length&&(a.each(b,function(b,c){var d=a(c.el);d.attr("data-value",c.value),d.find("span:first").html(c.text),c.attr&&a.each(c.attr,function(a,b){"cssClass"===a||"class"===a?d.addClass(b):d.attr(a,b)}),c.data&&d.data("data",c.data),f.push(d)}),this.$pillGroup.children(".pill").length>0?c?(d=this.$pillGroup.find(".pill:nth-child("+c+")"),d.length?d.before(f):this.$pillGroup.children(".pill:last").after(f)):this.$pillGroup.children(".pill:last").after(f):this.$pillGroup.prepend(f),e&&this.$element.trigger("added.fu.pillbox",{text:b[0].text,value:b[0].value}))},inputEvent:function(a){var b,c,d,e,f=this,g=this.$addItem.val();if(this.acceptKeyCodes[a.keyCode])return this.options.onKeyDown&&this._isSuggestionsOpen()&&(e=this.$suggest.find(".pillbox-suggest-sel"),e.length&&(g=e.html(),b=e.data("value"),c=e.data("attr"))),g.length&&(this._closeSuggestions(),this.$addItem.hide(),c?this.addItems({text:g,value:b,attr:JSON.parse(c)},!0):this.addItems({text:g,value:b},!0),setTimeout(function(){f.$addItem.show().val("").attr({size:10})},0)),a.preventDefault(),!0;if(8===a.keyCode||46===a.keyCode){if(!g.length)return a.preventDefault(),this.options.edit&&this.currentEdit?(this.cancelEdit(),!0):(this._closeSuggestions(),d=this.$pillGroup.children(".pill:last"),d.hasClass("pillbox-highlight")?this._removeElement(this.getItemData(d,{el:d})):d.addClass("pillbox-highlight"),!0)}else g.length>10&&this.$addItem.width()<this.$pillGroup.width()-6&&this.$addItem.attr({size:g.length+3});if(this.$pillGroup.find(".pill").removeClass("pillbox-highlight"),this.options.onKeyDown){if(9===a.keyCode||38===a.keyCode||40===a.keyCode)return this._isSuggestionsOpen()&&this._keySuggestions(a),!0;this.callbackId=a.timeStamp,this.options.onKeyDown({event:a,value:g},function(b){f._openSuggestions(a,b)})}},openEdit:function(a){var b=a.index()+1,c=this.$addItemWrap.detach().hide();this.$pillGroup.find(".pill:nth-child("+b+")").before(c),this.currentEdit=a.detach(),c.addClass("editing"),this.$addItem.val(a.find("span:first").html()),c.show(),this.$addItem.focus().select()},cancelEdit:function(a){var b;return this.currentEdit?(this._closeSuggestions(),a&&this.$addItemWrap.before(this.currentEdit),this.currentEdit=!1,b=this.$addItemWrap.detach(),b.removeClass("editing"),this.$addItem.val(""),void this.$pillGroup.append(b)):!1},saveEdit:function(){var b=arguments[0][0]?arguments[0][0]:arguments[0];this.currentEdit=a(b.el),this.currentEdit.data("value",b.value),this.currentEdit.find("span:first").html(b.text),this.$addItemWrap.hide(),this.$addItemWrap.before(this.currentEdit),this.currentEdit=!1,this.$addItem.val(""),this.$addItemWrap.removeClass("editing"),this.$pillGroup.append(this.$addItemWrap.detach().show()),this.$element.trigger("edited.fu.pillbox",{value:b.value,text:b.text})},removeBySelector:function(){var b=[].slice.call(arguments).slice(0),c=this;a.each(b,function(a,b){c.$pillGroup.find(b).remove()}),this._removePillTrigger({method:"removeBySelector",removedSelectors:b})},removeByValue:function(){var b=[].slice.call(arguments).slice(0),c=this;a.each(b,function(a,b){c.$pillGroup.find('> .pill[data-value="'+b+'"]').remove()}),this._removePillTrigger({method:"removeByValue",removedValues:b})},removeByText:function(){var b=[].slice.call(arguments).slice(0),c=this;a.each(b,function(a,b){c.$pillGroup.find('> .pill:contains("'+b+'")').remove()}),this._removePillTrigger({method:"removeByText",removedText:b})},truncate:function(b){var c,d,e,f,g,h=this;this.$element.removeClass("truncate"),this.$addItemWrap.removeClass("truncated"),this.$pillGroup.find(".pill").removeClass("truncated"),b&&(this.$element.addClass("truncate"),c=this.$element.width(),d=!1,e=0,f=this.$pillGroup.find(".pill").length,g=0,this.$pillGroup.find(".pill").each(function(){var b=a(this);d?b.addClass("truncated"):(e++,h.$moreCount.text(f-e),g+b.outerWidth(!0)+h.$addItemWrap.outerWidth(!0)<=c?g+=b.outerWidth(!0):(h.$moreCount.text(f-e+1),b.addClass("truncated"),d=!0))}),e===f&&this.$addItemWrap.addClass("truncated"))},inputFocus:function(){this.$element.find(".pillbox-add-item").focus()},getItemData:function(b,c){return a.extend({text:b.find("span:first").html()},b.data(),c)},_removeElement:function(a){a.el.remove(),delete a.el,this.$element.trigger("removed.fu.pillbox",a)},_removePillTrigger:function(a){this.$element.trigger("removed.fu.pillbox",a)},_generateObject:function(b){var c={};return a.each(b,function(a,b){c[b]=!0}),c},_openSuggestions:function(b,c){var d=a("<ul>");return this.callbackId!==b.timeStamp?!1:void(c.data&&c.data.length&&(a.each(c.data,function(b,c){var e=c.value?c.value:c.text,f=a('<li data-value="'+e+'">'+c.text+"</li>");c.attr&&f.data("attr",JSON.stringify(c.attr)),c.data&&f.data("data",c.data),d.append(f)}),this.$suggest.html("").append(d.children()),a(document.body).trigger("suggested.fu.pillbox",this.$suggest))) -},_closeSuggestions:function(){this.$suggest.html("").parent().removeClass("open")},_isSuggestionsOpen:function(){return this.$suggest.parent().hasClass("open")},_keySuggestions:function(a){var b,c=this.$suggest.find("li.pillbox-suggest-sel"),d=38===a.keyCode;a.preventDefault(),c.length?(b=d?c.prev():c.next(),b.length||(b=this.$suggest.find(d?"li:last":"li:first")),b&&(b.addClass("pillbox-suggest-sel"),c.removeClass("pillbox-suggest-sel"))):(c=this.$suggest.find("li:first"),c.addClass("pillbox-suggest-sel"))}},a.fn.pillbox=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.pillbox"),h="object"==typeof b&&b;g||f.data("fu.pillbox",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.pillbox.defaults={onAdd:void 0,onRemove:void 0,onKeyDown:void 0,edit:!1,readonly:-1,truncate:!1,acceptKeyCodes:[13,188]},a.fn.pillbox.Constructor=c,a.fn.pillbox.noConflict=function(){return a.fn.pillbox=b,this},a(document).on("mousedown.fu.pillbox.data-api","[data-initialize=pillbox]",function(b){var c=a(b.target).closest(".pillbox");c.data("fu.pillbox")||c.pillbox(c.data())}),a(function(){a("[data-initialize=pillbox]").each(function(){var b=a(this);b.data("fu.pillbox")||b.pillbox(b.data())})})}(a),function(a){var b=a.fn.repeater,c=function(b,c){var d,e,f=this;this.$element=a(b),this.$canvas=this.$element.find(".repeater-canvas"),this.$count=this.$element.find(".repeater-count"),this.$end=this.$element.find(".repeater-end"),this.$filters=this.$element.find(".repeater-filters"),this.$loader=this.$element.find(".repeater-loader"),this.$pageSize=this.$element.find(".repeater-itemization .selectlist"),this.$nextBtn=this.$element.find(".repeater-next"),this.$pages=this.$element.find(".repeater-pages"),this.$prevBtn=this.$element.find(".repeater-prev"),this.$primaryPaging=this.$element.find(".repeater-primaryPaging"),this.$search=this.$element.find(".repeater-search").find(".search"),this.$secondaryPaging=this.$element.find(".repeater-secondaryPaging"),this.$start=this.$element.find(".repeater-start"),this.$viewport=this.$element.find(".repeater-viewport"),this.$views=this.$element.find(".repeater-views"),this.eventStamp=(new Date).getTime()+(Math.floor(100*Math.random())+1),this.currentPage=0,this.currentView=null,this.infiniteScrollingCallback=function(){},this.infiniteScrollingCont=null,this.infiniteScrollingEnabled=!1,this.infiniteScrollingEnd=null,this.infiniteScrollingOptions={},this.lastPageInput=0,this.options=a.extend({},a.fn.repeater.defaults,c),this.pageIncrement=0,this.resizeTimeout={},this.staticHeight=-1===this.options.staticHeight?this.$element.attr("data-staticheight"):this.options.staticHeight,this.$filters.selectlist(),this.$pageSize.selectlist(),this.$primaryPaging.find(".combobox").combobox(),this.$search.search(),this.$filters.on("changed.fu.selectlist",function(a,b){f.$element.trigger("filtered.fu.repeater",b),f.render({clearInfinite:!0,pageIncrement:null})}),this.$nextBtn.on("click.fu.repeater",a.proxy(this.next,this)),this.$pageSize.on("changed.fu.selectlist",function(a,b){f.$element.trigger("pageSizeChanged.fu.repeater",b),f.render({pageIncrement:null})}),this.$prevBtn.on("click.fu.repeater",a.proxy(this.previous,this)),this.$primaryPaging.find(".combobox").on("changed.fu.combobox",function(a,b){f.$element.trigger("pageChanged.fu.repeater",[b.text,b]),f.pageInputChange(b.text)}),this.$search.on("searched.fu.search cleared.fu.search",function(a,b){f.$element.trigger("searchChanged.fu.repeater",b),f.render({clearInfinite:!0,pageIncrement:null})}),this.$secondaryPaging.on("blur.fu.repeater",function(){f.pageInputChange(f.$secondaryPaging.val())}),this.$secondaryPaging.on("keyup",function(a){13===a.keyCode&&f.pageInputChange(f.$secondaryPaging.val())}),this.$views.find("input").on("change.fu.repeater",a.proxy(this.viewChanged,this)),a(window).on("resize.fu.repeater."+this.eventStamp,function(){clearTimeout(f.resizeTimeout),f.resizeTimeout=setTimeout(function(){f.resize(),f.$element.trigger("resized.fu.repeater")},75)}),this.$loader.loader(),this.$loader.loader("pause"),-1!==this.options.defaultView?e=this.options.defaultView:(d=this.$views.find("label.active input"),e=d.length>0?d.val():"list"),this.initViews(function(){f.resize(),f.$element.trigger("resized.fu.repeater"),f.render({changeView:e})})};c.prototype={constructor:c,clear:function(b){var c=function(b){var d=[];b.children().each(function(){var b=a(this),e=b.attr("data-preserve");"deep"===e?(b.detach(),d.push(b)):"shallow"===e&&(c(b),b.detach(),d.push(b))}),b.empty(),b.append(d)};b=b||{},b.preserve?(!this.infiniteScrollingEnabled||b.clearInfinite)&&c(this.$canvas):this.$canvas.empty()},destroy:function(){var b;return this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$canvas.empty(),b=this.$element[0].outerHTML,this.$element.find(".combobox").combobox("destroy"),this.$element.find(".selectlist").selectlist("destroy"),this.$element.find(".search").search("destroy"),this.infiniteScrollingEnabled&&a(this.infiniteScrollingCont).infinitescroll("destroy"),this.$element.remove(),a(window).off("resize.fu.repeater."+this.eventStamp),b},getDataOptions:function(b,c){var d,e,f={};b=b||{},f.filter=this.$filters.length>0?this.$filters.selectlist("selectedItem"):"all",f.view=this.currentView,this.infiniteScrollingEnabled||(f.pageSize=this.$pageSize.length>0?parseInt(this.$pageSize.selectlist("selectedItem").value,10):25),void 0!==b.pageIncrement&&(null===b.pageIncrement?this.currentPage=0:this.currentPage+=b.pageIncrement),f.pageIndex=this.currentPage,d=this.$search.length>0?this.$search.find("input").val():"",""!==d&&(f.search=d),e=a.fn.repeater.views[this.currentView]||{},e=e.dataOptions,e?e.call(this,f,function(a){c(a)}):c(f)},infiniteScrolling:function(a,b){var c,d,e=this.$element.find(".repeater-itemization"),f=this.$element.find(".repeater-pagination");b=b||{},a?(this.infiniteScrollingEnabled=!0,this.infiniteScrollingEnd=b.end,delete b.dataSource,delete b.end,this.infiniteScrollingOptions=b,e.hide(),f.hide()):(c=this.infiniteScrollingCont,d=c.data(),delete d.infinitescroll,c.off("scroll"),c.removeClass("infinitescroll"),this.infiniteScrollingCont=null,this.infiniteScrollingEnabled=!1,this.infiniteScrollingEnd=null,this.infiniteScrollingOptions={},e.show(),f.show())},infiniteScrollPaging:function(a){var b=this.infiniteScrollingEnd!==!0?this.infiniteScrollingEnd:void 0,c=a.page,d=a.pages;this.currentPage=void 0!==c?c:0/0,this.currentPage+1>=d&&this.infiniteScrollingCont.infinitescroll("end",b)},initInfiniteScrolling:function(){var b,c,d=this.$canvas.find('[data-infinite="true"]:first');d=d.length<1?this.$canvas:d,d.data("fu.infinitescroll")?d.infinitescroll("enable"):(c=this,b=a.extend({},this.infiniteScrollingOptions),b.dataSource=function(a,b){c.infiniteScrollingCallback=b,c.render({pageIncrement:1})},d.infinitescroll(b),this.infiniteScrollingCont=d)},initViews:function(b){var c,d,e=[],f=function(a){var c=function(){a++,d>a?f(a):b()};e[a].initialize?e[a].initialize.call(this,{},function(){c()}):c()};for(c in a.fn.repeater.views)e.push(a.fn.repeater.views[c]);d=e.length,d>0?f(0):b()},itemization:function(a){this.$count.html(a.count||""),this.$end.html(a.end||""),this.$start.html(a.start||"")},next:function(){var a="disabled";this.$nextBtn.attr(a,a),this.$prevBtn.attr(a,a),this.pageIncrement=1,this.$element.trigger("nextClicked.fu.repeater"),this.render({pageIncrement:this.pageIncrement})},pageInputChange:function(a){var b;a!==this.lastPageInput&&(this.lastPageInput=a,a=parseInt(a,10)-1,b=a-this.currentPage,this.$element.trigger("pageChanged.fu.repeater",a),this.render({pageIncrement:b}))},pagination:function(a){var b,c,d,e="active",f="disabled",g=a.page,h=a.pages;if(this.currentPage=void 0!==g?g:0/0,this.$primaryPaging.removeClass(e),this.$secondaryPaging.removeClass(e),h<=this.options.dropPagingCap){for(this.$primaryPaging.addClass(e),b=this.$primaryPaging.find(".dropdown-menu"),b.empty(),c=0;h>c;c++)d=c+1,b.append('<li data-value="'+d+'"><a href="#">'+d+"</a></li>");this.$primaryPaging.find("input.form-control").val(this.currentPage+1)}else this.$secondaryPaging.addClass(e),this.$secondaryPaging.val(this.currentPage+1);this.lastPageInput=this.currentPage+1+"",this.$pages.html(h),this.currentPage+1<h?this.$nextBtn.removeAttr(f):this.$nextBtn.attr(f,f),this.currentPage-1>=0?this.$prevBtn.removeAttr(f):this.$prevBtn.attr(f,f),0!==this.pageIncrement&&(this.pageIncrement>0?this.$nextBtn.is(":disabled")?this.$prevBtn.focus():this.$nextBtn.focus():this.$prevBtn.is(":disabled")?this.$nextBtn.focus():this.$prevBtn.focus())},previous:function(){var a="disabled";this.$nextBtn.attr(a,a),this.$prevBtn.attr(a,a),this.pageIncrement=-1,this.$element.trigger("previousClicked.fu.repeater"),this.render({pageIncrement:this.pageIncrement})},render:function(b){var c,d=this,e=!1,f=a.fn.repeater.views[d.currentView]||{},g=function(){var a=function(){(!d.infiniteScrollingEnabled||d.infiniteScrollingEnabled&&e)&&d.$loader.show().loader("play"),d.getDataOptions(b,function(a){d.options.dataSource(a,function(a){var c=f.renderer;d.infiniteScrollingEnabled?d.infiniteScrollingCallback({}):(d.itemization(a),d.pagination(a)),c&&d.runRenderer(d.$canvas,c,a,function(){d.infiniteScrollingEnabled&&((e||b.clearInfinite)&&d.initInfiniteScrolling(),d.infiniteScrollPaging(a,b)),d.$loader.hide().loader("pause"),d.$element.trigger("loaded.fu.repeater")})})})};b.preserve=void 0!==b.preserve?b.preserve:!e,d.clear(b),!e&&f.cleared?f.cleared.call(d,{},function(){a()}):a()};b=b||{},b.changeView&&this.currentView!==b.changeView?(c=this.currentView,this.currentView=b.changeView,this.$element.attr("data-currentview",this.currentView),e=!0,this.infiniteScrollingEnabled&&d.infiniteScrolling(!1),f=a.fn.repeater.views[d.currentView]||{},f.selected?f.selected.call(this,{prevView:c},function(){g()}):g()):g()},resize:function(){var b,c,d=this.staticHeight,e=a.fn.repeater.views[this.currentView]||{};void 0!==d?(this.$canvas.addClass("scrolling"),c={bottom:this.$viewport.css("margin-bottom"),top:this.$viewport.css("margin-top")},b=("true"===d||d===!0?this.$element.height():parseInt(d,10))-this.$element.find(".repeater-header").outerHeight()-this.$element.find(".repeater-footer").outerHeight()-("auto"===c.bottom?0:parseInt(c.bottom,10))-("auto"===c.top?0:parseInt(c.top,10)),this.$viewport.outerHeight(b)):this.$canvas.removeClass("scrolling"),e.resize&&e.resize.call(this,{height:this.$element.outerHeight(),width:this.$element.outerWidth()},function(){})},runRenderer:function(b,c,d,e){var f,g,h,i,j=this,k=!1,l=function(a){var f={container:b,data:d};c.repeat&&(f.subset=g,f.index=a),g.length<1?e():m(f,function(){a++,a<g.length?l(a):e()})},m=function(e,f){var g="",h={before:function(a){a&&a.skipNested===!0&&(k=!0),i("render",e)},render:function(c){var d=c&&c.action?c.action:"append";c&&void 0!==c.item&&(g=a(c.item),g.length<1&&(g=c.item),"none"!==d&&b[d](g),e.item=g),c&&c.skipNested===!0&&(k=!0),i("after",e)},after:function(f){var l,m=function(a,b){j.runRenderer(a,c.nested[b],d,function(){b++,b<c.nested.length?m(a,b):i("complete",e)})};f&&f.skipNested===!0&&(k=!0),c.nested&&!k?(l=a(g),l="true"===l.attr("data-container")?l:l.find('[data-container="true"]:first'),l.length<1&&(l=b),m(l,0)):h.complete(null)},complete:function(){f&&f()}},i=function(b,d){d=a.extend({},d),c[b]?c[b].call(j,d,h[b]):h[b](null)};i("before",e)};if(c.repeat)for(f=c.repeat.split("."),"data"===f[0]||"this"===f[0]?(g="this"===f[0]?this:d,f.shift()):(f=[],g=[""]),h=0,i=f.length;i>h;h++)g=g[f[h]];else g=[""];l(0)},viewChanged:function(b){var c=a(b.target),d=c.val();this.$element.trigger("viewChanged.fu.repeater",d),this.render({changeView:d,pageIncrement:null})}},a.fn.repeater=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.repeater"),h="object"==typeof b&&b;g||f.data("fu.repeater",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.repeater.defaults={dataSource:function(){},defaultView:-1,dropPagingCap:10,staticHeight:-1},a.fn.repeater.views={},a.fn.repeater.Constructor=c,a.fn.repeater.noConflict=function(){return a.fn.repeater=b,this}}(a),function(a){a.fn.repeater&&(a.fn.repeater.Constructor.prototype.list_clearSelectedItems=function(){this.$canvas.find(".repeater-list-check").remove(),this.$canvas.find(".repeater-list table tbody tr.selected").removeClass("selected")},a.fn.repeater.Constructor.prototype.list_getSelectedItems=function(){var b=[];return this.$canvas.find(".repeater-list table tbody tr.selected").each(function(){var c=a(this);b.push({data:c.data("item_data"),element:c})}),b},a.fn.repeater.Constructor.prototype.list_positionHeadings=function(){var b=this.$element.find(".repeater-list-wrapper"),c=b.offset().left,d=b.scrollLeft();b.find(".repeater-list-heading").each(d>0?function(){var b=a(this),d=b.parents("th:first").offset().left-c+"px";b.addClass("shifted").css("left",d)}:function(){a(this).removeClass("shifted").css("left","")})},a.fn.repeater.Constructor.prototype.list_setSelectedItems=function(b,c){var d,e,f,g,h=this.options.list_selectable,i=this,j=function(){f=a(this),d=f.data("item_data")||{},d[b[e].property]===b[e].value&&k(f,b[e].selected)},k=function(a,b){b=void 0!==b?b:!0,b?(c||"multi"===h||i.list_clearSelectedItems(),a.hasClass("selected")||(a.addClass("selected"),a.find("td:first").prepend('<div class="repeater-list-check"><span class="glyphicon glyphicon-ok"></span></div>'))):(a.find(".repeater-list-check").remove(),a.removeClass("selected"))};for(a.isArray(b)||(b=[b]),g=c===!0||"multi"===h?b.length:h&&b.length>0?1:0,e=0;g>e;e++)void 0!==b[e].index?(f=this.$canvas.find(".repeater-list table tbody tr:nth-child("+(b[e].index+1)+")"),f.length>0&&k(f,b[e].selected)):void 0!==b[e].property&&void 0!==b[e].value&&this.$canvas.find(".repeater-list table tbody tr").each(j)},a.fn.repeater.Constructor.prototype.list_sizeHeadings=function(){var b=this.$element.find(".repeater-list table");b.find("thead th").each(function(){var b=a(this),c=b.find(".repeater-list-heading");c.outerHeight(b.outerHeight()),c.outerWidth(b.outerWidth())})},a.fn.repeater.defaults=a.extend({},a.fn.repeater.defaults,{list_columnRendered:null,list_columnSizing:!0,list_columnSyncing:!0,list_infiniteScroll:!1,list_noItemsHTML:"",list_selectable:!1,list_sortClearing:!1,list_rowRendered:null}),a.fn.repeater.views.list={cleared:function(a,b){this.options.list_columnSyncing&&this.list_sizeHeadings(),b()},dataOptions:function(a,b){this.list_sortDirection&&(a.sortDirection=this.list_sortDirection),this.list_sortProperty&&(a.sortProperty=this.list_sortProperty),b(a)},initialize:function(a,b){this.list_sortDirection=null,this.list_sortProperty=null,b()},selected:function(a,b){var c,d=this.options.list_infiniteScroll;this.list_firstRender=!0,this.$loader.addClass("noHeader"),d&&(c="object"==typeof d?d:{},this.infiniteScrolling(!0,c)),b()},resize:function(a,b){this.options.list_columnSyncing&&this.list_sizeHeadings(),b()},renderer:{complete:function(a,b){this.options.list_columnSyncing&&(this.list_sizeHeadings(),this.list_positionHeadings()),b()},render:function(b,c){var d,e=this.$element.find(".repeater-list"),f=this;e.length>0?c({action:"none",item:e}):(d=a('<div class="repeater-list" data-preserve="shallow"><div class="repeater-list-wrapper" data-infinite="true" data-preserve="shallow"><table aria-readonly="true" class="table" data-container="true" data-preserve="shallow" role="grid"></table></div></div>'),d.find(".repeater-list-wrapper").on("scroll.fu.repeaterList",function(){f.options.list_columnSyncing&&f.list_positionHeadings()}),c({item:d}))},nested:[{complete:function(b,c){var d,e,f,g,h=[],i=this;if(!this.options.list_columnSizing||this.list_columnsSame)c();else{if(d=0,g=0,b.item.find("th").each(function(){var b,c=a(this),e=0===c.next("th").length;void 0!==i.list_columns[d].width?(b=i.list_columns[d].width,c.outerWidth(b),g+=c.outerWidth(),e?c.outerWidth(""):i.list_columns[d]._auto_width=b):h.push({col:c,index:d,last:e}),d++}),e=h.length,e>0)for(f=Math.floor((this.$canvas.width()-g)/e),d=0;e>d;d++)h[d].last||(h[d].col.outerWidth(f),this.list_columns[h[d].index]._auto_width=f);c()}},render:function(a,b){var c=function(a,b){var c,d,e;if(!a)return!0;if(!b)return!1;for(c=0,e=b.length;e>c;c++){if(!a[c])return!0;for(d in b[c])if(a[c][d]!==b[c][d])return!0}return!1};this.list_firstRender||c(this.list_columns,a.data.columns)?(this.$element.find(".repeater-list-header").remove(),this.list_columns=a.data.columns,this.list_columnsSame=!1,this.list_firstRender=!1,this.$loader.removeClass("noHeader"),b({item:'<thead data-preserve="deep"><tr data-container="true"></tr></thead>'})):(this.list_columnsSame=!0,b({skipNested:!0}))},nested:[{render:function(b,c){var d,e,f,g,h,i="glyphicon-chevron-down",j=".glyphicon.rlc:first",k="glyphicon-chevron-up",l=a('<div class="repeater-list-heading"><span class="glyphicon rlc"></span></div>'),m=b.index,n=a("<th></th>"),o=this,p=b.subset;l.prepend(b.subset[b.index].label),n.html(l.html()).find("[id]").removeAttr("id"),n.append(l),d=n.add(l),g=l.find(j),h=g.add(n.find(j)),e=p[m].className,void 0!==e&&d.addClass(e),f=p[m].sortable,f&&(d.addClass("sortable"),l.on("click.fu.repeaterList",function(){o.list_sortProperty="string"==typeof f?f:p[m].property,l.hasClass("sorted")?g.hasClass(k)?(h.removeClass(k).addClass(i),o.list_sortDirection="desc"):o.options.list_sortClearing?(d.removeClass("sorted"),h.removeClass(i),o.list_sortDirection=null,o.list_sortProperty=null):(h.removeClass(i).addClass(k),o.list_sortDirection="asc"):(b.container.find("th, .repeater-list-heading").removeClass("sorted"),h.removeClass(i).addClass(k),o.list_sortDirection="asc",d.addClass("sorted")),o.render({clearInfinite:!0,pageIncrement:null})})),("asc"===p[m].sortDirection||"desc"===p[m].sortDirection)&&(b.container.find("th, .repeater-list-heading").removeClass("sorted"),d.addClass("sortable sorted"),"asc"===p[m].sortDirection?(h.addClass(k),this.list_sortDirection="asc"):(h.addClass(i),this.list_sortDirection="desc"),this.list_sortProperty="string"==typeof f?f:p[m].property),c({item:n})},repeat:"data.columns"}]},{render:function(b,c){var d,e=a('<tbody data-container="true"></tbody>'),f={};b.data.items.length<1&&(f.skipNested=!0,d=a('<tr class="empty"><td colspan="'+this.list_columns.length+'"></td></tr>'),d.find("td").append(this.options.list_noItemsHTML),e.append(d)),f.item=e,c(f)},nested:[{complete:function(a,b){var c={container:a.container,rowData:a.subset[a.index]};void 0!==a.item&&(c.item=a.item),this.options.list_rowRendered?this.options.list_rowRendered(c,function(){b()}):b()},render:function(b,c){var d=a('<tr data-container="true"></tr>'),e=this;this.options.list_selectable&&(d.addClass("selectable"),d.attr("tabindex",0),d.data("item_data",b.subset[b.index]),d.on("click.fu.repeaterList",function(){var b=a(this);b.hasClass("selected")?(b.removeClass("selected"),b.find(".repeater-list-check").remove(),e.$element.trigger("deselected.fu.repeaterList",b)):("multi"!==e.options.list_selectable&&(e.$canvas.find(".repeater-list-check").remove(),e.$canvas.find(".repeater-list tbody tr.selected").each(function(){a(this).removeClass("selected"),e.$element.trigger("deselected.fu.repeaterList",a(this))})),b.addClass("selected"),b.find("td:first").prepend('<div class="repeater-list-check"><span class="glyphicon glyphicon-ok"></span></div>'),e.$element.trigger("selected.fu.repeaterList",b))}),d.keyup(function(a){13===a.keyCode&&d.trigger("clicked.fu.repeaterList")})),this.list_curRowIndex=b.index,c({item:d})},repeat:"data.items",nested:[{after:function(a,b){var c={container:a.container,columnAttr:a.subset[a.index].property,rowData:a.data.items[this.list_curRowIndex]};void 0!==a.item&&(c.item=a.item),this.options.list_columnRendered?this.options.list_columnRendered(c,function(){b()}):b()},render:function(b,c){var d=b.subset[b.index].className,e=b.data.items[this.list_curRowIndex][b.subset[b.index].property],f=a("<td></td>"),g=b.subset[b.index]._auto_width;f.addClass(void 0!==d?d:"").append(e),void 0!==g&&f.outerWidth(g),c({item:f})},repeat:"this.list_columns"}]}]}]}})}(a),function(a){a.fn.repeater&&(a.fn.repeater.Constructor.prototype.thumbnail_clearSelectedItems=function(){this.$canvas.find(".repeater-thumbnail-cont .repeater-thumbnail.selected").removeClass("selected")},a.fn.repeater.Constructor.prototype.thumbnail_getSelectedItems=function(){var b=[];return this.$canvas.find(".repeater-thumbnail-cont .repeater-thumbnail.selected").each(function(){b.push(a(this))}),b},a.fn.repeater.Constructor.prototype.thumbnail_setSelectedItems=function(b,c){var d,e,f,g=this.options.thumbnail_selectable,h=this,i=function(){e=a(this),e.is(b[d].selector)&&j(e,b[d].selected)},j=function(a,b){b=void 0!==b?b:!0,b?(c||"multi"===g||h.thumbnail_clearSelectedItems(),a.addClass("selected")):a.removeClass("selected")};for(a.isArray(b)||(b=[b]),f=c===!0||"multi"===g?b.length:g&&b.length>0?1:0,d=0;f>d;d++)void 0!==b[d].index?(e=this.$canvas.find(".repeater-thumbnail-cont .repeater-thumbnail:nth-child("+(b[d].index+1)+")"),e.length>0&&j(e,b[d].selected)):b[d].selector&&this.$canvas.find(".repeater-thumbnail-cont .repeater-thumbnail").each(i)},a.fn.repeater.defaults=a.extend({},a.fn.repeater.defaults,{thumbnail_infiniteScroll:!1,thumbnail_itemRendered:null,thumbnail_selectable:!1,thumbnail_template:'<div class="thumbnail repeater-thumbnail"><img height="75" src="{{src}}" width="65"><span>{{name}}</span></div>'}),a.fn.repeater.views.thumbnail={selected:function(a,b){var c,d=this.options.thumbnail_infiniteScroll;d&&(c="object"==typeof d?d:{},this.infiniteScrolling(!0,c)),b({})},renderer:{render:function(b,c){var d,e=this.$canvas.find(".repeater-thumbnail-cont"),f={};e.length>0?f.action="none":e=a('<div class="clearfix repeater-thumbnail-cont" data-container="true" data-infinite="true" data-preserve="shallow"></div>'),f.item=e,b.data.items.length<1?(f.skipNested=!0,d=a('<div class="empty"></div>'),d.append(this.options.thumbnail_noItemsHTML),e.append(d)):e.find(".empty:first").remove(),c(f)},nested:[{after:function(b,c){var d,e={container:b.container,itemData:b.subset[b.index]},f=this.options.thumbnail_selectable,g="selected",h=this;void 0!==b.item&&(e.item=b.item,f&&(d=a(e.item),d.addClass("selectable"),d.on("click",function(){d.hasClass(g)?(d.removeClass(g),h.$element.trigger("deselected.fu.repeaterThumbnail",d)):("multi"!==f&&h.$canvas.find(".repeater-thumbnail-cont .repeater-thumbnail.selected").each(function(){var b=a(this);b.removeClass(g),h.$element.trigger("deselected.fu.repeaterThumbnail",b)}),d.addClass(g),h.$element.trigger("selected.fu.repeaterThumbnail",d))}))),this.options.thumbnail_itemRendered?this.options.thumbnail_itemRendered(e,function(){c()}):c()},render:function(b,c){var d=b.subset[b.index],e=function(b){for(var c=!1,e=function(){var e,f,g;f=b.indexOf("{{"),e=b.indexOf("}}",f+2),f>-1&&e>-1?(g=a.trim(b.substring(f+2,e)),g=void 0!==d[g]?d[g]:"",b=b.substring(0,f)+g+b.substring(e+2)):c=!0};!c&&b.search("{{")>=0;)e(b);return b};c({item:e(this.options.thumbnail_template)})},repeat:"data.items"}]}})}(a),function(a){var b=a.fn.scheduler,c=function(b,c){var d=this;this.$element=a(b),this.options=a.extend({},a.fn.scheduler.defaults,c),this.$startDate=this.$element.find(".start-datetime .start-date"),this.$startTime=this.$element.find(".start-datetime .start-time"),this.$timeZone=this.$element.find(".timezone-container .timezone"),this.$repeatIntervalPanel=this.$element.find(".repeat-every-panel"),this.$repeatIntervalSelect=this.$element.find(".repeat-options"),this.$repeatIntervalSpinbox=this.$element.find(".repeat-every"),this.$repeatIntervalTxt=this.$element.find(".repeat-every-text"),this.$end=this.$element.find(".repeat-end"),this.$endSelect=this.$end.find(".end-options"),this.$endAfter=this.$end.find(".end-after"),this.$endDate=this.$end.find(".end-on-date"),this.$recurrencePanels=this.$element.find(".repeat-panel"),this.$repeatIntervalSelect.selectlist(),this.$element.find(".selectlist").selectlist(),this.$startDate.datepicker(),this.$startTime.combobox(),""===this.$startTime.find("input").val()&&this.$startTime.combobox("selectByIndex",0),this.$repeatIntervalSpinbox.spinbox("0"===this.$repeatIntervalSpinbox.find("input").val()?{value:1,min:1}:{min:1}),this.$endAfter.spinbox({value:1,min:1}),this.$endDate.datepicker(),this.$element.find(".radio-custom").radio(),this.$repeatIntervalSelect.on("changed.fu.selectlist",a.proxy(this.repeatIntervalSelectChanged,this)),this.$endSelect.on("changed.fu.selectlist",a.proxy(this.endSelectChanged,this)),this.$element.find(".repeat-days-of-the-week .btn-group .btn").on("change.fu.scheduler",function(a,b){d.changed(a,b,!0)}),this.$element.find(".combobox").on("changed.fu.combobox",a.proxy(this.changed,this)),this.$element.find(".datepicker").on("changed.fu.datepicker",a.proxy(this.changed,this)),this.$element.find(".selectlist").on("changed.fu.selectlist",a.proxy(this.changed,this)),this.$element.find(".spinbox").on("changed.fu.spinbox",a.proxy(this.changed,this)),this.$element.find(".repeat-monthly .radio, .repeat-yearly .radio").on("change.fu.scheduler",a.proxy(this.changed,this))};c.prototype={constructor:c,destroy:function(){var b;return this.$element.find("input").each(function(){a(this).attr("value",a(this).val())}),this.$element.find(".datepicker .calendar").empty(),b=this.$element[0].outerHTML,this.$element.find(".combobox").combobox("destroy"),this.$element.find(".datepicker").datepicker("destroy"),this.$element.find(".selectlist").selectlist("destroy"),this.$element.find(".spinbox").spinbox("destroy"),this.$element.find("[type=radio]").radio("destroy"),this.$element.remove(),b},changed:function(b,c,d){d||b.stopPropagation(),this.$element.trigger("changed.fu.scheduler",{data:void 0!==c?c:a(b.currentTarget).data(),originalEvent:b,value:this.getValue()})},disable:function(){this.toggleState("disable")},enable:function(){this.toggleState("enable")},endSelectChanged:function(a,b){var c,d;b?d=b.value:(c=this.$endSelect.selectlist("selectedItem"),d=c.value),this.$endAfter.parent().addClass("hide"),this.$endAfter.parent().attr("aria-hidden","true"),this.$endDate.parent().addClass("hide"),this.$endDate.parent().attr("aria-hidden","true"),"after"===d?(this.$endAfter.parent().removeClass("hide"),this.$endAfter.parent().attr("aria-hidden","false")):"date"===d&&(this.$endDate.parent().removeClass("hide"),this.$endDate.parent().attr("aria-hidden","false"))},getValue:function(){var b,c=this.$repeatIntervalSpinbox.spinbox("value"),d="",e=this.$repeatIntervalSelect.selectlist("selectedItem").value,f=this.$startTime.combobox("selectedItem").text.toLowerCase(),g=this.$timeZone.selectlist("selectedItem");b=function(a,b){var c,d="";return d+=a.getFullYear(),d+=b,c=a.getMonth()+1,d+=10>c?"0"+c:c,d+=b,c=a.getDate(),d+=10>c?"0"+c:c};var h,i,j,k,l,m,n,o;n=""+b(this.$startDate.datepicker("getDate"),"-"),n+="T",j=f.search("am")>=0,k=f.search("pm")>=0,f=a.trim(f.replace(/am/g,"").replace(/pm/g,"")).split(":"),f[0]=parseInt(f[0],10),f[1]=parseInt(f[1],10),j&&f[0]>11?f[0]=0:k&&f[0]<12&&(f[0]+=12),n+=f[0]<10?"0"+f[0]:f[0],n+=":",n+=f[1]<10?"0"+f[1]:f[1],n+="+00:00"===g.offset?"Z":g.offset,"none"===e?d="FREQ=DAILY;INTERVAL=1;COUNT=1;":"hourly"===e?(d="FREQ=HOURLY;",d+="INTERVAL="+c+";"):"daily"===e?(d+="FREQ=DAILY;",d+="INTERVAL="+c+";"):"weekdays"===e?(d+="FREQ=DAILY;",d+="BYDAY=MO,TU,WE,TH,FR;",d+="INTERVAL=1;"):"weekly"===e?(i=[],this.$element.find(".repeat-days-of-the-week .btn-group input:checked").each(function(){i.push(a(this).data().value)}),d+="FREQ=WEEKLY;",d+="BYDAY="+i.join(",")+";",d+="INTERVAL="+c+";"):"monthly"===e?(d+="FREQ=MONTHLY;",d+="INTERVAL="+c+";",o=this.$element.find("input[name=repeat-monthly]:checked").val(),"bymonthday"===o?(h=parseInt(this.$element.find(".repeat-monthly-date .selectlist").selectlist("selectedItem").text,10),d+="BYMONTHDAY="+h+";"):"bysetpos"===o&&(i=this.$element.find(".month-days").selectlist("selectedItem").value,m=this.$element.find(".month-day-pos").selectlist("selectedItem").value,d+="BYDAY="+i+";",d+="BYSETPOS="+m+";")):"yearly"===e&&(d+="FREQ=YEARLY;",o=this.$element.find("input[name=repeat-yearly]:checked").val(),"bymonthday"===o?(l=this.$element.find(".repeat-yearly-date .year-month").selectlist("selectedItem").value,h=this.$element.find(".year-month-day").selectlist("selectedItem").text,d+="BYMONTH="+l+";",d+="BYMONTHDAY="+h+";"):"bysetpos"===o&&(i=this.$element.find(".year-month-days").selectlist("selectedItem").value,m=this.$element.find(".year-month-day-pos").selectlist("selectedItem").value,l=this.$element.find(".repeat-yearly-day .year-month").selectlist("selectedItem").value,d+="BYDAY="+i+";",d+="BYSETPOS="+m+";",d+="BYMONTH="+l+";"));var p=this.$endSelect.selectlist("selectedItem").value,q="";"none"!==e&&("after"===p?q="COUNT="+this.$endAfter.spinbox("value")+";":"date"===p&&(q="UNTIL="+b(this.$endDate.datepicker("getDate"),"")+";")),d+=q;var r={startDateTime:n,timeZone:{name:g.name,offset:g.offset},recurrencePattern:d};return r},repeatIntervalSelectChanged:function(a,b){var c,d,e;switch(b?(d=b.value,e=b.text):(c=this.$repeatIntervalSelect.selectlist("selectedItem"),d=c.value,e=c.text),this.$repeatIntervalTxt.text(e),d.toLowerCase()){case"hourly":case"daily":case"weekly":case"monthly":this.$repeatIntervalPanel.removeClass("hide"),this.$repeatIntervalPanel.attr("aria-hidden","false");break;default:this.$repeatIntervalPanel.addClass("hide"),this.$repeatIntervalPanel.attr("aria-hidden","true")}this.$recurrencePanels.addClass("hide"),this.$recurrencePanels.attr("aria-hidden","true"),this.$element.find(".repeat-"+d).removeClass("hide"),this.$element.find(".repeat-"+d).attr("aria-hidden","false"),"none"===d?(this.$end.addClass("hide"),this.$end.attr("aria-hidden","true")):(this.$end.removeClass("hide"),this.$end.attr("aria-hidden","false"))},setValue:function(b){var c,d,e,f,g,h,i,j;if(b.startDateTime&&(j=b.startDateTime.split("T"),this.$startDate.datepicker("setDate",j[0]),j[1]&&(j[1]=j[1].split(":"),c=parseInt(j[1][0],10),g=j[1][1]?parseInt(j[1][1].split("+")[0].split("-")[0].split("Z")[0],10):0,h=12>c?"AM":"PM",0===c?c=12:c>12&&(c-=12),g=10>g?"0"+g:g,j=c+":"+g+" "+h,this.$startTime.find("input").val(j),this.$startTime.combobox("selectByText",j))),e="li[data",b.timeZone?(e+="string"==typeof b.timeZone?'-name="'+b.timeZone:b.timeZone.name?'-name="'+b.timeZone.name:'-offset="'+b.timeZone.offset,e+='"]',this.$timeZone.selectlist("selectBySelector",e)):b.startDateTime&&(j=b.startDateTime.split("T")[1],j=j?j.search(/\+/)>-1?"+"+a.trim(j.split("+")[1]):j.search(/\-/)>-1?"-"+a.trim(j.split("-")[1]):"+00:00":"+00:00",e+='-offset="'+j+'"]',this.$timeZone.selectlist("selectBySelector",e)),b.recurrencePattern){for(i={},j=b.recurrencePattern.toUpperCase().split(";"),d=0,f=j.length;f>d;d++)""!==j[d]&&(e=j[d].split("="),i[e[0]]=e[1]);if("DAILY"===i.FREQ)e="MO,TU,WE,TH,FR"===i.BYDAY?"weekdays":"1"===i.INTERVAL&&"1"===i.COUNT?"none":"daily";else if("HOURLY"===i.FREQ)e="hourly";else if("WEEKLY"===i.FREQ){if(i.BYDAY)for(e=this.$element.find(".repeat-days-of-the-week .btn-group"),e.find("label").removeClass("active"),j=i.BYDAY.split(","),d=0,f=j.length;f>d;d++)e.find('input[data-value="'+j[d]+'"]').parent().addClass("active");e="weekly"}else"MONTHLY"===i.FREQ?(this.$element.find(".repeat-monthly input").removeAttr("checked").removeClass("checked"),this.$element.find(".repeat-monthly label.radio-custom").removeClass("checked"),i.BYMONTHDAY?(j=this.$element.find(".repeat-monthly-date"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),j.find(".selectlist").selectlist("selectByValue",i.BYMONTHDAY)):i.BYDAY&&(j=this.$element.find(".repeat-monthly-day"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),i.BYSETPOS&&j.find(".month-day-pos").selectlist("selectByValue",i.BYSETPOS),j.find(".month-days").selectlist("selectByValue",i.BYDAY)),e="monthly"):"YEARLY"===i.FREQ?(this.$element.find(".repeat-yearly input").removeAttr("checked").removeClass("checked"),this.$element.find(".repeat-yearly label.radio-custom").removeClass("checked"),i.BYMONTHDAY?(j=this.$element.find(".repeat-yearly-date"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),i.BYMONTH&&j.find(".year-month").selectlist("selectByValue",i.BYMONTH),j.find(".year-month-day").selectlist("selectByValue",i.BYMONTHDAY)):i.BYSETPOS&&(j=this.$element.find(".repeat-yearly-day"),j.find("input").addClass("checked").attr("checked","checked"),j.find("label.radio-custom").addClass("checked"),j.find(".year-month-day-pos").selectlist("selectByValue",i.BYSETPOS),i.BYDAY&&j.find(".year-month-days").selectlist("selectByValue",i.BYDAY),i.BYMONTH&&j.find(".year-month").selectlist("selectByValue",i.BYMONTH)),e="yearly"):e="none"; -i.COUNT?(this.$endAfter.spinbox("value",parseInt(i.COUNT,10)),this.$endSelect.selectlist("selectByValue","after")):i.UNTIL&&(j=i.UNTIL,8===j.length&&(j=j.split(""),j.splice(4,0,"-"),j.splice(7,0,"-"),j=j.join("")),this.$endDate.datepicker("setDate",j),this.$endSelect.selectlist("selectByValue","date")),this.endSelectChanged(),i.INTERVAL&&this.$repeatIntervalSpinbox.spinbox("value",parseInt(i.INTERVAL,10)),this.$repeatIntervalSelect.selectlist("selectByValue",e),this.repeatIntervalSelectChanged()}},toggleState:function(a){this.$element.find(".combobox").combobox(a),this.$element.find(".datepicker").datepicker(a),this.$element.find(".selectlist").selectlist(a),this.$element.find(".spinbox").spinbox(a),this.$element.find("[type=radio]").radio(a),a="disable"===a?"addClass":"removeClass",this.$element.find(".repeat-days-of-the-week .btn-group")[a]("disabled")},value:function(a){return a?this.setValue(a):this.getValue()}},a.fn.scheduler=function(b){var d,e=Array.prototype.slice.call(arguments,1),f=this.each(function(){var f=a(this),g=f.data("fu.scheduler"),h="object"==typeof b&&b;g||f.data("fu.scheduler",g=new c(this,h)),"string"==typeof b&&(d=g[b].apply(g,e))});return void 0===d?f:d},a.fn.scheduler.defaults={},a.fn.scheduler.Constructor=c,a.fn.scheduler.noConflict=function(){return a.fn.scheduler=b,this},a(document).on("mousedown.fu.scheduler.data-api","[data-initialize=scheduler]",function(b){var c=a(b.target).closest(".scheduler");c.data("fu.scheduler")||c.scheduler(c.data())}),a(function(){a("[data-initialize=scheduler]").each(function(){var b=a(this);b.data("scheduler")||b.scheduler(b.data())})})}(a)}); /*! FullCalendar v5.10.1 Docs & License: https://fullcalendar.io/ @@ -2081,7 +2067,9 @@ return (function () { getCacheBusterParam: false, globalViewTransitions: false, methodsThatUseUrlParams: ["get"], - selfRequestsOnly: false + selfRequestsOnly: false, + ignoreTitle: false, + scrollIntoViewOnBoost: true }, parseInterval:parseInterval, _:internalEval, @@ -2093,7 +2081,7 @@ return (function () { sock.binaryType = htmx.config.wsBinaryType; return sock; }, - version: "1.9.6" + version: "1.9.9" }; /** @type {import("./htmx").HtmxInternalApi} */ @@ -2603,8 +2591,12 @@ return (function () { return [closest(elt, normalizeSelector(selector.substr(8)))]; } else if (selector.indexOf("find ") === 0) { return [find(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector === "next") { + return [elt.nextElementSibling] } else if (selector.indexOf("next ") === 0) { return [scanForwardQuery(elt, normalizeSelector(selector.substr(5)))]; + } else if (selector === "previous") { + return [elt.previousElementSibling] } else if (selector.indexOf("previous ") === 0) { return [scanBackwardsQuery(elt, normalizeSelector(selector.substr(9)))]; } else if (selector === 'document') { @@ -3147,6 +3139,8 @@ return (function () { var SYMBOL_CONT = /[_$a-zA-Z0-9]/; var STRINGISH_START = ['"', "'", "/"]; var NOT_WHITESPACE = /[^\s]/; + var COMBINED_SELECTOR_START = /[{(]/; + var COMBINED_SELECTOR_END = /[})]/; function tokenizeString(str) { var tokens = []; var position = 0; @@ -3235,6 +3229,18 @@ return (function () { return result; } + function consumeCSSSelector(tokens) { + var result; + if (tokens.length > 0 && COMBINED_SELECTOR_START.test(tokens[0])) { + tokens.shift(); + result = consumeUntil(tokens, COMBINED_SELECTOR_END).trim(); + tokens.shift(); + } else { + result = consumeUntil(tokens, WHITESPACE_OR_COMMA); + } + return result; + } + var INPUT_SELECTOR = 'input, textarea, select'; /** @@ -3283,27 +3289,33 @@ return (function () { triggerSpec.delay = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); } else if (token === "from" && tokens[0] === ":") { tokens.shift(); - var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA); - if (from_arg === "closest" || from_arg === "find" || from_arg === "next" || from_arg === "previous") { - tokens.shift(); - from_arg += - " " + - consumeUntil( - tokens, - WHITESPACE_OR_COMMA - ); + if (COMBINED_SELECTOR_START.test(tokens[0])) { + var from_arg = consumeCSSSelector(tokens); + } else { + var from_arg = consumeUntil(tokens, WHITESPACE_OR_COMMA); + if (from_arg === "closest" || from_arg === "find" || from_arg === "next" || from_arg === "previous") { + tokens.shift(); + var selector = consumeCSSSelector(tokens); + // `next` and `previous` allow a selector-less syntax + if (selector.length > 0) { + from_arg += " " + selector; + } + } } triggerSpec.from = from_arg; } else if (token === "target" && tokens[0] === ":") { tokens.shift(); - triggerSpec.target = consumeUntil(tokens, WHITESPACE_OR_COMMA); + triggerSpec.target = consumeCSSSelector(tokens); } else if (token === "throttle" && tokens[0] === ":") { tokens.shift(); triggerSpec.throttle = parseInterval(consumeUntil(tokens, WHITESPACE_OR_COMMA)); } else if (token === "queue" && tokens[0] === ":") { tokens.shift(); triggerSpec.queue = consumeUntil(tokens, WHITESPACE_OR_COMMA); - } else if ((token === "root" || token === "threshold") && tokens[0] === ":") { + } else if (token === "root" && tokens[0] === ":") { + tokens.shift(); + triggerSpec[token] = consumeCSSSelector(tokens); + } else if (token === "threshold" && tokens[0] === ":") { tokens.shift(); triggerSpec[token] = consumeUntil(tokens, WHITESPACE_OR_COMMA); } else { @@ -3913,32 +3925,39 @@ return (function () { } } - function initButtonTracking(elt) { - // Handle submit buttons/inputs that have the form attribute set - // see https://developer.mozilla.org/docs/Web/HTML/Element/button - var form = resolveTarget("#" + getRawAttribute(elt, "form")) || closest(elt, "form") - if (!form) { - return + // Handle submit buttons/inputs that have the form attribute set + // see https://developer.mozilla.org/docs/Web/HTML/Element/button + function maybeSetLastButtonClicked(evt) { + var elt = closest(evt.target, "button, input[type='submit']"); + var internalData = getRelatedFormData(evt) + if (internalData) { + internalData.lastButtonClicked = elt; } - - var maybeSetLastButtonClicked = function (evt) { - var elt = closest(evt.target, "button, input[type='submit']"); - if (elt !== null) { - var internalData = getInternalData(form); - internalData.lastButtonClicked = elt; - } - }; - + }; + function maybeUnsetLastButtonClicked(evt){ + var internalData = getRelatedFormData(evt) + if (internalData) { + internalData.lastButtonClicked = null; + } + } + function getRelatedFormData(evt) { + var elt = closest(evt.target, "button, input[type='submit']"); + if (!elt) { + return; + } + var form = resolveTarget('#' + getRawAttribute(elt, 'form')) || closest(elt, 'form'); + if (!form) { + return; + } + return getInternalData(form); + } + function initButtonTracking(elt) { // need to handle both click and focus in: // focusin - in case someone tabs in to a button and hits the space bar // click - on OSX buttons do not focus on click see https://bugs.webkit.org/show_bug.cgi?id=13724 - elt.addEventListener('click', maybeSetLastButtonClicked) elt.addEventListener('focusin', maybeSetLastButtonClicked) - elt.addEventListener('focusout', function(evt){ - var internalData = getInternalData(form); - internalData.lastButtonClicked = null; - }) + elt.addEventListener('focusout', maybeUnsetLastButtonClicked) } function countCurlies(line) { @@ -3957,7 +3976,9 @@ return (function () { function addHxOnEventHandler(elt, eventName, code) { var nodeData = getInternalData(elt); - nodeData.onHandlers = []; + if (!Array.isArray(nodeData.onHandlers)) { + nodeData.onHandlers = []; + } var func; var listener = function (e) { return maybeEval(elt, function() { @@ -4176,6 +4197,12 @@ return (function () { return; } + if (htmx.config.historyCacheSize <= 0) { + // make sure that an eventually already existing cache is purged + localStorage.removeItem("htmx-history-cache"); + return; + } + url = normalizePath(url); var historyCache = parseJSON(localStorage.getItem("htmx-history-cache")) || []; @@ -4441,7 +4468,7 @@ return (function () { if (shouldInclude(elt)) { var name = getRawAttribute(elt,"name"); var value = elt.value; - if (elt.multiple) { + if (elt.multiple && elt.tagName === "SELECT") { value = toArray(elt.querySelectorAll("option:checked")).map(function (e) { return e.value }); } // include file inputs @@ -4481,6 +4508,9 @@ return (function () { var formValues = {}; var errors = []; var internalData = getInternalData(elt); + if (internalData.lastButtonClicked && !bodyContains(internalData.lastButtonClicked)) { + internalData.lastButtonClicked = null + } // only validate when form is directly submitted and novalidate or formnovalidate are not set // or if the element has an explicit hx-validate="true" on it @@ -4648,7 +4678,7 @@ return (function () { "swapDelay" : htmx.config.defaultSwapDelay, "settleDelay" : htmx.config.defaultSettleDelay } - if (getInternalData(elt).boosted && !isAnchorLink(elt)) { + if (htmx.config.scrollIntoViewOnBoost && getInternalData(elt).boosted && !isAnchorLink(elt)) { swapSpec["show"] = "top" } if (swapInfo) { @@ -4888,6 +4918,7 @@ return (function () { values : context.values, targetOverride: resolveTarget(context.target), swapOverride: context.swap, + select: context.select, returnPromise: true }); } @@ -4942,6 +4973,7 @@ return (function () { elt = getDocument().body; } var responseHandler = etc.handler || handleAjaxResponse; + var select = etc.select || null; if (!bodyContains(elt)) { // do not issue requests for elements removed from the DOM @@ -4966,16 +4998,20 @@ return (function () { var buttonVerb = getRawAttribute(submitter, "formmethod") if (buttonVerb != null) { - verb = buttonVerb; + // ignore buttons with formmethod="dialog" + if (buttonVerb.toLowerCase() !== "dialog") { + verb = buttonVerb; + } } } + var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm"); // allow event-based confirmation w/ a callback - if (!confirmed) { - var issueRequest = function() { - return issueAjaxRequest(verb, path, elt, event, etc, true); + if (confirmed === undefined) { + var issueRequest = function(skipConfirmation) { + return issueAjaxRequest(verb, path, elt, event, etc, !!skipConfirmation); } - var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest}; + var confirmDetails = {target: target, elt: elt, path: path, verb: verb, triggeringEvent: event, etc: etc, issueRequest: issueRequest, question: confirmQuestion}; if (triggerEvent(elt, 'htmx:confirm', confirmDetails) === false) { maybeCall(resolve); return promise; @@ -5076,8 +5112,7 @@ return (function () { } } - var confirmQuestion = getClosestAttributeValue(elt, "hx-confirm"); - if (confirmQuestion) { + if (confirmQuestion && !confirmed) { if(!confirm(confirmQuestion)) { maybeCall(resolve); endRequestLock() @@ -5087,6 +5122,11 @@ return (function () { var headers = getHeaders(elt, target, promptResponse); + + if (verb !== 'get' && !usesFormData(elt)) { + headers['Content-Type'] = 'application/x-www-form-urlencoded'; + } + if (etc.headers) { headers = mergeObjects(headers, etc.headers); } @@ -5100,10 +5140,6 @@ return (function () { var allParameters = mergeObjects(rawParameters, expressionVars); var filteredParameters = filterValues(allParameters, elt); - if (verb !== 'get' && !usesFormData(elt)) { - headers['Content-Type'] = 'application/x-www-form-urlencoded'; - } - if (htmx.config.getCacheBusterParam && verb === 'get') { filteredParameters['org.htmx.cache-buster'] = getRawAttribute(target, "id") || "true"; } @@ -5201,7 +5237,7 @@ return (function () { } var responseInfo = { - xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, + xhr: xhr, target: target, requestConfig: requestConfig, etc: etc, boosted: eltIsBoosted, select: select, pathInfo: { requestPath: path, finalRequestPath: finalPath, @@ -5372,6 +5408,7 @@ return (function () { var target = responseInfo.target; var etc = responseInfo.etc; var requestConfig = responseInfo.requestConfig; + var select = responseInfo.select; if (!triggerEvent(elt, 'htmx:beforeOnLoad', responseInfo)) return; @@ -5481,10 +5518,26 @@ return (function () { } var selectOverride; + if (select) { + selectOverride = select; + } + if (hasHeader(xhr, /HX-Reselect:/i)) { selectOverride = xhr.getResponseHeader("HX-Reselect"); } + // if we need to save history, do so, before swapping so that relative resources have the correct base URL + if (historyUpdate.type) { + triggerEvent(getDocument().body, 'htmx:beforeHistoryUpdate', mergeObjects({ history: historyUpdate }, responseInfo)); + if (historyUpdate.type === "push") { + pushUrlIntoHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path}); + } else { + replaceUrlInHistory(historyUpdate.path); + triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path}); + } + } + var settleInfo = makeSettleInfo(target); selectAndSwap(swapSpec.swapStyle, target, elt, serverResponse, settleInfo, selectOverride); @@ -5534,18 +5587,8 @@ return (function () { triggerEvent(elt, 'htmx:afterSettle', responseInfo); }); - // if we need to save history, do so - if (historyUpdate.type) { - if (historyUpdate.type === "push") { - pushUrlIntoHistory(historyUpdate.path); - triggerEvent(getDocument().body, 'htmx:pushedIntoHistory', {path: historyUpdate.path}); - } else { - replaceUrlInHistory(historyUpdate.path); - triggerEvent(getDocument().body, 'htmx:replacedInHistory', {path: historyUpdate.path}); - } - } if (responseInfo.pathInfo.anchor) { - var anchorTarget = find("#" + responseInfo.pathInfo.anchor); + var anchorTarget = getDocument().getElementById(responseInfo.pathInfo.anchor); if(anchorTarget) { anchorTarget.scrollIntoView({block:'start', behavior: "auto"}); } @@ -5702,25 +5745,34 @@ return (function () { //==================================================================== // Initialization //==================================================================== - var isReady = false - getDocument().addEventListener('DOMContentLoaded', function() { - isReady = true - }) - /** - * Execute a function now if DOMContentLoaded has fired, otherwise listen for it. - * - * This function uses isReady because there is no realiable way to ask the browswer whether - * the DOMContentLoaded event has already been fired; there's a gap between DOMContentLoaded - * firing and readystate=complete. + * We want to initialize the page elements after DOMContentLoaded + * fires, but there isn't always a good way to tell whether + * it has already fired when we get here or not. */ - function ready(fn) { - // Checking readyState here is a failsafe in case the htmx script tag entered the DOM by - // some means other than the initial page load. - if (isReady || getDocument().readyState === 'complete') { - fn(); - } else { - getDocument().addEventListener('DOMContentLoaded', fn); + function ready(functionToCall) { + // call the function exactly once no matter how many times this is called + var callReadyFunction = function() { + if (!functionToCall) return; + functionToCall(); + functionToCall = null; + }; + + if (getDocument().readyState === "complete") { + // DOMContentLoaded definitely fired, we can initialize the page + callReadyFunction(); + } + else { + /* DOMContentLoaded *maybe* already fired, wait for + * the next DOMContentLoaded or readystatechange event + */ + getDocument().addEventListener("DOMContentLoaded", function() { + callReadyFunction(); + }); + getDocument().addEventListener("readystatechange", function() { + if (getDocument().readyState !== "complete") return; + callReadyFunction(); + }); } } @@ -5728,9 +5780,9 @@ return (function () { if (htmx.config.includeIndicatorStyles !== false) { getDocument().head.insertAdjacentHTML("beforeend", "<style>\ - ." + htmx.config.indicatorClass + "{opacity:0;transition: opacity 200ms ease-in;}\ - ." + htmx.config.requestClass + " ." + htmx.config.indicatorClass + "{opacity:1}\ - ." + htmx.config.requestClass + "." + htmx.config.indicatorClass + "{opacity:1}\ + ." + htmx.config.indicatorClass + "{opacity:0}\ + ." + htmx.config.requestClass + " ." + htmx.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;}\ + ." + htmx.config.requestClass + "." + htmx.config.indicatorClass + "{opacity:1; transition: opacity 200ms ease-in;}\ </style>"); } } @@ -5946,5 +5998,5 @@ htmx.defineExtension("preload", { !function(e){if(!e.hasInitialised){var t={escapeRegExp:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},hasClass:function(e,t){var i=" ";return 1===e.nodeType&&(i+e.className+i).replace(/[\n\t]/g,i).indexOf(i+t+i)>=0},addClass:function(e,t){e.className+=" "+t},removeClass:function(e,t){var i=new RegExp("\\b"+this.escapeRegExp(t)+"\\b");e.className=e.className.replace(i,"")},interpolateString:function(e,t){var i=/{{([a-z][a-z0-9\-_]*)}}/gi;return e.replace(i,function(e){return t(arguments[1])||""})},getCookie:function(e){var t="; "+document.cookie,i=t.split("; "+e+"=");return i.length<2?void 0:i.pop().split(";").shift()},setCookie:function(e,t,i,n,o,s){var r=new Date;r.setDate(r.getDate()+(i||365));var a=[e+"="+t,"expires="+r.toUTCString(),"path="+(o||"/")];n&&a.push("domain="+n),s&&a.push("secure"),document.cookie=a.join(";")},deepExtend:function(e,t){for(var i in t)t.hasOwnProperty(i)&&(i in e&&this.isPlainObject(e[i])&&this.isPlainObject(t[i])?this.deepExtend(e[i],t[i]):e[i]=t[i]);return e},throttle:function(e,t){var i=!1;return function(){i||(e.apply(this,arguments),i=!0,setTimeout(function(){i=!1},t))}},hash:function(e){var t,i,n,o=0;if(0===e.length)return o;for(t=0,n=e.length;t<n;++t)i=e.charCodeAt(t),o=(o<<5)-o+i,o|=0;return o},normaliseHex:function(e){return"#"==e[0]&&(e=e.substr(1)),3==e.length&&(e=e[0]+e[0]+e[1]+e[1]+e[2]+e[2]),e},getContrast:function(e){e=this.normaliseHex(e);var t=parseInt(e.substr(0,2),16),i=parseInt(e.substr(2,2),16),n=parseInt(e.substr(4,2),16),o=(299*t+587*i+114*n)/1e3;return o>=128?"#000":"#fff"},getLuminance:function(e){var t=parseInt(this.normaliseHex(e),16),i=38,n=(t>>16)+i,o=(t>>8&255)+i,s=(255&t)+i,r=(16777216+65536*(n<255?n<1?0:n:255)+256*(o<255?o<1?0:o:255)+(s<255?s<1?0:s:255)).toString(16).slice(1);return"#"+r},isMobile:function(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)},isPlainObject:function(e){return"object"==typeof e&&null!==e&&e.constructor==Object},traverseDOMPath:function(e,i){return e&&e.parentNode?t.hasClass(e,i)?e:this.traverseDOMPath(e.parentNode,i):null}};e.status={deny:"deny",allow:"allow",dismiss:"dismiss"},e.transitionEnd=function(){var e=document.createElement("div"),t={t:"transitionend",OT:"oTransitionEnd",msT:"MSTransitionEnd",MozT:"transitionend",WebkitT:"webkitTransitionEnd"};for(var i in t)if(t.hasOwnProperty(i)&&"undefined"!=typeof e.style[i+"ransition"])return t[i];return""}(),e.hasTransition=!!e.transitionEnd;var i=Object.keys(e.status).map(t.escapeRegExp);e.customStyles={},e.Popup=function(){function n(){this.initialise.apply(this,arguments)}function o(e){this.openingTimeout=null,t.removeClass(e,"cc-invisible")}function s(t){t.style.display="none",t.removeEventListener(e.transitionEnd,this.afterTransition),this.afterTransition=null}function r(){var t=this.options.onInitialise.bind(this);if(!window.navigator.cookieEnabled)return t(e.status.deny),!0;if(window.CookiesOK||window.navigator.CookiesOK)return t(e.status.allow),!0;var i=Object.keys(e.status),n=this.getStatus(),o=i.indexOf(n)>=0;return o&&t(n),o}function a(){var e=this.options.position.split("-"),t=[];return e.forEach(function(e){t.push("cc-"+e)}),t}function c(){var e=this.options,i="top"==e.position||"bottom"==e.position?"banner":"floating";t.isMobile()&&(i="floating");var n=["cc-"+i,"cc-type-"+e.type,"cc-theme-"+e.theme];e["static"]&&n.push("cc-static"),n.push.apply(n,a.call(this));p.call(this,this.options.palette);return this.customStyleSelector&&n.push(this.customStyleSelector),n}function l(){var e={},i=this.options;i.showLink||(i.elements.link="",i.elements.messagelink=i.elements.message),Object.keys(i.elements).forEach(function(n){e[n]=t.interpolateString(i.elements[n],function(e){var t=i.content[e];return e&&"string"==typeof t&&t.length?t:""})});var n=i.compliance[i.type];n||(n=i.compliance.info),e.compliance=t.interpolateString(n,function(t){return e[t]});var o=i.layouts[i.layout];return o||(o=i.layouts.basic),t.interpolateString(o,function(t){return e[t]})}function u(i){var n=this.options,o=document.createElement("div"),s=n.container&&1===n.container.nodeType?n.container:document.body;o.innerHTML=i;var r=o.children[0];return r.style.display="none",t.hasClass(r,"cc-window")&&e.hasTransition&&t.addClass(r,"cc-invisible"),this.onButtonClick=h.bind(this),r.addEventListener("click",this.onButtonClick),n.autoAttach&&(s.firstChild?s.insertBefore(r,s.firstChild):s.appendChild(r)),r}function h(n){var o=t.traverseDOMPath(n.target,"cc-btn")||n.target;if(t.hasClass(o,"cc-btn")){var s=o.className.match(new RegExp("\\bcc-("+i.join("|")+")\\b")),r=s&&s[1]||!1;r&&(this.setStatus(r),this.close(!0))}t.hasClass(o,"cc-close")&&(this.setStatus(e.status.dismiss),this.close(!0)),t.hasClass(o,"cc-revoke")&&this.revokeChoice()}function p(e){var i=t.hash(JSON.stringify(e)),n="cc-color-override-"+i,o=t.isPlainObject(e);return this.customStyleSelector=o?n:null,o&&d(i,e,"."+n),o}function d(i,n,o){if(e.customStyles[i])return void++e.customStyles[i].references;var s={},r=n.popup,a=n.button,c=n.highlight;r&&(r.text=r.text?r.text:t.getContrast(r.background),r.link=r.link?r.link:r.text,s[o+".cc-window"]=["color: "+r.text,"background-color: "+r.background],s[o+".cc-revoke"]=["color: "+r.text,"background-color: "+r.background],s[o+" .cc-link,"+o+" .cc-link:active,"+o+" .cc-link:visited"]=["color: "+r.link],a&&(a.text=a.text?a.text:t.getContrast(a.background),a.border=a.border?a.border:"transparent",s[o+" .cc-btn"]=["color: "+a.text,"border-color: "+a.border,"background-color: "+a.background],a.padding&&s[o+" .cc-btn"].push("padding: "+a.padding),"transparent"!=a.background&&(s[o+" .cc-btn:hover, "+o+" .cc-btn:focus"]=["background-color: "+(a.hover||v(a.background))]),c?(c.text=c.text?c.text:t.getContrast(c.background),c.border=c.border?c.border:"transparent",s[o+" .cc-highlight .cc-btn:first-child"]=["color: "+c.text,"border-color: "+c.border,"background-color: "+c.background]):s[o+" .cc-highlight .cc-btn:first-child"]=["color: "+r.text]));var l=document.createElement("style");document.head.appendChild(l),e.customStyles[i]={references:1,element:l.sheet};var u=-1;for(var h in s)s.hasOwnProperty(h)&&l.sheet.insertRule(h+"{"+s[h].join(";")+"}",++u)}function v(e){return e=t.normaliseHex(e),"000000"==e?"#222":t.getLuminance(e)}function f(i){if(t.isPlainObject(i)){var n=t.hash(JSON.stringify(i)),o=e.customStyles[n];if(o&&!--o.references){var s=o.element.ownerNode;s&&s.parentNode&&s.parentNode.removeChild(s),e.customStyles[n]=null}}}function m(e,t){for(var i=0,n=e.length;i<n;++i){var o=e[i];if(o instanceof RegExp&&o.test(t)||"string"==typeof o&&o.length&&o===t)return!0}return!1}function b(){var i=this.setStatus.bind(this),n=this.close.bind(this),o=this.options.dismissOnTimeout;"number"==typeof o&&o>=0&&(this.dismissTimeout=window.setTimeout(function(){i(e.status.dismiss),n(!0)},Math.floor(o)));var s=this.options.dismissOnScroll;if("number"==typeof s&&s>=0){var r=function(t){window.pageYOffset>Math.floor(s)&&(i(e.status.dismiss),n(!0),window.removeEventListener("scroll",r),this.onWindowScroll=null)};this.options.enabled&&(this.onWindowScroll=r,window.addEventListener("scroll",r))}var a=this.options.dismissOnWindowClick,c=this.options.ignoreClicksFrom;if(a){var l=function(o){for(var s=!1,r=o.path.length,a=c.length,u=0;u<r;u++)if(!s)for(var h=0;h<a;h++)s||(s=t.hasClass(o.path[u],c[h]));s||(i(e.status.dismiss),n(!0),window.removeEventListener("click",l),this.onWindowClick=null)}.bind(this);this.options.enabled&&(this.onWindowClick=l,window.addEventListener("click",l))}}function g(){if("info"!=this.options.type&&(this.options.revokable=!0),t.isMobile()&&(this.options.animateRevokable=!1),this.options.revokable){var e=a.call(this);this.options.animateRevokable&&e.push("cc-animate"),this.customStyleSelector&&e.push(this.customStyleSelector);var i=this.options.revokeBtn.replace("{{classes}}",e.join(" ")).replace("{{policy}}",this.options.content.policy);this.revokeBtn=u.call(this,i);var n=this.revokeBtn;if(this.options.animateRevokable){var o=t.throttle(function(e){var i=!1,o=20,s=window.innerHeight-20;t.hasClass(n,"cc-top")&&e.clientY<o&&(i=!0),t.hasClass(n,"cc-bottom")&&e.clientY>s&&(i=!0),i?t.hasClass(n,"cc-active")||t.addClass(n,"cc-active"):t.hasClass(n,"cc-active")&&t.removeClass(n,"cc-active")},200);this.onMouseMove=o,window.addEventListener("mousemove",o)}}}var y={enabled:!0,container:null,cookie:{name:"cookieconsent_status",path:"/",domain:"",expiryDays:365,secure:!1},onPopupOpen:function(){},onPopupClose:function(){},onInitialise:function(e){},onStatusChange:function(e,t){},onRevokeChoice:function(){},onNoCookieLaw:function(e,t){},content:{header:"Cookies used on the website!",message:"This website uses cookies to ensure you get the best experience on our website.",dismiss:"Got it!",allow:"Allow cookies",deny:"Decline",link:"Learn more",href:"https://cookiesandyou.com",close:"❌",target:"_blank",policy:"Cookie Policy"},elements:{header:'<span class="cc-header">{{header}}</span> ',message:'<span id="cookieconsent:desc" class="cc-message">{{message}}</span>',messagelink:'<span id="cookieconsent:desc" class="cc-message">{{message}} <a aria-label="learn more about cookies" role=button tabindex="0" class="cc-link" href="{{href}}" rel="noopener noreferrer nofollow" target="{{target}}">{{link}}</a></span>',dismiss:'<a aria-label="dismiss cookie message" role=button tabindex="0" class="cc-btn cc-dismiss">{{dismiss}}</a>',allow:'<a aria-label="allow cookies" role=button tabindex="0" class="cc-btn cc-allow">{{allow}}</a>',deny:'<a aria-label="deny cookies" role=button tabindex="0" class="cc-btn cc-deny">{{deny}}</a>',link:'<a aria-label="learn more about cookies" role=button tabindex="0" class="cc-link" href="{{href}}" rel="noopener noreferrer nofollow" target="{{target}}">{{link}}</a>',close:'<span aria-label="dismiss cookie message" role=button tabindex="0" class="cc-close">{{close}}</span>'},window:'<div role="dialog" aria-live="polite" aria-label="cookieconsent" aria-describedby="cookieconsent:desc" class="cc-window {{classes}}"><!--googleoff: all-->{{children}}<!--googleon: all--></div>',revokeBtn:'<div class="cc-revoke {{classes}}">{{policy}}</div>',compliance:{info:'<div class="cc-compliance">{{dismiss}}</div>',"opt-in":'<div class="cc-compliance cc-highlight">{{deny}}{{allow}}</div>',"opt-out":'<div class="cc-compliance cc-highlight">{{deny}}{{allow}}</div>'},type:"info",layouts:{basic:"{{messagelink}}{{compliance}}","basic-close":"{{messagelink}}{{compliance}}{{close}}","basic-header":"{{header}}{{message}}{{link}}{{compliance}}"},layout:"basic",position:"bottom",theme:"block","static":!1,palette:null,revokable:!1,animateRevokable:!0,showLink:!0,dismissOnScroll:!1,dismissOnTimeout:!1,dismissOnWindowClick:!1,ignoreClicksFrom:["cc-revoke","cc-btn"],autoOpen:!0,autoAttach:!0,whitelistPage:[],blacklistPage:[],overrideHTML:null};return n.prototype.initialise=function(e){this.options&&this.destroy(),t.deepExtend(this.options={},y),t.isPlainObject(e)&&t.deepExtend(this.options,e),r.call(this)&&(this.options.enabled=!1),m(this.options.blacklistPage,location.pathname)&&(this.options.enabled=!1),m(this.options.whitelistPage,location.pathname)&&(this.options.enabled=!0);var i=this.options.window.replace("{{classes}}",c.call(this).join(" ")).replace("{{children}}",l.call(this)),n=this.options.overrideHTML;if("string"==typeof n&&n.length&&(i=n),this.options["static"]){var o=u.call(this,'<div class="cc-grower">'+i+"</div>");o.style.display="",this.element=o.firstChild,this.element.style.display="none",t.addClass(this.element,"cc-invisible")}else this.element=u.call(this,i);b.call(this),g.call(this),this.options.autoOpen&&this.autoOpen()},n.prototype.destroy=function(){this.onButtonClick&&this.element&&(this.element.removeEventListener("click",this.onButtonClick),this.onButtonClick=null),this.dismissTimeout&&(clearTimeout(this.dismissTimeout),this.dismissTimeout=null),this.onWindowScroll&&(window.removeEventListener("scroll",this.onWindowScroll),this.onWindowScroll=null),this.onWindowClick&&(window.removeEventListener("click",this.onWindowClick),this.onWindowClick=null),this.onMouseMove&&(window.removeEventListener("mousemove",this.onMouseMove),this.onMouseMove=null),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.element=null,this.revokeBtn&&this.revokeBtn.parentNode&&this.revokeBtn.parentNode.removeChild(this.revokeBtn),this.revokeBtn=null,f(this.options.palette),this.options=null},n.prototype.open=function(t){if(this.element)return this.isOpen()||(e.hasTransition?this.fadeIn():this.element.style.display="",this.options.revokable&&this.toggleRevokeButton(),this.options.onPopupOpen.call(this)),this},n.prototype.close=function(t){if(this.element)return this.isOpen()&&(e.hasTransition?this.fadeOut():this.element.style.display="none",t&&this.options.revokable&&this.toggleRevokeButton(!0),this.options.onPopupClose.call(this)),this},n.prototype.fadeIn=function(){var i=this.element;if(e.hasTransition&&i&&(this.afterTransition&&s.call(this,i),t.hasClass(i,"cc-invisible"))){if(i.style.display="",this.options["static"]){var n=this.element.clientHeight;this.element.parentNode.style.maxHeight=n+"px"}var r=20;this.openingTimeout=setTimeout(o.bind(this,i),r)}},n.prototype.fadeOut=function(){var i=this.element;e.hasTransition&&i&&(this.openingTimeout&&(clearTimeout(this.openingTimeout),o.bind(this,i)),t.hasClass(i,"cc-invisible")||(this.options["static"]&&(this.element.parentNode.style.maxHeight=""),this.afterTransition=s.bind(this,i),i.addEventListener(e.transitionEnd,this.afterTransition),t.addClass(i,"cc-invisible")))},n.prototype.isOpen=function(){return this.element&&""==this.element.style.display&&(!e.hasTransition||!t.hasClass(this.element,"cc-invisible"))},n.prototype.toggleRevokeButton=function(e){this.revokeBtn&&(this.revokeBtn.style.display=e?"":"none")},n.prototype.revokeChoice=function(e){this.options.enabled=!0,this.clearStatus(),this.options.onRevokeChoice.call(this),e||this.autoOpen()},n.prototype.hasAnswered=function(t){return Object.keys(e.status).indexOf(this.getStatus())>=0},n.prototype.hasConsented=function(t){var i=this.getStatus();return i==e.status.allow||i==e.status.dismiss},n.prototype.autoOpen=function(e){!this.hasAnswered()&&this.options.enabled?this.open():this.hasAnswered()&&this.options.revokable&&this.toggleRevokeButton(!0)},n.prototype.setStatus=function(i){var n=this.options.cookie,o=t.getCookie(n.name),s=Object.keys(e.status).indexOf(o)>=0;Object.keys(e.status).indexOf(i)>=0?(t.setCookie(n.name,i,n.expiryDays,n.domain,n.path,n.secure),this.options.onStatusChange.call(this,i,s)):this.clearStatus()},n.prototype.getStatus=function(){return t.getCookie(this.options.cookie.name)},n.prototype.clearStatus=function(){var e=this.options.cookie;t.setCookie(e.name,"",-1,e.domain,e.path)},n}(),e.Location=function(){function e(e){t.deepExtend(this.options={},s),t.isPlainObject(e)&&t.deepExtend(this.options,e),this.currentServiceIndex=-1}function i(e,t,i){var n,o=document.createElement("script");o.type="text/"+(e.type||"javascript"),o.src=e.src||e,o.async=!1,o.onreadystatechange=o.onload=function(){var e=o.readyState;clearTimeout(n),t.done||e&&!/loaded|complete/.test(e)||(t.done=!0,t(),o.onreadystatechange=o.onload=null)},document.body.appendChild(o),n=setTimeout(function(){t.done=!0,t(),o.onreadystatechange=o.onload=null},i)}function n(e,t,i,n,o){var s=new(window.XMLHttpRequest||window.ActiveXObject)("MSXML2.XMLHTTP.3.0");if(s.open(n?"POST":"GET",e,1),s.setRequestHeader("Content-type","application/x-www-form-urlencoded"),Array.isArray(o))for(var r=0,a=o.length;r<a;++r){var c=o[r].split(":",2);s.setRequestHeader(c[0].replace(/^\s+|\s+$/g,""),c[1].replace(/^\s+|\s+$/g,""))}"function"==typeof t&&(s.onreadystatechange=function(){s.readyState>3&&t(s)}),s.send(n)}function o(e){return new Error("Error ["+(e.code||"UNKNOWN")+"]: "+e.error)}var s={timeout:5e3,services:["ipinfo"],serviceDefinitions:{ipinfo:function(){return{url:"//ipinfo.io",headers:["Accept: application/json"],callback:function(e,t){try{var i=JSON.parse(t);return i.error?o(i):{code:i.country}}catch(n){return o({error:"Invalid response ("+n+")"})}}}},ipinfodb:function(e){return{url:"//api.ipinfodb.com/v3/ip-country/?key={api_key}&format=json&callback={callback}",isScript:!0,callback:function(e,t){try{var i=JSON.parse(t);return"ERROR"==i.statusCode?o({error:i.statusMessage}):{code:i.countryCode}}catch(n){return o({error:"Invalid response ("+n+")"})}}}},maxmind:function(){return{url:"//js.maxmind.com/js/apis/geoip2/v2.1/geoip2.js",isScript:!0,callback:function(e){return window.geoip2?void geoip2.country(function(t){try{e({code:t.country.iso_code})}catch(i){e(o(i))}},function(t){e(o(t))}):void e(new Error("Unexpected response format. The downloaded script should have exported `geoip2` to the global scope"))}}}}};return e.prototype.getNextService=function(){var e;do e=this.getServiceByIdx(++this.currentServiceIndex);while(this.currentServiceIndex<this.options.services.length&&!e);return e},e.prototype.getServiceByIdx=function(e){var i=this.options.services[e];if("function"==typeof i){var n=i();return n.name&&t.deepExtend(n,this.options.serviceDefinitions[n.name](n)),n}return"string"==typeof i?this.options.serviceDefinitions[i]():t.isPlainObject(i)?this.options.serviceDefinitions[i.name](i):null},e.prototype.locate=function(e,t){var i=this.getNextService();return i?(this.callbackComplete=e,this.callbackError=t,void this.runService(i,this.runNextServiceOnError.bind(this))):void t(new Error("No services to run"))},e.prototype.setupUrl=function(e){var t=this.getCurrentServiceOpts();return e.url.replace(/\{(.*?)\}/g,function(i,n){if("callback"===n){var o="callback"+Date.now();return window[o]=function(t){e.__JSONP_DATA=JSON.stringify(t)},o}if(n in t.interpolateUrl)return t.interpolateUrl[n]})},e.prototype.runService=function(e,t){var o=this;if(e&&e.url&&e.callback){var s=e.isScript?i:n,r=this.setupUrl(e);s(r,function(i){var n=i?i.responseText:"";e.__JSONP_DATA&&(n=e.__JSONP_DATA,delete e.__JSONP_DATA),o.runServiceCallback.call(o,t,e,n)},this.options.timeout,e.data,e.headers)}},e.prototype.runServiceCallback=function(e,t,i){var n=this,o=function(t){s||n.onServiceResult.call(n,e,t)},s=t.callback(o,i);s&&this.onServiceResult.call(this,e,s)},e.prototype.onServiceResult=function(e,t){t instanceof Error||t&&t.error?e.call(this,t,null):e.call(this,null,t)},e.prototype.runNextServiceOnError=function(e,t){if(e){this.logError(e);var i=this.getNextService();i?this.runService(i,this.runNextServiceOnError.bind(this)):this.completeService.call(this,this.callbackError,new Error("All services failed"))}else this.completeService.call(this,this.callbackComplete,t)},e.prototype.getCurrentServiceOpts=function(){var e=this.options.services[this.currentServiceIndex];return"string"==typeof e?{name:e}:"function"==typeof e?e():t.isPlainObject(e)?e:{}},e.prototype.completeService=function(e,t){this.currentServiceIndex=-1,e&&e(t)},e.prototype.logError=function(e){var t=this.currentServiceIndex,i=this.getServiceByIdx(t);console.warn("The service["+t+"] ("+i.url+") responded with the following error",e)},e}(),e.Law=function(){function e(e){this.initialise.apply(this,arguments)}var i={regionalLaw:!0,hasLaw:["AT","BE","BG","HR","CZ","CY","DK","EE","FI","FR","DE","EL","HU","IE","IT","LV","LT","LU","MT","NL","PL","PT","SK","ES","SE","GB","UK","GR","EU"],revokable:["HR","CY","DK","EE","FR","DE","LV","LT","NL","PT","ES"],explicitAction:["HR","IT","ES"]};return e.prototype.initialise=function(e){t.deepExtend(this.options={},i),t.isPlainObject(e)&&t.deepExtend(this.options,e)},e.prototype.get=function(e){var t=this.options;return{hasLaw:t.hasLaw.indexOf(e)>=0,revokable:t.revokable.indexOf(e)>=0,explicitAction:t.explicitAction.indexOf(e)>=0}},e.prototype.applyLaw=function(e,t){var i=this.get(t);return i.hasLaw||(e.enabled=!1,"function"==typeof e.onNoCookieLaw&&e.onNoCookieLaw(t,i)),this.options.regionalLaw&&(i.revokable&&(e.revokable=!0),i.explicitAction&&(e.dismissOnScroll=!1,e.dismissOnTimeout=!1)),e},e}(),e.initialise=function(i,n,o){var s=new e.Law(i.law);n||(n=function(){}),o||(o=function(){});var r=Object.keys(e.status),a=t.getCookie("cookieconsent_status"),c=r.indexOf(a)>=0;return c?void n(new e.Popup(i)):void e.getCountryCode(i,function(t){delete i.law,delete i.location,t.code&&(i=s.applyLaw(i,t.code)),n(new e.Popup(i))},function(t){delete i.law,delete i.location,o(t,new e.Popup(i))})},e.getCountryCode=function(t,i,n){if(t.law&&t.law.countryCode)return void i({code:t.law.countryCode});if(t.location){var o=new e.Location(t.location);return void o.locate(function(e){i(e||{})},n)}i({})},e.utils=t,e.hasInitialised=!0,window.cookieconsent=e}}(window.cookieconsent||{}); function jsBundleVersion() { - return "6b3b1791facc58d99b1e9c143e69bd45"; + return "2fb8693374ebdea0ffcbb3b8c1d39910"; } diff --git a/groups.io/tinymce-4.7.13/tinymce.min.js b/groups.io/tinymce-4.7.13/tinymce.min.js deleted file mode 100644 index 00895af8..00000000 --- a/groups.io/tinymce-4.7.13/tinymce.min.js +++ /dev/null @@ -1,2 +0,0 @@ -// 4.7.13 (2018-05-16) -!function(){"use strict";var e,t,n,r,o,i,a,u,s,c,l,f,d,m,p,g,h,v=function(e){return function(){return e}},y=v(!1),b=v(!0),V={noop:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t]},noarg:function(n){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return n()}},compose:function(n,r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return n(r.apply(null,arguments))}},constant:v,identity:function(e){return e},tripleEquals:function(e,t){return e===t},curry:function(i){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];for(var a=new Array(arguments.length-1),n=1;n<arguments.length;n++)a[n-1]=arguments[n];return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=new Array(arguments.length),r=0;r<n.length;r++)n[r]=arguments[r];var o=a.concat(n);return i.apply(null,o)}},not:function(n){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return!n.apply(null,arguments)}},die:function(e){return function(){throw new Error(e)}},apply:function(e){return e()},call:function(e){e()},never:y,always:b},C=V.never,x=V.always,w=function(){return N},N=(r={fold:function(e,t){return e()},is:C,isSome:C,isNone:x,getOr:n=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},or:n,orThunk:t,map:w,ap:w,each:function(){},bind:w,flatten:w,exists:C,forall:x,filter:w,equals:e=function(e){return e.isNone()},equals_:e,toArray:function(){return[]},toString:V.constant("none()")},Object.freeze&&Object.freeze(r),r),E=function(n){var e=function(){return n},t=function(){return o},r=function(e){return e(n)},o={fold:function(e,t){return t(n)},is:function(e){return n===e},isSome:x,isNone:C,getOr:e,getOrThunk:e,getOrDie:e,or:t,orThunk:t,map:function(e){return E(e(n))},ap:function(e){return e.fold(w,function(e){return E(e(n))})},each:function(e){e(n)},bind:r,flatten:e,exists:r,forall:r,filter:function(e){return e(n)?o:N},equals:function(e){return e.is(n)},equals_:function(e,t){return e.fold(C,function(e){return t(n,e)})},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},A={some:E,none:w,from:function(e){return null===e||e===undefined?N:E(e)}},S=function(t){return function(e){return function(e){if(null===e)return"null";var t=typeof e;return"object"===t&&Array.prototype.isPrototypeOf(e)?"array":"object"===t&&String.prototype.isPrototypeOf(e)?"string":t}(e)===t}},k={isString:S("string"),isObject:S("object"),isArray:S("array"),isNull:S("null"),isBoolean:S("boolean"),isUndefined:S("undefined"),isFunction:S("function"),isNumber:S("number")},T=(o=Array.prototype.indexOf)===undefined?function(e,t){return L(e,t)}:function(e,t){return o.call(e,t)},R=function(e,t){return-1<T(e,t)},_=function(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++){var i=e[o];r[o]=t(i,o,e)}return r},B=function(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n,e)},D=function(e,t){for(var n=e.length-1;0<=n;n--)t(e[n],n,e)},O=function(e,t){for(var n=[],r=0,o=e.length;r<o;r++){var i=e[r];t(i,r,e)&&n.push(i)}return n},P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(t(e[n],n,e))return A.some(n);return A.none()},L=function(e,t){for(var n=0,r=e.length;n<r;++n)if(e[n]===t)return n;return-1},I=Array.prototype.push,M=function(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!Array.prototype.isPrototypeOf(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);I.apply(t,e[n])}return t},F=function(e,t){for(var n=0,r=e.length;n<r;++n)if(!0!==t(e[n],n,e))return!1;return!0},z=Array.prototype.slice,U=k.isFunction(Array.from)?Array.from:function(e){return z.call(e)},H={map:_,each:B,eachr:D,partition:function(e,t){for(var n=[],r=[],o=0,i=e.length;o<i;o++){var a=e[o];(t(a,o,e)?n:r).push(a)}return{pass:n,fail:r}},filter:O,groupBy:function(e,t){if(0===e.length)return[];for(var n=t(e[0]),r=[],o=[],i=0,a=e.length;i<a;i++){var u=e[i],s=t(u);s!==n&&(r.push(o),o=[]),n=s,o.push(u)}return 0!==o.length&&r.push(o),r},indexOf:function(e,t){var n=T(e,t);return-1===n?A.none():A.some(n)},foldr:function(e,t,n){return D(e,function(e){n=t(n,e)}),n},foldl:function(e,t,n){return B(e,function(e){n=t(n,e)}),n},find:function(e,t){for(var n=0,r=e.length;n<r;n++){var o=e[n];if(t(o,n,e))return A.some(o)}return A.none()},findIndex:P,flatten:M,bind:function(e,t){var n=_(e,t);return M(n)},forall:F,exists:function(e,t){return P(e,t).isSome()},contains:R,equal:function(e,n){return e.length===n.length&&F(e,function(e,t){return e===n[t]})},reverse:function(e){var t=z.call(e,0);return t.reverse(),t},chunk:function(e,t){for(var n=[],r=0;r<e.length;r+=t){var o=e.slice(r,r+t);n.push(o)}return n},difference:function(e,t){return O(e,function(e){return!R(t,e)})},mapToObject:function(e,t){for(var n={},r=0,o=e.length;r<o;r++){var i=e[r];n[String(i)]=t(i,r)}return n},pure:function(e){return[e]},sort:function(e,t){var n=z.call(e,0);return n.sort(t),n},range:function(e,t){for(var n=[],r=0;r<e;r++)n.push(t(r));return n},head:function(e){return 0===e.length?A.none():A.some(e[0])},last:function(e){return 0===e.length?A.none():A.some(e[e.length-1])},from:U},q="undefined"!=typeof window?window:Function("return this;")(),j=function(e,t){for(var n=t!==undefined&&null!==t?t:q,r=0;r<e.length&&n!==undefined&&null!==n;++r)n=n[e[r]];return n},$=function(e,t){var n=e.split(".");return j(n,t)},W={getOrDie:function(e,t){var n=$(e,t);if(n===undefined||null===n)throw e+" not available on this browser";return n}},K=function(){return W.getOrDie("URL")},X={createObjectURL:function(e){return K().createObjectURL(e)},revokeObjectURL:function(e){K().revokeObjectURL(e)}},Y=navigator,G=Y.userAgent,J=function(e){return"matchMedia"in window&&matchMedia(e).matches};d=/Android/.test(G),a=(a=!(i=/WebKit/.test(G))&&/MSIE/gi.test(G)&&/Explorer/gi.test(Y.appName))&&/MSIE (\w+)\./.exec(G)[1],u=-1!==G.indexOf("Trident/")&&(-1!==G.indexOf("rv:")||-1!==Y.appName.indexOf("Netscape"))&&11,s=-1!==G.indexOf("Edge/")&&!a&&!u&&12,a=a||u||s,c=!i&&!u&&/Gecko/.test(G),l=-1!==G.indexOf("Mac"),f=/(iPad|iPhone)/.test(G),m="FormData"in window&&"FileReader"in window&&"URL"in window&&!!X.createObjectURL,p=J("only screen and (max-device-width: 480px)")&&(d||f),g=J("only screen and (min-width: 800px)")&&(d||f),h=-1!==G.indexOf("Windows Phone"),s&&(i=!1);var Q,Z,ee,te,ne,re,oe,ie,ae,ue,se,ce,le,fe,de,me,pe,ge,he,ve={opera:!1,webkit:i,ie:a,gecko:c,mac:l,iOS:f,android:d,contentEditable:!f||m||534<=parseInt(G.match(/AppleWebKit\/(\d*)/)[1],10),transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:8!==a,range:window.getSelection&&"Range"in window,documentMode:a&&!s?document.documentMode||7:10,fileApi:m,ceFalse:!1===a||8<a,cacheSuffix:null,container:null,overrideViewPort:null,experimentalShadowDom:!1,canHaveCSP:!1===a||11<a,desktop:!p&&!g,windowsPhone:h},ye=window.Promise?window.Promise:function(){function r(e,t){return function(){e.apply(t,arguments)}}var e=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=function(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],l(e,r(o,this),r(u,this))},t=i.immediateFn||"function"==typeof setImmediate&&setImmediate||function(e){setTimeout(e,1)};function a(r){var o=this;null!==this._state?t(function(){var e=o._state?r.onFulfilled:r.onRejected;if(null!==e){var t;try{t=e(o._value)}catch(n){return void r.reject(n)}r.resolve(t)}else(o._state?r.resolve:r.reject)(o._value)}):this._deferreds.push(r)}function o(e){try{if(e===this)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var t=e.then;if("function"==typeof t)return void l(r(t,e),r(o,this),r(u,this))}this._state=!0,this._value=e,s.call(this)}catch(n){u.call(this,n)}}function u(e){this._state=!1,this._value=e,s.call(this)}function s(){for(var e=0,t=this._deferreds.length;e<t;e++)a.call(this,this._deferreds[e]);this._deferreds=null}function c(e,t,n,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r}function l(e,t,n){var r=!1;try{e(function(e){r||(r=!0,t(e))},function(e){r||(r=!0,n(e))})}catch(o){if(r)return;r=!0,n(o)}}return i.prototype["catch"]=function(e){return this.then(null,e)},i.prototype.then=function(n,r){var o=this;return new i(function(e,t){a.call(o,new c(n,r,e,t))})},i.all=function(){var s=Array.prototype.slice.call(1===arguments.length&&e(arguments[0])?arguments[0]:arguments);return new i(function(o,i){if(0===s.length)return o([]);var a=s.length;function u(t,e){try{if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if("function"==typeof n)return void n.call(e,function(e){u(t,e)},i)}s[t]=e,0==--a&&o(s)}catch(r){i(r)}}for(var e=0;e<s.length;e++)u(e,s[e])})},i.resolve=function(t){return t&&"object"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(n){return new i(function(e,t){t(n)})},i.race=function(o){return new i(function(e,t){for(var n=0,r=o.length;n<r;n++)o[n].then(e,t)})},i}(),be=function(e,t){return"number"!=typeof t&&(t=0),setTimeout(e,t)},Ce=function(e,t){return"number"!=typeof t&&(t=1),setInterval(e,t)},xe=function(t,n){var r,e;return(e=function(){var e=arguments;clearTimeout(r),r=be(function(){t.apply(this,e)},n)}).stop=function(){clearTimeout(r)},e},we={requestAnimationFrame:function(e,t){Q?Q.then(e):Q=new ye(function(e){t||(t=document.body),function(e,t){var n,r=window.requestAnimationFrame,o=["ms","moz","webkit"];for(n=0;n<o.length&&!r;n++)r=window[o[n]+"RequestAnimationFrame"];r||(r=function(e){window.setTimeout(e,0)}),r(e,t)}(e,t)}).then(e)},setTimeout:be,setInterval:Ce,setEditorTimeout:function(e,t,n){return be(function(){e.removed||t()},n)},setEditorInterval:function(e,t,n){var r;return r=Ce(function(){e.removed?clearInterval(r):t()},n)},debounce:xe,throttle:xe,clearInterval:function(e){return clearInterval(e)},clearTimeout:function(e){return clearTimeout(e)}},Ne=/^(?:mouse|contextmenu)|click/,Ee={keyLocation:1,layerX:1,layerY:1,returnValue:1,webkitMovementX:1,webkitMovementY:1,keyIdentifier:1},Se=function(){return!1},ke=function(){return!0},Te=function(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r||!1):e.attachEvent&&e.attachEvent("on"+t,n)},Ae=function(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r||!1):e.detachEvent&&e.detachEvent("on"+t,n)},Re=function(e,t){var n,r,o,i,a,u,s=t||{};for(n in e)Ee[n]||(s[n]=e[n]);if(s.target||(s.target=s.srcElement||document),ve.experimentalShadowDom&&(s.target=(r=e,o=s.target,a=o,(i=r.path)&&0<i.length&&(a=i[0]),r.composedPath&&(i=r.composedPath())&&0<i.length&&(a=i[0]),a)),e&&Ne.test(e.type)&&e.pageX===undefined&&e.clientX!==undefined){var c=s.target.ownerDocument||document,l=c.documentElement,f=c.body;s.pageX=e.clientX+(l&&l.scrollLeft||f&&f.scrollLeft||0)-(l&&l.clientLeft||f&&f.clientLeft||0),s.pageY=e.clientY+(l&&l.scrollTop||f&&f.scrollTop||0)-(l&&l.clientTop||f&&f.clientTop||0)}return s.preventDefault=function(){s.isDefaultPrevented=ke,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},s.stopPropagation=function(){s.isPropagationStopped=ke,e&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)},!(s.stopImmediatePropagation=function(){s.isImmediatePropagationStopped=ke,s.stopPropagation()})==((u=s).isDefaultPrevented===ke||u.isDefaultPrevented===Se)&&(s.isDefaultPrevented=Se,s.isPropagationStopped=Se,s.isImmediatePropagationStopped=Se),"undefined"==typeof s.metaKey&&(s.metaKey=!1),s},_e=function(e,t,n){var r=e.document,o={type:"ready"};if(n.domLoaded)t(o);else{var i=function(){return"complete"===r.readyState||"interactive"===r.readyState&&r.body},a=function(){n.domLoaded||(n.domLoaded=!0,t(o))},u=function(){i()&&(Ae(r,"readystatechange",u),a())},s=function(){try{r.documentElement.doScroll("left")}catch(e){return void we.setTimeout(s)}a()};!r.addEventListener||ve.ie&&ve.ie<11?(Te(r,"readystatechange",u),r.documentElement.doScroll&&e.self===e.top&&s()):i()?a():Te(e,"DOMContentLoaded",a),Te(e,"load",a)}},Be=function(){var m,p,g,h,v,y=this,b={};p="mce-data-"+(+new Date).toString(32),h="onmouseenter"in document.documentElement,g="onfocusin"in document.documentElement,v={mouseenter:"mouseover",mouseleave:"mouseout"},m=1,y.domLoaded=!1,y.events=b;var C=function(e,t){var n,r,o,i,a=b[t];if(n=a&&a[e.type])for(r=0,o=n.length;r<o;r++)if((i=n[r])&&!1===i.func.call(i.scope,e)&&e.preventDefault(),e.isImmediatePropagationStopped())return};y.bind=function(e,t,n,r){var o,i,a,u,s,c,l,f=window,d=function(e){C(Re(e||f.event),o)};if(e&&3!==e.nodeType&&8!==e.nodeType){for(e[p]?o=e[p]:(o=m++,e[p]=o,b[o]={}),r=r||e,a=(t=t.split(" ")).length;a--;)c=d,s=l=!1,"DOMContentLoaded"===(u=t[a])&&(u="ready"),y.domLoaded&&"ready"===u&&"complete"===e.readyState?n.call(r,Re({type:u})):(h||(s=v[u])&&(c=function(e){var t,n;if(t=e.currentTarget,(n=e.relatedTarget)&&t.contains)n=t.contains(n);else for(;n&&n!==t;)n=n.parentNode;n||((e=Re(e||f.event)).type="mouseout"===e.type?"mouseleave":"mouseenter",e.target=t,C(e,o))}),g||"focusin"!==u&&"focusout"!==u||(l=!0,s="focusin"===u?"focus":"blur",c=function(e){(e=Re(e||f.event)).type="focus"===e.type?"focusin":"focusout",C(e,o)}),(i=b[o][u])?"ready"===u&&y.domLoaded?n({type:u}):i.push({func:n,scope:r}):(b[o][u]=i=[{func:n,scope:r}],i.fakeName=s,i.capture=l,i.nativeHandler=c,"ready"===u?_e(e,c,y):Te(e,s||u,c,l)));return e=i=0,n}},y.unbind=function(e,t,n){var r,o,i,a,u,s;if(!e||3===e.nodeType||8===e.nodeType)return y;if(r=e[p]){if(s=b[r],t){for(i=(t=t.split(" ")).length;i--;)if(o=s[u=t[i]]){if(n)for(a=o.length;a--;)if(o[a].func===n){var c=o.nativeHandler,l=o.fakeName,f=o.capture;(o=o.slice(0,a).concat(o.slice(a+1))).nativeHandler=c,o.fakeName=l,o.capture=f,s[u]=o}n&&0!==o.length||(delete s[u],Ae(e,o.fakeName||u,o.nativeHandler,o.capture))}}else{for(u in s)o=s[u],Ae(e,o.fakeName||u,o.nativeHandler,o.capture);s={}}for(u in s)return y;delete b[r];try{delete e[p]}catch(d){e[p]=null}}return y},y.fire=function(e,t,n){var r;if(!e||3===e.nodeType||8===e.nodeType)return y;for((n=Re(null,n)).type=t,n.target=e;(r=e[p])&&C(n,r),(e=e.parentNode||e.ownerDocument||e.defaultView||e.parentWindow)&&!n.isPropagationStopped(););return y},y.clean=function(e){var t,n,r=y.unbind;if(!e||3===e.nodeType||8===e.nodeType)return y;if(e[p]&&r(e),e.getElementsByTagName||(e=e.document),e&&e.getElementsByTagName)for(r(e),t=(n=e.getElementsByTagName("*")).length;t--;)(e=n[t])[p]&&r(e);return y},y.destroy=function(){b={}},y.cancel=function(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1}};Be.Event=new Be,Be.Event.bind(window,"ready",function(){});var De="sizzle"+-new Date,Oe=window.document,Pe=0,Le=0,Ie=pt(),Me=pt(),Fe=pt(),ze=function(e,t){return e===t&&(ce=!0),0},Ue=typeof undefined,qe={}.hasOwnProperty,Ve=[],He=Ve.pop,je=Ve.push,$e=Ve.push,We=Ve.slice,Ke=Ve.indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(this[t]===e)return t;return-1},Xe="[\\x20\\t\\r\\n\\f]",Ye="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",Ge="\\["+Xe+"*("+Ye+")(?:"+Xe+"*([*^$|!~]?=)"+Xe+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+Ye+"))|)"+Xe+"*\\]",Je=":("+Ye+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+Ge+")*)|.*)\\)|)",Qe=new RegExp("^"+Xe+"+|((?:^|[^\\\\])(?:\\\\.)*)"+Xe+"+$","g"),Ze=new RegExp("^"+Xe+"*,"+Xe+"*"),et=new RegExp("^"+Xe+"*([>+~]|"+Xe+")"+Xe+"*"),tt=new RegExp("="+Xe+"*([^\\]'\"]*?)"+Xe+"*\\]","g"),nt=new RegExp(Je),rt=new RegExp("^"+Ye+"$"),ot={ID:new RegExp("^#("+Ye+")"),CLASS:new RegExp("^\\.("+Ye+")"),TAG:new RegExp("^("+Ye+"|[*])"),ATTR:new RegExp("^"+Ge),PSEUDO:new RegExp("^"+Je),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+Xe+"*(even|odd|(([+-]|)(\\d*)n|)"+Xe+"*(?:([+-]|)"+Xe+"*(\\d+)|))"+Xe+"*\\)|)","i"),bool:new RegExp("^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$","i"),needsContext:new RegExp("^"+Xe+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+Xe+"*((?:-\\d)?\\d*)"+Xe+"*\\)|)(?=[^-]|$)","i")},it=/^(?:input|select|textarea|button)$/i,at=/^h\d$/i,ut=/^[^{]+\{\s*\[native \w/,st=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ct=/[+~]/,lt=/'|\\/g,ft=new RegExp("\\\\([\\da-f]{1,6}"+Xe+"?|("+Xe+")|.)","ig"),dt=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{$e.apply(Ve=We.call(Oe.childNodes),Oe.childNodes),Ve[Oe.childNodes.length].nodeType}catch(Dw){$e={apply:Ve.length?function(e,t){je.apply(e,We.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}var mt=function(e,t,n,r){var o,i,a,u,s,c,l,f,d,m;if((t?t.ownerDocument||t:Oe)!==fe&&le(t),n=n||[],!e||"string"!=typeof e)return n;if(1!==(u=(t=t||fe).nodeType)&&9!==u)return[];if(me&&!r){if(o=st.exec(e))if(a=o[1]){if(9===u){if(!(i=t.getElementById(a))||!i.parentNode)return n;if(i.id===a)return n.push(i),n}else if(t.ownerDocument&&(i=t.ownerDocument.getElementById(a))&&he(t,i)&&i.id===a)return n.push(i),n}else{if(o[2])return $e.apply(n,t.getElementsByTagName(e)),n;if((a=o[3])&&ee.getElementsByClassName)return $e.apply(n,t.getElementsByClassName(a)),n}if(ee.qsa&&(!pe||!pe.test(e))){if(f=l=De,d=t,m=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){for(c=oe(e),(l=t.getAttribute("id"))?f=l.replace(lt,"\\$&"):t.setAttribute("id",f),f="[id='"+f+"'] ",s=c.length;s--;)c[s]=f+wt(c[s]);d=ct.test(e)&&Ct(t.parentNode)||t,m=c.join(",")}if(m)try{return $e.apply(n,d.querySelectorAll(m)),n}catch(p){}finally{l||t.removeAttribute("id")}}}return ae(e.replace(Qe,"$1"),t,n,r)};function pt(){var r=[];return function e(t,n){return r.push(t+" ")>te.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function gt(e){return e[De]=!0,e}function ht(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function vt(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function yt(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function bt(a){return gt(function(i){return i=+i,gt(function(e,t){for(var n,r=a([],e.length,i),o=r.length;o--;)e[n=r[o]]&&(e[n]=!(t[n]=e[n]))})})}function Ct(e){return e&&typeof e.getElementsByTagName!==Ue&&e}for(Z in ee=mt.support={},re=mt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},le=mt.setDocument=function(e){var t,s=e?e.ownerDocument||e:Oe,n=s.defaultView;return s!==fe&&9===s.nodeType&&s.documentElement?(de=(fe=s).documentElement,me=!re(s),n&&n!==function(e){try{return e.top}catch(t){}return null}(n)&&(n.addEventListener?n.addEventListener("unload",function(){le()},!1):n.attachEvent&&n.attachEvent("onunload",function(){le()})),ee.attributes=!0,ee.getElementsByTagName=!0,ee.getElementsByClassName=ut.test(s.getElementsByClassName),ee.getById=!0,te.find.ID=function(e,t){if(typeof t.getElementById!==Ue&&me){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},te.filter.ID=function(e){var t=e.replace(ft,dt);return function(e){return e.getAttribute("id")===t}},te.find.TAG=ee.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!==Ue)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"===e){for(;n=i[o++];)1===n.nodeType&&r.push(n);return r}return i},te.find.CLASS=ee.getElementsByClassName&&function(e,t){if(me)return t.getElementsByClassName(e)},ge=[],pe=[],ee.disconnectedMatch=!0,pe=pe.length&&new RegExp(pe.join("|")),ge=ge.length&&new RegExp(ge.join("|")),t=ut.test(de.compareDocumentPosition),he=t||ut.test(de.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},ze=t?function(e,t){if(e===t)return ce=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!ee.sortDetached&&t.compareDocumentPosition(e)===n?e===s||e.ownerDocument===Oe&&he(Oe,e)?-1:t===s||t.ownerDocument===Oe&&he(Oe,t)?1:se?Ke.call(se,e)-Ke.call(se,t):0:4&n?-1:1)}:function(e,t){if(e===t)return ce=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===s?-1:t===s?1:o?-1:i?1:se?Ke.call(se,e)-Ke.call(se,t):0;if(o===i)return ht(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?ht(a[r],u[r]):a[r]===Oe?-1:u[r]===Oe?1:0},s):fe},mt.matches=function(e,t){return mt(e,null,null,t)},mt.matchesSelector=function(e,t){if((e.ownerDocument||e)!==fe&&le(e),t=t.replace(tt,"='$1']"),ee.matchesSelector&&me&&(!ge||!ge.test(t))&&(!pe||!pe.test(t)))try{var n=(void 0).call(e,t);if(n||ee.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(Dw){}return 0<mt(t,fe,null,[e]).length},mt.contains=function(e,t){return(e.ownerDocument||e)!==fe&&le(e),he(e,t)},mt.attr=function(e,t){(e.ownerDocument||e)!==fe&&le(e);var n=te.attrHandle[t.toLowerCase()],r=n&&qe.call(te.attrHandle,t.toLowerCase())?n(e,t,!me):undefined;return r!==undefined?r:ee.attributes||!me?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},mt.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},mt.uniqueSort=function(e){var t,n=[],r=0,o=0;if(ce=!ee.detectDuplicates,se=!ee.sortStable&&e.slice(0),e.sort(ze),ce){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return se=null,e},ne=mt.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=ne(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=ne(t);return n},(te=mt.selectors={cacheLength:50,createPseudo:gt,match:ot,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(ft,dt),e[3]=(e[3]||e[4]||e[5]||"").replace(ft,dt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||mt.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&mt.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return ot.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&nt.test(n)&&(t=oe(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(ft,dt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=Ie[e+" "];return t||(t=new RegExp("(^|"+Xe+")"+e+"("+Xe+"|$)"))&&Ie(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==Ue&&e.getAttribute("class")||"")})},ATTR:function(n,r,o){return function(e){var t=mt.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===o:"!="===r?t!==o:"^="===r?o&&0===t.indexOf(o):"*="===r?o&&-1<t.indexOf(o):"$="===r?o&&t.slice(-o.length)===o:"~="===r?-1<(" "+t+" ").indexOf(o):"|="===r&&(t===o||t.slice(0,o.length+1)===o+"-"))}},CHILD:function(m,e,t,p,g){var h="nth"!==m.slice(0,3),v="last"!==m.slice(-4),y="of-type"===e;return 1===p&&0===g?function(e){return!!e.parentNode}:function(e,t,n){var r,o,i,a,u,s,c=h!==v?"nextSibling":"previousSibling",l=e.parentNode,f=y&&e.nodeName.toLowerCase(),d=!n&&!y;if(l){if(h){for(;c;){for(i=e;i=i[c];)if(y?i.nodeName.toLowerCase()===f:1===i.nodeType)return!1;s=c="only"===m&&!s&&"nextSibling"}return!0}if(s=[v?l.firstChild:l.lastChild],v&&d){for(u=(r=(o=l[De]||(l[De]={}))[m]||[])[0]===Pe&&r[1],a=r[0]===Pe&&r[2],i=u&&l.childNodes[u];i=++u&&i&&i[c]||(a=u=0)||s.pop();)if(1===i.nodeType&&++a&&i===e){o[m]=[Pe,u,a];break}}else if(d&&(r=(e[De]||(e[De]={}))[m])&&r[0]===Pe)a=r[1];else for(;(i=++u&&i&&i[c]||(a=u=0)||s.pop())&&((y?i.nodeName.toLowerCase()!==f:1!==i.nodeType)||!++a||(d&&((i[De]||(i[De]={}))[m]=[Pe,a]),i!==e)););return(a-=g)===p||a%p==0&&0<=a/p}}},PSEUDO:function(e,i){var t,a=te.pseudos[e]||te.setFilters[e.toLowerCase()]||mt.error("unsupported pseudo: "+e);return a[De]?a(i):1<a.length?(t=[e,e,"",i],te.setFilters.hasOwnProperty(e.toLowerCase())?gt(function(e,t){for(var n,r=a(e,i),o=r.length;o--;)e[n=Ke.call(e,r[o])]=!(t[n]=r[o])}):function(e){return a(e,0,t)}):a}},pseudos:{not:gt(function(e){var r=[],o=[],u=ie(e.replace(Qe,"$1"));return u[De]?gt(function(e,t,n,r){for(var o,i=u(e,null,r,[]),a=e.length;a--;)(o=i[a])&&(e[a]=!(t[a]=o))}):function(e,t,n){return r[0]=e,u(r,null,n,o),!o.pop()}}),has:gt(function(t){return function(e){return 0<mt(t,e).length}}),contains:gt(function(t){return t=t.replace(ft,dt),function(e){return-1<(e.textContent||e.innerText||ne(e)).indexOf(t)}}),lang:gt(function(n){return rt.test(n||"")||mt.error("unsupported lang: "+n),n=n.replace(ft,dt).toLowerCase(),function(e){var t;do{if(t=me?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=window.location&&window.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===de},focus:function(e){return e===fe.activeElement&&(!fe.hasFocus||fe.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!te.pseudos.empty(e)},header:function(e){return at.test(e.nodeName)},input:function(e){return it.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:bt(function(){return[0]}),last:bt(function(e,t){return[t-1]}),eq:bt(function(e,t,n){return[n<0?n+t:n]}),even:bt(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:bt(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:bt(function(e,t,n){for(var r=n<0?n+t:n;0<=--r;)e.push(r);return e}),gt:bt(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=te.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})te.pseudos[Z]=vt(Z);for(Z in{submit:!0,reset:!0})te.pseudos[Z]=yt(Z);function xt(){}function wt(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function Nt(a,e,t){var u=e.dir,s=t&&"parentNode"===u,c=Le++;return e.first?function(e,t,n){for(;e=e[u];)if(1===e.nodeType||s)return a(e,t,n)}:function(e,t,n){var r,o,i=[Pe,c];if(n){for(;e=e[u];)if((1===e.nodeType||s)&&a(e,t,n))return!0}else for(;e=e[u];)if(1===e.nodeType||s){if((r=(o=e[De]||(e[De]={}))[u])&&r[0]===Pe&&r[1]===c)return i[2]=r[2];if((o[u]=i)[2]=a(e,t,n))return!0}}}function Et(o){return 1<o.length?function(e,t,n){for(var r=o.length;r--;)if(!o[r](e,t,n))return!1;return!0}:o[0]}function St(e,t,n,r,o){for(var i,a=[],u=0,s=e.length,c=null!=t;u<s;u++)(i=e[u])&&(n&&!n(i,r,o)||(a.push(i),c&&t.push(u)));return a}function kt(m,p,g,h,v,e){return h&&!h[De]&&(h=kt(h)),v&&!v[De]&&(v=kt(v,e)),gt(function(e,t,n,r){var o,i,a,u=[],s=[],c=t.length,l=e||function(e,t,n){for(var r=0,o=t.length;r<o;r++)mt(e,t[r],n);return n}(p||"*",n.nodeType?[n]:n,[]),f=!m||!e&&p?l:St(l,u,m,n,r),d=g?v||(e?m:c||h)?[]:t:f;if(g&&g(f,d,n,r),h)for(o=St(d,s),h(o,[],n,r),i=o.length;i--;)(a=o[i])&&(d[s[i]]=!(f[s[i]]=a));if(e){if(v||m){if(v){for(o=[],i=d.length;i--;)(a=d[i])&&o.push(f[i]=a);v(null,d=[],o,r)}for(i=d.length;i--;)(a=d[i])&&-1<(o=v?Ke.call(e,a):u[i])&&(e[o]=!(t[o]=a))}}else d=St(d===t?d.splice(c,d.length):d),v?v(null,t,d,r):$e.apply(t,d)})}function Tt(e){for(var r,t,n,o=e.length,i=te.relative[e[0].type],a=i||te.relative[" "],u=i?1:0,s=Nt(function(e){return e===r},a,!0),c=Nt(function(e){return-1<Ke.call(r,e)},a,!0),l=[function(e,t,n){return!i&&(n||t!==ue)||((r=t).nodeType?s(e,t,n):c(e,t,n))}];u<o;u++)if(t=te.relative[e[u].type])l=[Nt(Et(l),t)];else{if((t=te.filter[e[u].type].apply(null,e[u].matches))[De]){for(n=++u;n<o&&!te.relative[e[n].type];n++);return kt(1<u&&Et(l),1<u&&wt(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(Qe,"$1"),t,u<n&&Tt(e.slice(u,n)),n<o&&Tt(e=e.slice(n)),n<o&&wt(e))}l.push(t)}return Et(l)}xt.prototype=te.filters=te.pseudos,te.setFilters=new xt,oe=mt.tokenize=function(e,t){var n,r,o,i,a,u,s,c=Me[e+" "];if(c)return t?0:c.slice(0);for(a=e,u=[],s=te.preFilter;a;){for(i in n&&!(r=Ze.exec(a))||(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=et.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(Qe," ")}),a=a.slice(n.length)),te.filter)!(r=ot[i].exec(a))||s[i]&&!(r=s[i](r))||(n=r.shift(),o.push({value:n,type:i,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?mt.error(e):Me(e,u).slice(0)},ie=mt.compile=function(e,t){var n,h,v,y,b,r,o=[],i=[],a=Fe[e+" "];if(!a){for(t||(t=oe(e)),n=t.length;n--;)(a=Tt(t[n]))[De]?o.push(a):i.push(a);(a=Fe(e,(h=i,y=0<(v=o).length,b=0<h.length,r=function(e,t,n,r,o){var i,a,u,s=0,c="0",l=e&&[],f=[],d=ue,m=e||b&&te.find.TAG("*",o),p=Pe+=null==d?1:Math.random()||.1,g=m.length;for(o&&(ue=t!==fe&&t);c!==g&&null!=(i=m[c]);c++){if(b&&i){for(a=0;u=h[a++];)if(u(i,t,n)){r.push(i);break}o&&(Pe=p)}y&&((i=!u&&i)&&s--,e&&l.push(i))}if(s+=c,y&&c!==s){for(a=0;u=v[a++];)u(l,f,t,n);if(e){if(0<s)for(;c--;)l[c]||f[c]||(f[c]=He.call(r));f=St(f)}$e.apply(r,f),o&&!e&&0<f.length&&1<s+v.length&&mt.uniqueSort(r)}return o&&(Pe=p,ue=d),l},y?gt(r):r))).selector=e}return a},ae=mt.select=function(e,t,n,r){var o,i,a,u,s,c="function"==typeof e&&e,l=!r&&oe(e=c.selector||e);if(n=n||[],1===l.length){if(2<(i=l[0]=l[0].slice(0)).length&&"ID"===(a=i[0]).type&&ee.getById&&9===t.nodeType&&me&&te.relative[i[1].type]){if(!(t=(te.find.ID(a.matches[0].replace(ft,dt),t)||[])[0]))return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=ot.needsContext.test(e)?0:i.length;o--&&(a=i[o],!te.relative[u=a.type]);)if((s=te.find[u])&&(r=s(a.matches[0].replace(ft,dt),ct.test(i[0].type)&&Ct(t.parentNode)||t))){if(i.splice(o,1),!(e=r.length&&wt(i)))return $e.apply(n,r),n;break}}return(c||ie(e,l))(r,t,!me,n,ct.test(e)&&Ct(t.parentNode)||t),n},ee.sortStable=De.split("").sort(ze).join("")===De,ee.detectDuplicates=!!ce,le(),ee.sortDetached=!0;var At=Array.isArray,Rt=function(e,t,n){var r,o;if(!e)return 0;if(n=n||e,e.length!==undefined){for(r=0,o=e.length;r<o;r++)if(!1===t.call(n,e[r],r,e))return 0}else for(r in e)if(e.hasOwnProperty(r)&&!1===t.call(n,e[r],r,e))return 0;return 1},_t=function(e,t,n){var r,o;for(r=0,o=e.length;r<o;r++)if(t.call(n,e[r],r,e))return r;return-1},Bt={isArray:At,toArray:function(e){var t,n,r=e;if(!At(e))for(r=[],t=0,n=e.length;t<n;t++)r[t]=e[t];return r},each:Rt,map:function(n,r){var o=[];return Rt(n,function(e,t){o.push(r(e,t,n))}),o},filter:function(n,r){var o=[];return Rt(n,function(e,t){r&&!r(e,t,n)||o.push(e)}),o},indexOf:function(e,t){var n,r;if(e)for(n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},reduce:function(e,t,n,r){var o=0;for(arguments.length<3&&(n=e[0]);o<e.length;o++)n=t.call(r,n,e[o],o);return n},findIndex:_t,find:function(e,t,n){var r=_t(e,t,n);return-1!==r?e[r]:undefined},last:function(e){return e[e.length-1]}},Dt=/^\s*|\s*$/g,Ot=function(e){return null===e||e===undefined?"":(""+e).replace(Dt,"")},Pt=function(e,t){return t?!("array"!==t||!Bt.isArray(e))||typeof e===t:e!==undefined},Lt=function(e,n,r,o){o=o||this,e&&(r&&(e=e[r]),Bt.each(e,function(e,t){if(!1===n.call(o,e,t,r))return!1;Lt(e,n,r,o)}))},It={trim:Ot,isArray:Bt.isArray,is:Pt,toArray:Bt.toArray,makeMap:function(e,t,n){var r;for(t=t||",","string"==typeof(e=e||[])&&(e=e.split(t)),n=n||{},r=e.length;r--;)n[e[r]]={};return n},each:Bt.each,map:Bt.map,grep:Bt.filter,inArray:Bt.indexOf,hasOwn:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},extend:function(e,t){for(var n,r,o,i=[],a=2;a<arguments.length;a++)i[a-2]=arguments[a];var u,s=arguments;for(n=1,r=s.length;n<r;n++)for(o in t=s[n])t.hasOwnProperty(o)&&(u=t[o])!==undefined&&(e[o]=u);return e},create:function(e,t,n){var r,o,i,a,u,s=this,c=0;if(e=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(e),i=e[3].match(/(^|\.)(\w+)$/i)[2],!(o=s.createNS(e[3].replace(/\.\w+$/,""),n))[i]){if("static"===e[2])return o[i]=t,void(this.onCreate&&this.onCreate(e[2],e[3],o[i]));t[i]||(t[i]=function(){},c=1),o[i]=t[i],s.extend(o[i].prototype,t),e[5]&&(r=s.resolve(e[5]).prototype,a=e[5].match(/\.(\w+)$/i)[1],u=o[i],o[i]=c?function(){return r[a].apply(this,arguments)}:function(){return this.parent=r[a],u.apply(this,arguments)},o[i].prototype[i]=o[i],s.each(r,function(e,t){o[i].prototype[t]=r[t]}),s.each(t,function(e,t){r[t]?o[i].prototype[t]=function(){return this.parent=r[t],e.apply(this,arguments)}:t!==i&&(o[i].prototype[t]=e)})),s.each(t["static"],function(e,t){o[i][t]=e})}},walk:Lt,createNS:function(e,t){var n,r;for(t=t||window,e=e.split("."),n=0;n<e.length;n++)t[r=e[n]]||(t[r]={}),t=t[r];return t},resolve:function(e,t){var n,r;for(t=t||window,n=0,r=(e=e.split(".")).length;n<r&&(t=t[e[n]]);n++);return t},explode:function(e,t){return!e||Pt(e,"array")?e:Bt.map(e.split(t||","),Ot)},_addCacheSuffix:function(e){var t=ve.cacheSuffix;return t&&(e+=(-1===e.indexOf("?")?"?":"&")+t),e}},Mt=document,Ft=Array.prototype.push,zt=Array.prototype.slice,Ut=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,qt=Be.Event,Vt=It.makeMap("children,contents,next,prev"),Ht=function(e){return void 0!==e},jt=function(e){return"string"==typeof e},$t=function(e,t){var n,r,o;for(o=(t=t||Mt).createElement("div"),n=t.createDocumentFragment(),o.innerHTML=e;r=o.firstChild;)n.appendChild(r);return n},Wt=function(e,t,n,r){var o;if(jt(t))t=$t(t,un(e[0]));else if(t.length&&!t.nodeType){if(t=tn.makeArray(t),r)for(o=t.length-1;0<=o;o--)Wt(e,t[o],n,r);else for(o=0;o<t.length;o++)Wt(e,t[o],n,r);return e}if(t.nodeType)for(o=e.length;o--;)n.call(e[o],t);return e},Kt=function(e,t){return e&&t&&-1!==(" "+e.className+" ").indexOf(" "+t+" ")},Xt=function(e,t,n){var r,o;return t=tn(t)[0],e.each(function(){var e=this;n&&r===e.parentNode||(r=e.parentNode,o=t.cloneNode(!1),e.parentNode.insertBefore(o,e)),o.appendChild(e)}),e},Yt=It.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),Gt=It.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),Jt={"for":"htmlFor","class":"className",readonly:"readOnly"},Qt={"float":"cssFloat"},Zt={},en={},tn=function(e,t){return new tn.fn.init(e,t)},nn=/^\s*|\s*$/g,rn=function(e){return null===e||e===undefined?"":(""+e).replace(nn,"")},on=function(e,t){var n,r,o,i;if(e)if((n=e.length)===undefined){for(r in e)if(e.hasOwnProperty(r)&&(i=e[r],!1===t.call(i,r,i)))break}else for(o=0;o<n&&(i=e[o],!1!==t.call(i,o,i));o++);return e},an=function(e,n){var r=[];return on(e,function(e,t){n(t,e)&&r.push(t)}),r},un=function(e){return e?9===e.nodeType?e:e.ownerDocument:Mt};tn.fn=tn.prototype={constructor:tn,selector:"",context:null,length:0,init:function(e,t){var n,r,o=this;if(!e)return o;if(e.nodeType)return o.context=o[0]=e,o.length=1,o;if(t&&t.nodeType)o.context=t;else{if(t)return tn(e).attr(t);o.context=t=document}if(jt(e)){if(!(n="<"===(o.selector=e).charAt(0)&&">"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Ut.exec(e)))return tn(t).find(e);if(n[1])for(r=$t(e,un(t)).firstChild;r;)Ft.call(o,r),r=r.nextSibling;else{if(!(r=un(t).getElementById(n[2])))return o;if(r.id!==n[2])return o.find(e);o.length=1,o[0]=r}}else this.add(e,!1);return o},toArray:function(){return It.toArray(this)},add:function(e,t){var n,r,o=this;if(jt(e))return o.add(tn(e));if(!1!==t)for(n=tn.unique(o.toArray().concat(tn.makeArray(e))),o.length=n.length,r=0;r<n.length;r++)o[r]=n[r];else Ft.apply(o,tn.makeArray(e));return o},attr:function(t,n){var e,r=this;if("object"==typeof t)on(t,function(e,t){r.attr(e,t)});else{if(!Ht(n)){if(r[0]&&1===r[0].nodeType){if((e=Zt[t])&&e.get)return e.get(r[0],t);if(Gt[t])return r.prop(t)?t:undefined;null===(n=r[0].getAttribute(t,2))&&(n=undefined)}return n}this.each(function(){var e;if(1===this.nodeType){if((e=Zt[t])&&e.set)return void e.set(this,n);null===n?this.removeAttribute(t,2):this.setAttribute(t,n,2)}})}return r},removeAttr:function(e){return this.attr(e,null)},prop:function(e,t){var n=this;if("object"==typeof(e=Jt[e]||e))on(e,function(e,t){n.prop(e,t)});else{if(!Ht(t))return n[0]&&n[0].nodeType&&e in n[0]?n[0][e]:t;this.each(function(){1===this.nodeType&&(this[e]=t)})}return n},css:function(n,r){var e,o,i=this,t=function(e){return e.replace(/-(\D)/g,function(e,t){return t.toUpperCase()})},a=function(e){return e.replace(/[A-Z]/g,function(e){return"-"+e})};if("object"==typeof n)on(n,function(e,t){i.css(e,t)});else if(Ht(r))n=t(n),"number"!=typeof r||Yt[n]||(r=r.toString()+"px"),i.each(function(){var e=this.style;if((o=en[n])&&o.set)o.set(this,r);else{try{this.style[Qt[n]||n]=r}catch(t){}null!==r&&""!==r||(e.removeProperty?e.removeProperty(a(n)):e.removeAttribute(n))}});else{if(e=i[0],(o=en[n])&&o.get)return o.get(e);if(!e.ownerDocument.defaultView)return e.currentStyle?e.currentStyle[t(n)]:"";try{return e.ownerDocument.defaultView.getComputedStyle(e,null).getPropertyValue(a(n))}catch(u){return undefined}}return i},remove:function(){for(var e,t=this.length;t--;)e=this[t],qt.clean(e),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var e,t=this.length;t--;)for(e=this[t];e.firstChild;)e.removeChild(e.firstChild);return this},html:function(e){var t,n=this;if(Ht(e)){t=n.length;try{for(;t--;)n[t].innerHTML=e}catch(r){tn(n[t]).empty().append(e)}return n}return n[0]?n[0].innerHTML:""},text:function(e){var t,n=this;if(Ht(e)){for(t=n.length;t--;)"innerText"in n[t]?n[t].innerText=e:n[0].textContent=e;return n}return n[0]?n[0].innerText||n[0].textContent:""},append:function(){return Wt(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.appendChild(e)})},prepend:function(){return Wt(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.insertBefore(e,this.firstChild)},!0)},before:function(){return this[0]&&this[0].parentNode?Wt(this,arguments,function(e){this.parentNode.insertBefore(e,this)}):this},after:function(){return this[0]&&this[0].parentNode?Wt(this,arguments,function(e){this.parentNode.insertBefore(e,this.nextSibling)},!0):this},appendTo:function(e){return tn(e).append(this),this},prependTo:function(e){return tn(e).prepend(this),this},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){return Xt(this,e)},wrapAll:function(e){return Xt(this,e,!0)},wrapInner:function(e){return this.each(function(){tn(this).contents().wrapAll(e)}),this},unwrap:function(){return this.parent().each(function(){tn(this).replaceWith(this.childNodes)})},clone:function(){var e=[];return this.each(function(){e.push(this.cloneNode(!0))}),tn(e)},addClass:function(e){return this.toggleClass(e,!0)},removeClass:function(e){return this.toggleClass(e,!1)},toggleClass:function(o,i){var e=this;return"string"!=typeof o||(-1!==o.indexOf(" ")?on(o.split(" "),function(){e.toggleClass(this,i)}):e.each(function(e,t){var n,r;(r=Kt(t,o))!==i&&(n=t.className,r?t.className=rn((" "+n+" ").replace(" "+o+" "," ")):t.className+=n?" "+o:o)})),e},hasClass:function(e){return Kt(this[0],e)},each:function(e){return on(this,e)},on:function(e,t){return this.each(function(){qt.bind(this,e,t)})},off:function(e,t){return this.each(function(){qt.unbind(this,e,t)})},trigger:function(e){return this.each(function(){"object"==typeof e?qt.fire(this,e.type,e):qt.fire(this,e)})},show:function(){return this.css("display","")},hide:function(){return this.css("display","none")},slice:function(){return new tn(zt.apply(this,arguments))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},find:function(e){var t,n,r=[];for(t=0,n=this.length;t<n;t++)tn.find(e,this[t],r);return tn(r)},filter:function(n){return tn("function"==typeof n?an(this.toArray(),function(e,t){return n(t,e)}):tn.filter(n,this.toArray()))},closest:function(n){var r=[];return n instanceof tn&&(n=n[0]),this.each(function(e,t){for(;t;){if("string"==typeof n&&tn(t).is(n)){r.push(t);break}if(t===n){r.push(t);break}t=t.parentNode}}),tn(r)},offset:function(e){var t,n,r,o,i=0,a=0;return e?this.css(e):((t=this[0])&&(r=(n=t.ownerDocument).documentElement,t.getBoundingClientRect&&(i=(o=t.getBoundingClientRect()).left+(r.scrollLeft||n.body.scrollLeft)-r.clientLeft,a=o.top+(r.scrollTop||n.body.scrollTop)-r.clientTop)),{left:i,top:a})},push:Ft,sort:[].sort,splice:[].splice},It.extend(tn,{extend:It.extend,makeArray:function(e){return(t=e)&&t===t.window||e.nodeType?[e]:It.toArray(e);var t},inArray:function(e,t){var n;if(t.indexOf)return t.indexOf(e);for(n=t.length;n--;)if(t[n]===e)return n;return-1},isArray:It.isArray,each:on,trim:rn,grep:an,find:mt,expr:mt.selectors,unique:mt.uniqueSort,text:mt.getText,contains:mt.contains,filter:function(e,t,n){var r=t.length;for(n&&(e=":not("+e+")");r--;)1!==t[r].nodeType&&t.splice(r,1);return t=1===t.length?tn.find.matchesSelector(t[0],e)?[t[0]]:[]:tn.find.matches(e,t)}});var sn=function(e,t,n){var r=[],o=e[t];for("string"!=typeof n&&n instanceof tn&&(n=n[0]);o&&9!==o.nodeType;){if(n!==undefined){if(o===n)break;if("string"==typeof n&&tn(o).is(n))break}1===o.nodeType&&r.push(o),o=o[t]}return r},cn=function(e,t,n,r){var o=[];for(r instanceof tn&&(r=r[0]);e;e=e[t])if(!n||e.nodeType===n){if(r!==undefined){if(e===r)break;if("string"==typeof r&&tn(e).is(r))break}o.push(e)}return o},ln=function(e,t,n){for(e=e[t];e;e=e[t])if(e.nodeType===n)return e;return null};on({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return sn(e,"parentNode")},next:function(e){return ln(e,"nextSibling",1)},prev:function(e){return ln(e,"previousSibling",1)},children:function(e){return cn(e.firstChild,"nextSibling",1)},contents:function(e){return It.toArray(("iframe"===e.nodeName?e.contentDocument||e.contentWindow.document:e).childNodes)}},function(e,r){tn.fn[e]=function(t){var n=[];return this.each(function(){var e=r.call(n,this,t,n);e&&(tn.isArray(e)?n.push.apply(n,e):n.push(e))}),1<this.length&&(Vt[e]||(n=tn.unique(n)),0===e.indexOf("parents")&&(n=n.reverse())),n=tn(n),t?n.filter(t):n}}),on({parentsUntil:function(e,t){return sn(e,"parentNode",t)},nextUntil:function(e,t){return cn(e,"nextSibling",1,t).slice(1)},prevUntil:function(e,t){return cn(e,"previousSibling",1,t).slice(1)}},function(r,o){tn.fn[r]=function(t,e){var n=[];return this.each(function(){var e=o.call(n,this,t,n);e&&(tn.isArray(e)?n.push.apply(n,e):n.push(e))}),1<this.length&&(n=tn.unique(n),0!==r.indexOf("parents")&&"prevUntil"!==r||(n=n.reverse())),n=tn(n),e?n.filter(e):n}}),tn.fn.is=function(e){return!!e&&0<this.filter(e).length},tn.fn.init.prototype=tn.fn,tn.overrideDefaults=function(n){var r,o=function(e,t){return r=r||n(),0===arguments.length&&(e=r.element),t||(t=r.context),new o.fn.init(e,t)};return tn.extend(o,this),o};var fn=function(n,r,e){on(e,function(e,t){n[e]=n[e]||{},n[e][r]=t})};ve.ie&&ve.ie<8&&(fn(Zt,"get",{maxlength:function(e){var t=e.maxLength;return 2147483647===t?undefined:t},size:function(e){var t=e.size;return 20===t?undefined:t},"class":function(e){return e.className},style:function(e){var t=e.style.cssText;return 0===t.length?undefined:t}}),fn(Zt,"set",{"class":function(e,t){e.className=t},style:function(e,t){e.style.cssText=t}})),ve.ie&&ve.ie<9&&(Qt["float"]="styleFloat",fn(en,"set",{opacity:function(e,t){var n=e.style;null===t||""===t?n.removeAttribute("filter"):(n.zoom=1,n.filter="alpha(opacity="+100*t+")")}})),tn.attrHooks=Zt,tn.cssHooks=en;var dn,mn=function(e){var t,n=!1;return function(){return n||(n=!0,t=e.apply(null,arguments)),t}},pn=function(e,t){var n=function(e,t){for(var n=0;n<e.length;n++){var r=e[n];if(r.test(t))return r}return undefined}(e,t);if(!n)return{major:0,minor:0};var r=function(e){return Number(t.replace(n,"$"+e))};return hn(r(1),r(2))},gn=function(){return hn(0,0)},hn=function(e,t){return{major:e,minor:t}},vn={nu:hn,detect:function(e,t){var n=String(t).toLowerCase();return 0===e.length?gn():pn(e,n)},unknown:gn},yn="Firefox",bn=function(e,t){return function(){return t===e}},Cn=function(e){var t=e.current;return{current:t,version:e.version,isEdge:bn("Edge",t),isChrome:bn("Chrome",t),isIE:bn("IE",t),isOpera:bn("Opera",t),isFirefox:bn(yn,t),isSafari:bn("Safari",t)}},xn={unknown:function(){return Cn({current:undefined,version:vn.unknown()})},nu:Cn,edge:V.constant("Edge"),chrome:V.constant("Chrome"),ie:V.constant("IE"),opera:V.constant("Opera"),firefox:V.constant(yn),safari:V.constant("Safari")},wn="Windows",Nn="Android",En="Solaris",Sn="FreeBSD",kn=function(e,t){return function(){return t===e}},Tn=function(e){var t=e.current;return{current:t,version:e.version,isWindows:kn(wn,t),isiOS:kn("iOS",t),isAndroid:kn(Nn,t),isOSX:kn("OSX",t),isLinux:kn("Linux",t),isSolaris:kn(En,t),isFreeBSD:kn(Sn,t)}},An={unknown:function(){return Tn({current:undefined,version:vn.unknown()})},nu:Tn,windows:V.constant(wn),ios:V.constant("iOS"),android:V.constant(Nn),linux:V.constant("Linux"),osx:V.constant("OSX"),solaris:V.constant(En),freebsd:V.constant(Sn)},Rn=function(e,t){var n=String(t).toLowerCase();return H.find(e,function(e){return e.search(n)})},_n=function(e,n){return Rn(e,n).map(function(e){var t=vn.detect(e.versionRegexes,n);return{current:e.name,version:t}})},Bn=function(e,n){return Rn(e,n).map(function(e){var t=vn.detect(e.versionRegexes,n);return{current:e.name,version:t}})},Dn=function(e,t){return-1!==e.indexOf(t)},On=function(e){return e.replace(/^\s+|\s+$/g,"")},Pn=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,Ln=function(t){return function(e){return Dn(e,t)}},In=[{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return Dn(e,"edge/")&&Dn(e,"chrome")&&Dn(e,"safari")&&Dn(e,"applewebkit")}},{name:"Chrome",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,Pn],search:function(e){return Dn(e,"chrome")&&!Dn(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return Dn(e,"msie")||Dn(e,"trident")}},{name:"Opera",versionRegexes:[Pn,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Ln("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Ln("firefox")},{name:"Safari",versionRegexes:[Pn,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(Dn(e,"safari")||Dn(e,"mobile/"))&&Dn(e,"applewebkit")}}],Mn=[{name:"Windows",search:Ln("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return Dn(e,"iphone")||Dn(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Ln("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:Ln("os x"),versionRegexes:[/.*?os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Ln("linux"),versionRegexes:[]},{name:"Solaris",search:Ln("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Ln("freebsd"),versionRegexes:[]}],Fn={browsers:V.constant(In),oses:V.constant(Mn)},zn=function(e){var t,n,r,o,i,a,u,s,c,l,f,d=Fn.browsers(),m=Fn.oses(),p=_n(d,e).fold(xn.unknown,xn.nu),g=Bn(m,e).fold(An.unknown,An.nu);return{browser:p,os:g,deviceType:(n=p,r=e,o=(t=g).isiOS()&&!0===/ipad/i.test(r),i=t.isiOS()&&!o,a=t.isAndroid()&&3===t.version.major,u=t.isAndroid()&&4===t.version.major,s=o||a||u&&!0===/mobile/i.test(r),c=t.isiOS()||t.isAndroid(),l=c&&!s,f=n.isSafari()&&t.isiOS()&&!1===/safari/i.test(r),{isiPad:V.constant(o),isiPhone:V.constant(i),isTablet:V.constant(s),isPhone:V.constant(l),isTouch:V.constant(c),isAndroid:t.isAndroid,isiOS:t.isiOS,isWebView:V.constant(f)})}},Un={detect:mn(function(){var e=navigator.userAgent;return zn(e)})},qn=function(e){if(null===e||e===undefined)throw new Error("Node cannot be null or undefined");return{dom:V.constant(e)}},Vn={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",e),"HTML must have a single root node";return qn(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return qn(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return qn(n)},fromDom:qn,fromPoint:function(e,t,n){return A.from(e.dom().elementFromPoint(t,n)).map(qn)}},Hn=8,jn=9,$n=1,Wn=3,Kn=function(e){return e.dom().nodeName.toLowerCase()},Xn=function(e){return e.dom().nodeType},Yn=function(t){return function(e){return Xn(e)===t}},Gn=Yn($n),Jn=Yn(Wn),Qn=Yn(jn),Zn={name:Kn,type:Xn,value:function(e){return e.dom().nodeValue},isElement:Gn,isText:Jn,isDocument:Qn,isComment:function(e){return Xn(e)===Hn||"#comment"===Kn(e)}},er=(dn=Object.keys)===undefined?function(e){var t=[];for(var n in e)e.hasOwnProperty(n)&&t.push(n);return t}:dn,tr=function(e,t){for(var n=er(e),r=0,o=n.length;r<o;r++){var i=n[r];t(e[i],i,e)}},nr=function(r,o){var i={};return tr(r,function(e,t){var n=o(e,t,r);i[n.k]=n.v}),i},rr=function(e,n){var r=[];return tr(e,function(e,t){r.push(n(e,t))}),r},or=function(e){return rr(e,function(e){return e})},ir={bifilter:function(e,n){var r={},o={};return tr(e,function(e,t){(n(e,t)?r:o)[t]=e}),{t:r,f:o}},each:tr,map:function(e,r){return nr(e,function(e,t,n){return{k:t,v:r(e,t,n)}})},mapToArray:rr,tupleMap:nr,find:function(e,t){for(var n=er(e),r=0,o=n.length;r<o;r++){var i=n[r],a=e[i];if(t(a,i,e))return A.some(a)}return A.none()},keys:er,values:or,size:function(e){return or(e).length}},ar=function(e,t,n){if(!(k.isString(n)||k.isBoolean(n)||k.isNumber(n)))throw console.error("Invalid call to Attr.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")},ur=function(e,t,n){ar(e.dom(),t,n)},sr=function(e,t){var n=e.dom().getAttribute(t);return null===n?undefined:n},cr=function(e,t){var n=e.dom();return!(!n||!n.hasAttribute)&&n.hasAttribute(t)},lr={clone:function(e){return H.foldl(e.dom().attributes,function(e,t){return e[t.name]=t.value,e},{})},set:ur,setAll:function(e,t){var n=e.dom();ir.each(t,function(e,t){ar(n,t,e)})},get:sr,has:cr,remove:function(e,t){e.dom().removeAttribute(t)},hasNone:function(e){var t=e.dom().attributes;return t===undefined||null===t||0===t.length},transfer:function(o,i,e){Zn.isElement(o)&&Zn.isElement(i)&&H.each(e,function(e){var t,n,r;n=i,cr(t=o,r=e)&&!cr(n,r)&&ur(n,r,sr(t,r))})}},fr=mn(function(){return dr(Vn.fromDom(document))}),dr=function(e){var t=e.dom().body;if(null===t||t===undefined)throw"Body is not available yet";return Vn.fromDom(t)},mr={body:fr,getBody:dr,inBody:function(e){var t=Zn.isText(e)?e.dom().parentNode:e.dom();return t!==undefined&&null!==t&&t.ownerDocument.body.contains(t)}},pr=function(e){return e.style!==undefined},gr=function(e,t,n){if(!k.isString(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);pr(e)&&e.style.setProperty(t,n)},hr=function(e,t){return pr(e)?e.style.getPropertyValue(t):""},vr=function(e,t){var n=e.dom(),r=hr(n,t);return A.from(r).filter(function(e){return 0<e.length})},yr=function(e,t){var n=e.dom();ir.each(t,function(e,t){gr(n,t,e)})},br=function(e,t){var n=e.dom(),r=window.getComputedStyle(n).getPropertyValue(t),o=""!==r||mr.inBody(e)?r:hr(n,t);return null===o?undefined:o},Cr=vr,xr=function(e){return e.slice(0).sort()},wr=function(e,t){throw new Error("All required keys ("+xr(e).join(", ")+") were not specified. Specified keys were: "+xr(t).join(", ")+".")},Nr=function(e){throw new Error("Unsupported keys for object: "+xr(e).join(", "))},Er=function(t,e){if(!k.isArray(e))throw new Error("The "+t+" fields must be an array. Was: "+e+".");H.each(e,function(e){if(!k.isString(e))throw new Error("The value "+e+" in the "+t+" fields was not a string.")})},Sr=function(e){var n=xr(e);H.find(n,function(e,t){return t<n.length-1&&e===n[t+1]}).each(function(e){throw new Error("The field: "+e+" occurs more than once in the combined fields: ["+n.join(", ")+"].")})},kr={immutable:function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];if(t.length!==n.length)throw new Error('Wrong number of arguments to struct. Expected "['+t.length+']", got '+n.length+" arguments");var r={};return H.each(t,function(e,t){r[e]=V.constant(n[t])}),r}},immutableBag:function(o,i){var a=o.concat(i);if(0===a.length)throw new Error("You must specify at least one required or optional field.");return Er("required",o),Er("optional",i),Sr(a),function(t){var n=ir.keys(t);H.forall(o,function(e){return H.contains(n,e)})||wr(o,n);var e=H.filter(n,function(e){return!H.contains(a,e)});0<e.length&&Nr(e);var r={};return H.each(o,function(e){r[e]=V.constant(t[e])}),H.each(i,function(e){r[e]=V.constant(Object.prototype.hasOwnProperty.call(t,e)?A.some(t[e]):A.none())}),r}}},Tr=function(e,t){for(var n=[],r=function(e){return n.push(e),t(e)},o=t(e);(o=o.bind(r)).isSome(););return n},Ar=function(){return W.getOrDie("Node")},Rr=function(e,t,n){return 0!=(e.compareDocumentPosition(t)&n)},_r=function(e,t){return Rr(e,t,Ar().DOCUMENT_POSITION_CONTAINED_BY)},Br=$n,Dr=jn,Or=function(e){return e.nodeType!==Br&&e.nodeType!==Dr||0===e.childElementCount},Pr={all:function(e,t){var n=t===undefined?document:t.dom();return Or(n)?[]:H.map(n.querySelectorAll(e),Vn.fromDom)},is:function(e,t){var n=e.dom();if(n.nodeType!==Br)return!1;if(n.matches!==undefined)return n.matches(t);if(n.msMatchesSelector!==undefined)return n.msMatchesSelector(t);if(n.webkitMatchesSelector!==undefined)return n.webkitMatchesSelector(t);if(n.mozMatchesSelector!==undefined)return n.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")},one:function(e,t){var n=t===undefined?document:t.dom();return Or(n)?A.none():A.from(n.querySelector(e)).map(Vn.fromDom)}},Lr=function(e,t){return e.dom()===t.dom()},Ir=Un.detect().browser.isIE()?function(e,t){return _r(e.dom(),t.dom())}:function(e,t){var n=e.dom(),r=t.dom();return n!==r&&n.contains(r)},Mr={eq:Lr,isEqualNode:function(e,t){return e.dom().isEqualNode(t.dom())},member:function(e,t){return H.exists(t,V.curry(Lr,e))},contains:Ir,is:Pr.is},Fr=function(e){return Vn.fromDom(e.dom().ownerDocument)},zr=function(e){var t=e.dom();return A.from(t.parentNode).map(Vn.fromDom)},Ur=function(e){var t=e.dom();return A.from(t.previousSibling).map(Vn.fromDom)},qr=function(e){var t=e.dom();return A.from(t.nextSibling).map(Vn.fromDom)},Vr=function(e){var t=e.dom();return H.map(t.childNodes,Vn.fromDom)},Hr=function(e,t){var n=e.dom().childNodes;return A.from(n[t]).map(Vn.fromDom)},jr=kr.immutable("element","offset"),$r={owner:Fr,defaultView:function(e){var t=e.dom().ownerDocument.defaultView;return Vn.fromDom(t)},documentElement:function(e){var t=Fr(e);return Vn.fromDom(t.dom().documentElement)},parent:zr,findIndex:function(n){return zr(n).bind(function(e){var t=Vr(e);return H.findIndex(t,function(e){return Mr.eq(n,e)})})},parents:function(e,t){for(var n=k.isFunction(t)?t:V.constant(!1),r=e.dom(),o=[];null!==r.parentNode&&r.parentNode!==undefined;){var i=r.parentNode,a=Vn.fromDom(i);if(o.push(a),!0===n(a))break;r=i}return o},siblings:function(t){return zr(t).map(Vr).map(function(e){return H.filter(e,function(e){return!Mr.eq(t,e)})}).getOr([])},prevSibling:Ur,offsetParent:function(e){var t=e.dom();return A.from(t.offsetParent).map(Vn.fromDom)},prevSiblings:function(e){return H.reverse(Tr(e,Ur))},nextSibling:qr,nextSiblings:function(e){return Tr(e,qr)},children:Vr,child:Hr,firstChild:function(e){return Hr(e,0)},lastChild:function(e){return Hr(e,e.dom().childNodes.length-1)},childNodesCount:function(e){return e.dom().childNodes.length},hasChildNodes:function(e){return e.dom().hasChildNodes()},leaf:function(e,t){var n=Vr(e);return 0<n.length&&t<n.length?jr(n[t],0):jr(e,t)}},Wr=Un.detect().browser,Kr=function(e){return H.find(e,Zn.isElement)},Xr={getPos:function(e,t,n){var r,o,i,a=0,u=0,s=e.ownerDocument;if(n=n||e,t){if(n===e&&t.getBoundingClientRect&&"static"===br(Vn.fromDom(e),"position"))return{x:a=(o=t.getBoundingClientRect()).left+(s.documentElement.scrollLeft||e.scrollLeft)-s.documentElement.clientLeft,y:u=o.top+(s.documentElement.scrollTop||e.scrollTop)-s.documentElement.clientTop};for(r=t;r&&r!==n&&r.nodeType;)a+=r.offsetLeft||0,u+=r.offsetTop||0,r=r.offsetParent;for(r=t.parentNode;r&&r!==n&&r.nodeType;)a-=r.scrollLeft||0,u-=r.scrollTop||0,r=r.parentNode;u+=(i=Vn.fromDom(t),Wr.isFirefox()&&"table"===Zn.name(i)?Kr($r.children(i)).filter(function(e){return"caption"===Zn.name(e)}).bind(function(o){return Kr($r.nextSiblings(o)).map(function(e){var t=e.dom().offsetTop,n=o.dom().offsetTop,r=o.dom().offsetHeight;return t<=n?-r:0})}).getOr(0):0)}return{x:a,y:u}}},Yr=function(e){var n=A.none(),t=[],r=function(e){o()?a(e):t.push(e)},o=function(){return n.isSome()},i=function(e){H.each(e,a)},a=function(t){n.each(function(e){setTimeout(function(){t(e)},0)})};return e(function(e){n=A.some(e),i(t),t=[]}),{get:r,map:function(n){return Yr(function(t){r(function(e){t(n(e))})})},isReady:o}},Gr={nu:Yr,pure:function(t){return Yr(function(e){e(t)})}},Jr=function(n){return function(){var e=Array.prototype.slice.call(arguments),t=this;setTimeout(function(){n.apply(t,e)},0)}},Qr=function(t){var e=function(e){t(Jr(e))};return{map:function(r){return Qr(function(n){e(function(e){var t=r(e);n(t)})})},bind:function(n){return Qr(function(t){e(function(e){n(e).get(t)})})},anonBind:function(n){return Qr(function(t){e(function(e){n.get(t)})})},toLazy:function(){return Gr.nu(e)},get:e}},Zr={nu:Qr,pure:function(t){return Qr(function(e){e(t)})}},eo=function(a,e){return e(function(r){var o=[],i=0;0===a.length?r([]):H.each(a,function(e,t){var n;e.get((n=t,function(e){o[n]=e,++i>=a.length&&r(o)}))})})},to=function(e){return eo(e,Zr.nu)},no={par:to,mapM:function(e,t){var n=H.map(e,t);return to(n)},compose:function(t,n){return function(e){return n(e).bind(t)}}},ro=function(n){return{is:function(e){return n===e},isValue:V.always,isError:V.never,getOr:V.constant(n),getOrThunk:V.constant(n),getOrDie:V.constant(n),or:function(e){return ro(n)},orThunk:function(e){return ro(n)},fold:function(e,t){return t(n)},map:function(e){return ro(e(n))},each:function(e){e(n)},bind:function(e){return e(n)},exists:function(e){return e(n)},forall:function(e){return e(n)},toOption:function(){return A.some(n)}}},oo=function(n){return{is:V.never,isValue:V.never,isError:V.always,getOr:V.identity,getOrThunk:function(e){return e()},getOrDie:function(){return V.die(String(n))()},or:function(e){return e},orThunk:function(e){return e()},fold:function(e,t){return e(n)},map:function(e){return oo(n)},each:V.noop,bind:function(e){return oo(n)},exists:V.never,forall:V.always,toOption:A.none}},io={value:ro,error:oo};function ao(e,u){var t=e,n=function(e,t,n,r){var o,i;if(e){if(!r&&e[t])return e[t];if(e!==u){if(o=e[n])return o;for(i=e.parentNode;i&&i!==u;i=i.parentNode)if(o=i[n])return o}}};this.current=function(){return t},this.next=function(e){return t=n(t,"firstChild","nextSibling",e)},this.prev=function(e){return t=n(t,"lastChild","previousSibling",e)},this.prev2=function(e){return t=function(e,t,n,r){var o,i,a;if(e){if(o=e[n],u&&o===u)return;if(o){if(!r)for(a=o[t];a;a=a[t])if(!a[t])return a;return o}if((i=e.parentNode)&&i!==u)return i}}(t,"lastChild","previousSibling",e)}}var uo,so,co,lo=function(t){var n;return function(e){return(n=n||H.mapToObject(t,V.constant(!0))).hasOwnProperty(Zn.name(e))}},fo=lo(["h1","h2","h3","h4","h5","h6"]),mo=lo(["article","aside","details","div","dt","figcaption","footer","form","fieldset","header","hgroup","html","main","nav","section","summary","body","p","dl","multicol","dd","figure","address","center","blockquote","h1","h2","h3","h4","h5","h6","listing","xmp","pre","plaintext","menu","dir","ul","ol","li","hr","table","tbody","thead","tfoot","th","tr","td","caption"]),po=function(e){return Zn.isElement(e)&&!mo(e)},go=function(e){return Zn.isElement(e)&&"br"===Zn.name(e)},ho=lo(["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"]),vo=lo(["ul","ol","dl"]),yo=lo(["li","dd","dt"]),bo=lo(["area","base","basefont","br","col","frame","hr","img","input","isindex","link","meta","param","embed","source","wbr","track"]),Co=lo(["thead","tbody","tfoot"]),xo=lo(["td","th"]),wo=lo(["pre","script","textarea","style"]),No=function(t){return function(e){return!!e&&e.nodeType===t}},Eo=No(1),So=function(e){var r=e.toLowerCase().split(" ");return function(e){var t,n;if(e&&e.nodeType)for(n=e.nodeName.toLowerCase(),t=0;t<r.length;t++)if(n===r[t])return!0;return!1}},ko=function(t){return function(e){if(Eo(e)){if(e.contentEditable===t)return!0;if(e.getAttribute("data-mce-contenteditable")===t)return!0}return!1}},To=No(3),Ao=No(8),Ro=No(9),_o=So("br"),Bo=ko("true"),Do=ko("false"),Oo={isText:To,isElement:Eo,isComment:Ao,isDocument:Ro,isBr:_o,isContentEditableTrue:Bo,isContentEditableFalse:Do,matchNodeNames:So,hasPropValue:function(t,n){return function(e){return Eo(e)&&e[t]===n}},hasAttribute:function(t,e){return function(e){return Eo(e)&&e.hasAttribute(t)}},hasAttributeValue:function(t,n){return function(e){return Eo(e)&&e.getAttribute(t)===n}},matchStyleValues:function(r,e){var o=e.toLowerCase().split(" ");return function(e){var t;if(Eo(e))for(t=0;t<o.length;t++){var n=e.ownerDocument.defaultView.getComputedStyle(e,null);if((n?n.getPropertyValue(r):null)===o[t])return!0}return!1}},isBogus:function(e){return Eo(e)&&e.hasAttribute("data-mce-bogus")},isBogusAll:function(e){return Eo(e)&&"all"===e.getAttribute("data-mce-bogus")},isTable:function(e){return Eo(e)&&"TABLE"===e.tagName}},Po=function(e){return e&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")},Lo=function(e,t){var n,r=t.childNodes;if(!Oo.isElement(t)||!Po(t)){for(n=r.length-1;0<=n;n--)Lo(e,r[n]);if(!1===Oo.isDocument(t)){if(Oo.isText(t)&&0<t.nodeValue.length){var o=It.trim(t.nodeValue).length;if(e.isBlock(t.parentNode)||0<o)return;if(0===o&&(a=(i=t).previousSibling&&"SPAN"===i.previousSibling.nodeName,u=i.nextSibling&&"SPAN"===i.nextSibling.nodeName,a&&u))return}else if(Oo.isElement(t)&&(1===(r=t.childNodes).length&&Po(r[0])&&t.parentNode.insertBefore(r[0],t),r.length||bo(Vn.fromDom(t))))return;e.remove(t)}var i,a,u;return t}},Io={trimNode:Lo},Mo=It.makeMap,Fo=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,zo=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Uo=/[<>&\"\']/g,qo=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,Vo={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};so={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},co={"<":"<",">":">","&":"&",""":'"',"'":"'"};var Ho=function(e,t){var n,r,o,i={};if(e){for(e=e.split(","),t=t||10,n=0;n<e.length;n+=2)r=String.fromCharCode(parseInt(e[n],t)),so[r]||(o="&"+e[n+1]+";",i[r]=o,i[o]=r);return i}};uo=Ho("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);var jo=function(e,t){return e.replace(t?Fo:zo,function(e){return so[e]||e})},$o=function(e,t){return e.replace(t?Fo:zo,function(e){return 1<e.length?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":so[e]||"&#"+e.charCodeAt(0)+";"})},Wo=function(e,t,n){return n=n||uo,e.replace(t?Fo:zo,function(e){return so[e]||n[e]||e})},Ko={encodeRaw:jo,encodeAllRaw:function(e){return(""+e).replace(Uo,function(e){return so[e]||e})},encodeNumeric:$o,encodeNamed:Wo,getEncodeFunc:function(e,t){var n=Ho(t)||uo,r=Mo(e.replace(/\+/g,","));return r.named&&r.numeric?function(e,t){return e.replace(t?Fo:zo,function(e){return so[e]!==undefined?so[e]:n[e]!==undefined?n[e]:1<e.length?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":"&#"+e.charCodeAt(0)+";"})}:r.named?t?function(e,t){return Wo(e,t,n)}:Wo:r.numeric?$o:jo},decode:function(e){return e.replace(qo,function(e,t){return t?65535<(t="x"===t.charAt(0).toLowerCase()?parseInt(t.substr(1),16):parseInt(t,10))?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):Vo[t]||String.fromCharCode(t):co[e]||uo[e]||(n=e,(r=Vn.fromTag("div").dom()).innerHTML=n,r.textContent||r.innerText||n);var n,r})}},Xo={},Yo={},Go=It.makeMap,Jo=It.each,Qo=It.extend,Zo=It.explode,ei=It.inArray,ti=function(e,t){return(e=It.trim(e))?e.split(t||" "):[]},ni=function(e){var u,t,n,r,o,i,s={},a=function(e,t,n){var r,o,i,a=function(e,t){var n,r,o={};for(n=0,r=e.length;n<r;n++)o[e[n]]=t||{};return o};for(t=t||"","string"==typeof(n=n||[])&&(n=ti(n)),r=(e=ti(e)).length;r--;)i={attributes:a(o=ti([u,t].join(" "))),attributesOrder:o,children:a(n,Yo)},s[e[r]]=i},c=function(e,t){var n,r,o,i;for(n=(e=ti(e)).length,t=ti(t);n--;)for(r=s[e[n]],o=0,i=t.length;o<i;o++)r.attributes[t[o]]={},r.attributesOrder.push(t[o])};return Xo[e]?Xo[e]:(u="id accesskey class dir lang style tabindex title role",t="address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul",n="a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd label map noscript object q s samp script select small span strong sub sup textarea u var #text #comment","html4"!==e&&(u+=" contenteditable contextmenu draggable dropzone hidden spellcheck translate",t+=" article aside details dialog figure header footer hgroup section nav",n+=" audio canvas command datalist mark meter output picture progress time wbr video ruby bdi keygen"),"html5-strict"!==e&&(u+=" xml:lang",n=[n,i="acronym applet basefont big font strike tt"].join(" "),Jo(ti(i),function(e){a(e,"",n)}),t=[t,o="center dir isindex noframes"].join(" "),r=[t,n].join(" "),Jo(ti(o),function(e){a(e,"",r)})),r=r||[t,n].join(" "),a("html","manifest","head body"),a("head","","base command link meta noscript script style title"),a("title hr noscript br"),a("base","href target"),a("link","href rel media hreflang type sizes hreflang"),a("meta","name http-equiv content charset"),a("style","media type scoped"),a("script","src async defer type charset"),a("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",r),a("address dt dd div caption","",r),a("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn","",n),a("blockquote","cite",r),a("ol","reversed start type","li"),a("ul","","li"),a("li","value",r),a("dl","","dt dd"),a("a","href target rel media hreflang type",n),a("q","cite",n),a("ins del","cite datetime",r),a("img","src sizes srcset alt usemap ismap width height"),a("iframe","src name width height",r),a("embed","src type width height"),a("object","data type typemustmatch name usemap form width height",[r,"param"].join(" ")),a("param","name value"),a("map","name",[r,"area"].join(" ")),a("area","alt coords shape href target rel media hreflang type"),a("table","border","caption colgroup thead tfoot tbody tr"+("html4"===e?" col":"")),a("colgroup","span","col"),a("col","span"),a("tbody thead tfoot","","tr"),a("tr","","td th"),a("td","colspan rowspan headers",r),a("th","colspan rowspan headers scope abbr",r),a("form","accept-charset action autocomplete enctype method name novalidate target",r),a("fieldset","disabled form name",[r,"legend"].join(" ")),a("label","form for",n),a("input","accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"),a("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"===e?r:n),a("select","disabled form multiple name required size","option optgroup"),a("optgroup","disabled label","option"),a("option","disabled label selected value"),a("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),a("menu","type label",[r,"li"].join(" ")),a("noscript","",r),"html4"!==e&&(a("wbr"),a("ruby","",[n,"rt rp"].join(" ")),a("figcaption","",r),a("mark rt rp summary bdi","",n),a("canvas","width height",r),a("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",[r,"track source"].join(" ")),a("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[r,"track source"].join(" ")),a("picture","","img source"),a("source","src srcset type media sizes"),a("track","kind src srclang label default"),a("datalist","",[n,"option"].join(" ")),a("article section nav aside header footer","",r),a("hgroup","","h1 h2 h3 h4 h5 h6"),a("figure","",[r,"figcaption"].join(" ")),a("time","datetime",n),a("dialog","open",r),a("command","type label icon disabled checked radiogroup command"),a("output","for form name",n),a("progress","value max",n),a("meter","value min max low high optimum",n),a("details","open",[r,"summary"].join(" ")),a("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!==e&&(c("script","language xml:space"),c("style","xml:space"),c("object","declare classid code codebase codetype archive standby align border hspace vspace"),c("embed","align name hspace vspace"),c("param","valuetype type"),c("a","charset name rev shape coords"),c("br","clear"),c("applet","codebase archive code object alt name width height align hspace vspace"),c("img","name longdesc align border hspace vspace"),c("iframe","longdesc frameborder marginwidth marginheight scrolling align"),c("font basefont","size color face"),c("input","usemap align"),c("select","onchange"),c("textarea"),c("h1 h2 h3 h4 h5 h6 div p legend caption","align"),c("ul","type compact"),c("li","type"),c("ol dl menu dir","compact"),c("pre","width xml:space"),c("hr","align noshade size width"),c("isindex","prompt"),c("table","summary width frame rules cellspacing cellpadding align bgcolor"),c("col","width align char charoff valign"),c("colgroup","width align char charoff valign"),c("thead","align char charoff valign"),c("tr","align char charoff valign bgcolor"),c("th","axis align char charoff valign nowrap bgcolor width height"),c("form","accept"),c("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),c("tfoot","align char charoff valign"),c("tbody","align char charoff valign"),c("area","nohref"),c("body","background bgcolor text link vlink alink")),"html4"!==e&&(c("input button select textarea","autofocus"),c("input textarea","placeholder"),c("a","download"),c("link script img","crossorigin"),c("iframe","sandbox seamless allowfullscreen")),Jo(ti("a form meter progress dfn"),function(e){s[e]&&delete s[e].children[e]}),delete s.caption.children.table,delete s.script,Xo[e]=s)},ri=function(e,n){var r;return e&&(r={},"string"==typeof e&&(e={"*":e}),Jo(e,function(e,t){r[t]=r[t.toUpperCase()]="map"===n?Go(e,/[, ]/):Zo(e,/[, ]/)})),r};function oi(i){var e,t,n,r,o,a,u,s,c,l,f,d,m,N={},p={},E=[],g={},h={},v=function(e,t,n){var r=i[e];return r?r=Go(r,/[, ]/,Go(r.toUpperCase(),/[, ]/)):(r=Xo[e])||(r=Go(t," ",Go(t.toUpperCase()," ")),r=Qo(r,n),Xo[e]=r),r};n=ni((i=i||{}).schema),!1===i.verify_html&&(i.valid_elements="*[*]"),e=ri(i.valid_styles),t=ri(i.invalid_styles,"map"),s=ri(i.valid_classes,"map"),r=v("whitespace_elements","pre script noscript style textarea video audio iframe object code"),o=v("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),a=v("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),u=v("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls"),l=v("non_empty_elements","td th iframe video audio object script pre code",a),f=v("move_caret_before_on_enter_elements","table",l),d=v("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside nav figure"),c=v("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex option datalist select optgroup figcaption details summary",d),m=v("text_inline_elements","span strong b em i font strike u var cite dfn code mark q sup sub samp"),Jo((i.special||"script noscript noframes noembed title style textarea xmp").split(" "),function(e){h[e]=new RegExp("</"+e+"[^>]*>","gi")});var S=function(e){return new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$")},y=function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,p,g,h,v,y,b,C=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)\])?$/,x=/^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/,w=/[*?+]/;if(e)for(e=ti(e,","),N["@"]&&(h=N["@"].attributes,v=N["@"].attributesOrder),t=0,n=e.length;t<n;t++)if(i=C.exec(e[t])){if(p=i[1],c=i[2],g=i[3],s=i[5],a={attributes:d={},attributesOrder:m=[]},"#"===p&&(a.paddEmpty=!0),"-"===p&&(a.removeEmpty=!0),"!"===i[4]&&(a.removeEmptyAttrs=!0),h){for(y in h)d[y]=h[y];m.push.apply(m,v)}if(s)for(r=0,o=(s=ti(s,"|")).length;r<o;r++)if(i=x.exec(s[r])){if(u={},f=i[1],l=i[2].replace(/[\\:]:/g,":"),p=i[3],b=i[4],"!"===f&&(a.attributesRequired=a.attributesRequired||[],a.attributesRequired.push(l),u.required=!0),"-"===f){delete d[l],m.splice(ei(m,l),1);continue}p&&("="===p&&(a.attributesDefault=a.attributesDefault||[],a.attributesDefault.push({name:l,value:b}),u.defaultValue=b),":"===p&&(a.attributesForced=a.attributesForced||[],a.attributesForced.push({name:l,value:b}),u.forcedValue=b),"<"===p&&(u.validValues=Go(b,"?"))),w.test(l)?(a.attributePatterns=a.attributePatterns||[],u.pattern=S(l),a.attributePatterns.push(u)):(d[l]||m.push(l),d[l]=u)}h||"@"!==c||(h=d,v=m),g&&(a.outputName=c,N[g]=a),w.test(c)?(a.pattern=S(c),E.push(a)):N[c]=a}},b=function(e){N={},E=[],y(e),Jo(n,function(e,t){p[t]=e.children})},C=function(e){var a=/^(~)?(.+)$/;e&&(Xo.text_block_elements=Xo.block_elements=null,Jo(ti(e,","),function(e){var t=a.exec(e),n="~"===t[1],r=n?"span":"div",o=t[2];if(p[o]=p[r],g[o]=r,n||(c[o.toUpperCase()]={},c[o]={}),!N[o]){var i=N[r];delete(i=Qo({},i)).removeEmptyAttrs,delete i.removeEmpty,N[o]=i}Jo(p,function(e,t){e[r]&&(p[t]=e=Qo({},p[t]),e[o]=e[r])})}))},x=function(e){var o=/^([+\-]?)(\w+)\[([^\]]+)\]$/;Xo[i.schema]=null,e&&Jo(ti(e,","),function(e){var t,n,r=o.exec(e);r&&(n=r[1],t=n?p[r[2]]:p[r[2]]={"#comment":{}},t=p[r[2]],Jo(ti(r[3],"|"),function(e){"-"===n?delete t[e]:t[e]={}}))})},w=function(e){var t,n=N[e];if(n)return n;for(t=E.length;t--;)if((n=E[t]).pattern.test(e))return n};return i.valid_elements?b(i.valid_elements):(Jo(n,function(e,t){N[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},p[t]=e.children}),"html5"!==i.schema&&Jo(ti("strong/b em/i"),function(e){e=ti(e,"/"),N[e[1]].outputName=e[0]}),Jo(ti("ol ul sub sup blockquote span font a table tbody tr strong em b i"),function(e){N[e]&&(N[e].removeEmpty=!0)}),Jo(ti("p h1 h2 h3 h4 h5 h6 th td pre div address caption li"),function(e){N[e].paddEmpty=!0}),Jo(ti("span"),function(e){N[e].removeEmptyAttrs=!0})),C(i.custom_elements),x(i.valid_children),y(i.extended_valid_elements),x("+ol[ul|ol],+ul[ul|ol]"),Jo({dd:"dl",dt:"dl",li:"ul ol",td:"tr",th:"tr",tr:"tbody thead tfoot",tbody:"table",thead:"table",tfoot:"table",legend:"fieldset",area:"map",param:"video audio object"},function(e,t){N[t]&&(N[t].parentsRequired=ti(e))}),i.invalid_elements&&Jo(Zo(i.invalid_elements),function(e){N[e]&&delete N[e]}),w("span")||y("span[!data-mce-type|*]"),{children:p,elements:N,getValidStyles:function(){return e},getValidClasses:function(){return s},getBlockElements:function(){return c},getInvalidStyles:function(){return t},getShortEndedElements:function(){return a},getTextBlockElements:function(){return d},getTextInlineElements:function(){return m},getBoolAttrs:function(){return u},getElementRule:w,getSelfClosingElements:function(){return o},getNonEmptyElements:function(){return l},getMoveCaretBeforeOnEnterElements:function(){return f},getWhiteSpaceElements:function(){return r},getSpecialElements:function(){return h},isValidChild:function(e,t){var n=p[e.toLowerCase()];return!(!n||!n[t.toLowerCase()])},isValid:function(e,t){var n,r,o=w(e);if(o){if(!t)return!0;if(o.attributes[t])return!0;if(n=o.attributePatterns)for(r=n.length;r--;)if(n[r].pattern.test(e))return!0}return!1},getCustomElements:function(){return g},addValidElements:y,setValidElements:b,addCustomElements:C,addValidChildren:x}}var ii=function(e,t,n,r){var o=function(e){return 1<(e=parseInt(e,10).toString(16)).length?e:"0"+e};return"#"+o(t)+o(n)+o(r)};function ai(b,e){var C,t,c,l,x=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,w=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,N=/\s*([^:]+):\s*([^;]+);?/g,E=/\s+$/,S={},k="\ufeff";for(b=b||{},e&&(c=e.getValidStyles(),l=e.getInvalidStyles()),t=("\\\" \\' \\; \\: ; : "+k).split(" "),C=0;C<t.length;C++)S[t[C]]=k+C,S[k+C]=t[C];return{toHex:function(e){return e.replace(x,ii)},parse:function(e){var t,n,r,o,i,a,u,s,c={},l=b.url_converter,f=b.url_converter_scope||this,d=function(e,t,n){var r,o,i,a;if((r=c[e+"-top"+t])&&(o=c[e+"-right"+t])&&(i=c[e+"-bottom"+t])&&(a=c[e+"-left"+t])){var u=[r,o,i,a];for(C=u.length-1;C--&&u[C]===u[C+1];);-1<C&&n||(c[e+t]=-1===C?u[0]:u.join(" "),delete c[e+"-top"+t],delete c[e+"-right"+t],delete c[e+"-bottom"+t],delete c[e+"-left"+t])}},m=function(e){var t,n=c[e];if(n){for(t=(n=n.split(" ")).length;t--;)if(n[t]!==n[0])return!1;return c[e]=n[0],!0}},p=function(e){return o=!0,S[e]},g=function(e,t){return o&&(e=e.replace(/\uFEFF[0-9]/g,function(e){return S[e]})),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e},h=function(e){return String.fromCharCode(parseInt(e.slice(1),16))},v=function(e){return e.replace(/\\[0-9a-f]+/gi,h)},y=function(e,t,n,r,o,i){if(o=o||i)return"'"+(o=g(o)).replace(/\'/g,"\\'")+"'";if(t=g(t||n||r),!b.allow_script_urls){var a=t.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(a))return"";if(!b.allow_svg_data_urls&&/^data:image\/svg/i.test(a))return""}return l&&(t=l.call(f,t,"style")),"url('"+t.replace(/\'/g,"\\'")+"')"};if(e){for(e=(e=e.replace(/[\u0000-\u001F]/g,"")).replace(/\\[\"\';:\uFEFF]/g,p).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(e){return e.replace(/[;:]/g,p)});t=N.exec(e);)if(N.lastIndex=t.index+t[0].length,n=t[1].replace(E,"").toLowerCase(),r=t[2].replace(E,""),n&&r){if(n=v(n),r=v(r),-1!==n.indexOf(k)||-1!==n.indexOf('"'))continue;if(!b.allow_script_urls&&("behavior"===n||/expression\s*\(|\/\*|\*\//.test(r)))continue;"font-weight"===n&&"700"===r?r="bold":"color"!==n&&"background-color"!==n||(r=r.toLowerCase()),r=(r=r.replace(x,ii)).replace(w,y),c[n]=o?g(r,!0):r}d("border","",!0),d("border","-width"),d("border","-color"),d("border","-style"),d("padding",""),d("margin",""),i="border",u="border-style",s="border-color",m(a="border-width")&&m(u)&&m(s)&&(c[i]=c[a]+" "+c[u]+" "+c[s],delete c[a],delete c[u],delete c[s]),"medium none"===c.border&&delete c.border,"none"===c["border-image"]&&delete c["border-image"]}return c},serialize:function(i,e){var t,n,r,o,a,u="",s=function(e){var t,n,r,o;if(t=c[e])for(n=0,r=t.length;n<r;n++)e=t[n],(o=i[e])&&(u+=(0<u.length?" ":"")+e+": "+o+";")};if(e&&c)s("*"),s(e);else for(t in i)!(n=i[t])||l&&(r=t,o=e,a=void 0,(a=l["*"])&&a[r]||(a=l[o])&&a[r])||(u+=(0<u.length?" ":"")+t+": "+n+";");return u}}}var ui,si=It.each,ci=It.grep,li=ve.ie,fi=/^([a-z0-9],?)+$/i,di=/^[ \t\r\n]*$/,mi=function(n,r,o){var e={},i=r.keep_values,t={set:function(e,t,n){r.url_converter&&(t=r.url_converter.call(r.url_converter_scope||o(),t,n,e[0])),e.attr("data-mce-"+n,t).attr(n,t)},get:function(e,t){return e.attr("data-mce-"+t)||e.attr(t)}};return e={style:{set:function(e,t){null===t||"object"!=typeof t?(i&&e.attr("data-mce-style",t),e.attr("style",t)):e.css(t)},get:function(e){var t=e.attr("data-mce-style")||e.attr("style");return t=n.serialize(n.parse(t),e[0].nodeName)}}},i&&(e.href=e.src=t),e},pi=function(e,t){var n=t.attr("style"),r=e.serialize(e.parse(n),t[0].nodeName);r||(r=null),t.attr("data-mce-style",r)},gi=function(e,t){var n,r,o=0;if(e)for(n=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)r=e.nodeType,(!t||3!==r||r!==n&&e.nodeValue.length)&&(o++,n=r);return o};function hi(a,u){var s,c=this;void 0===u&&(u={});var r={},i=window,o={},t=0,e=function(m,e){var p,g=0,h={};p=(e=e||{}).maxLoadTime||5e3;var v=function(e){m.getElementsByTagName("head")[0].appendChild(e)},n=function(e,t,n){var o,r,i,a,u=function(){for(var e=a.passed,t=e.length;t--;)e[t]();a.status=2,a.passed=[],a.failed=[]},s=function(){for(var e=a.failed,t=e.length;t--;)e[t]();a.status=3,a.passed=[],a.failed=[]},c=function(e,t){e()||((new Date).getTime()-i<p?we.setTimeout(t):s())},l=function(){c(function(){for(var e,t,n=m.styleSheets,r=n.length;r--;)if((t=(e=n[r]).ownerNode?e.ownerNode:e.owningElement)&&t.id===o.id)return u(),!0},l)},f=function(){c(function(){try{var e=r.sheet.cssRules;return u(),!!e}catch(t){}},f)};if(e=It._addCacheSuffix(e),h[e]?a=h[e]:(a={passed:[],failed:[]},h[e]=a),t&&a.passed.push(t),n&&a.failed.push(n),1!==a.status)if(2!==a.status)if(3!==a.status){if(a.status=1,(o=m.createElement("link")).rel="stylesheet",o.type="text/css",o.id="u"+g++,o.async=!1,o.defer=!1,i=(new Date).getTime(),"onload"in o&&!((d=navigator.userAgent.match(/WebKit\/(\d*)/))&&parseInt(d[1],10)<536))o.onload=l,o.onerror=s;else{if(0<navigator.userAgent.indexOf("Firefox"))return(r=m.createElement("style")).textContent='@import "'+e+'"',f(),void v(r);l()}var d;v(o),o.href=e}else s();else u()},t=function(t){return Zr.nu(function(e){n(t,V.compose(e,V.constant(io.value(t))),V.compose(e,V.constant(io.error(t))))})},o=function(e){return e.fold(V.identity,V.identity)};return{load:n,loadAll:function(e,n,r){no.par(H.map(e,t)).get(function(e){var t=H.partition(e,function(e){return e.isValue()});0<t.fail.length?r(t.fail.map(o)):n(t.pass.map(o))})}}}(a),l=[],f=u.schema?u.schema:oi({}),d=ai({url_converter:u.url_converter,url_converter_scope:u.url_converter_scope},u.schema),m=u.ownEvents?new Be(u.proxy):Be.Event,n=f.getBlockElements(),p=tn.overrideDefaults(function(){return{context:a,element:q.getRoot()}}),g=function(e){if(e&&a&&"string"==typeof e){var t=a.getElementById(e);return t&&t.id!==e?a.getElementsByName(e)[1]:t}return e},h=function(e){return"string"==typeof e&&(e=g(e)),p(e)},v=function(e,t,n){var r,o,i=h(e);return i.length&&(o=(r=s[t])&&r.get?r.get(i,t):i.attr(t)),void 0===o&&(o=n||""),o},y=function(e){var t=g(e);return t?t.attributes:[]},b=function(e,t,n){var r,o;""===n&&(n=null);var i=h(e);r=i.attr(t),i.length&&((o=s[t])&&o.set?o.set(i,n,t):i.attr(t,n),r!==n&&u.onSetAttrib&&u.onSetAttrib({attrElm:i,attrName:t,attrValue:n}))},C=function(){return u.root_element||a.body},x=function(e,t){return Xr.getPos(a.body,g(e),t)},w=function(e,t,n){var r=h(e);return n?r.css(t):("float"===(t=t.replace(/-(\D)/g,function(e,t){return t.toUpperCase()}))&&(t=ve.ie&&ve.ie<12?"styleFloat":"cssFloat"),r[0]&&r[0].style?r[0].style[t]:undefined)},N=function(e){var t,n;return e=g(e),t=w(e,"width"),n=w(e,"height"),-1===t.indexOf("px")&&(t=0),-1===n.indexOf("px")&&(n=0),{w:parseInt(t,10)||e.offsetWidth||e.clientWidth,h:parseInt(n,10)||e.offsetHeight||e.clientHeight}},E=function(e,t){var n;if(!e)return!1;if(!Array.isArray(e)){if("*"===t)return 1===e.nodeType;if(fi.test(t)){var r=t.toLowerCase().split(/,/),o=e.nodeName.toLowerCase();for(n=r.length-1;0<=n;n--)if(r[n]===o)return!0;return!1}if(e.nodeType&&1!==e.nodeType)return!1}var i=Array.isArray(e)?e:[e];return 0<mt(t,i[0].ownerDocument||i[0],null,i).length},S=function(e,t,n,r){var o,i=[],a=g(e);for(r=r===undefined,n=n||("BODY"!==C().nodeName?C().parentNode:null),It.is(t,"string")&&(t="*"===(o=t)?function(e){return 1===e.nodeType}:function(e){return E(e,o)});a&&a!==n&&a.nodeType&&9!==a.nodeType;){if(!t||"function"==typeof t&&t(a)){if(!r)return[a];i.push(a)}a=a.parentNode}return r?i:null},k=function(e,t,n){var r=t;if(e)for("string"==typeof t&&(r=function(e){return E(e,t)}),e=e[n];e;e=e[n])if("function"==typeof r&&r(e))return e;return null},T=function(e,n,r){var o,t="string"==typeof e?g(e):e;if(!t)return!1;if(It.isArray(t)&&(t.length||0===t.length))return o=[],si(t,function(e,t){e&&("string"==typeof e&&(e=g(e)),o.push(n.call(r,e,t)))}),o;var i=r||c;return n.call(i,t)},A=function(e,t){h(e).each(function(e,n){si(t,function(e,t){b(n,t,e)})})},R=function(e,r){var t=h(e);li?t.each(function(e,t){if(!1!==t.canHaveHTML){for(;t.firstChild;)t.removeChild(t.firstChild);try{t.innerHTML="<br>"+r,t.removeChild(t.firstChild)}catch(n){tn("<div></div>").html("<br>"+r).contents().slice(1).appendTo(t)}return r}}):t.html(r)},_=function(e,n,r,o,i){return T(e,function(e){var t="string"==typeof n?a.createElement(n):n;return A(t,r),o&&("string"!=typeof o&&o.nodeType?t.appendChild(o):"string"==typeof o&&R(t,o)),i?t:e.appendChild(t)})},B=function(e,t,n){return _(a.createElement(e),e,t,n,!0)},D=Ko.decode,O=Ko.encodeAllRaw,P=function(e,t){var n=h(e);return t?n.each(function(){for(var e;e=this.firstChild;)3===e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}).remove():n.remove(),1<n.length?n.toArray():n[0]},L=function(e,t,n){h(e).toggleClass(t,n).each(function(){""===this.className&&tn(this).attr("class",null)})},I=function(t,e,n){return T(e,function(e){return It.is(e,"array")&&(t=t.cloneNode(!0)),n&&si(ci(e.childNodes),function(e){t.appendChild(e)}),e.parentNode.replaceChild(t,e)})},M=function(){return a.createRange()},F=function(e,t,n,r){if(It.isArray(e)){for(var o=e.length;o--;)e[o]=F(e[o],t,n,r);return e}return!u.collect||e!==a&&e!==i||l.push([e,t,n,r]),m.bind(e,t,n,r||q)},z=function(e,t,n){var r;if(It.isArray(e)){for(r=e.length;r--;)e[r]=z(e[r],t,n);return e}if(l&&(e===a||e===i))for(r=l.length;r--;){var o=l[r];e!==o[0]||t&&t!==o[1]||n&&n!==o[2]||m.unbind(o[0],o[1],o[2])}return m.unbind(e,t,n)},U=function(e){if(e&&Oo.isElement(e)){var t=e.getAttribute("data-mce-contenteditable");return t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null}return null},q={doc:a,settings:u,win:i,files:o,stdMode:!0,boxModel:!0,styleSheetLoader:e,boundEvents:l,styles:d,schema:f,events:m,isBlock:function(e){if("string"==typeof e)return!!n[e];if(e){var t=e.nodeType;if(t)return!(1!==t||!n[e.nodeName])}return!1},$:p,$$:h,root:null,clone:function(t,e){if(!li||1!==t.nodeType||e)return t.cloneNode(e);if(!e){var n=a.createElement(t.nodeName);return si(y(t),function(e){b(n,e.nodeName,v(t,e.nodeName))}),n}return null},getRoot:C,getViewPort:function(e){var t=e||i,n=t.document,r=n.documentElement;return{x:t.pageXOffset||r.scrollLeft,y:t.pageYOffset||r.scrollTop,w:t.innerWidth||r.clientWidth,h:t.innerHeight||r.clientHeight}},getRect:function(e){var t,n;return e=g(e),t=x(e),n=N(e),{x:t.x,y:t.y,w:n.w,h:n.h}},getSize:N,getParent:function(e,t,n){var r=S(e,t,n,!1);return r&&0<r.length?r[0]:null},getParents:S,get:g,getNext:function(e,t){return k(e,t,"nextSibling")},getPrev:function(e,t){return k(e,t,"previousSibling")},select:function(e,t){return mt(e,g(t)||u.root_element||a,[])},is:E,add:_,create:B,createHTML:function(e,t,n){var r,o="";for(r in o+="<"+e,t)t.hasOwnProperty(r)&&null!==t[r]&&"undefined"!=typeof t[r]&&(o+=" "+r+'="'+O(t[r])+'"');return void 0!==n?o+">"+n+"</"+e+">":o+" />"},createFragment:function(e){var t,n=a.createElement("div"),r=a.createDocumentFragment();for(e&&(n.innerHTML=e);t=n.firstChild;)r.appendChild(t);return r},remove:P,setStyle:function(e,t,n){var r=h(e).css(t,n);u.update_styles&&pi(d,r)},getStyle:w,setStyles:function(e,t){var n=h(e).css(t);u.update_styles&&pi(d,n)},removeAllAttribs:function(e){return T(e,function(e){var t,n=e.attributes;for(t=n.length-1;0<=t;t--)e.removeAttributeNode(n.item(t))})},setAttrib:b,setAttribs:A,getAttrib:v,getPos:x,parseStyle:function(e){return d.parse(e)},serializeStyle:function(e,t){return d.serialize(e,t)},addStyle:function(e){var t,n;if(q!==hi.DOM&&a===document){if(r[e])return;r[e]=!0}(n=a.getElementById("mceDefaultStyles"))||((n=a.createElement("style")).id="mceDefaultStyles",n.type="text/css",(t=a.getElementsByTagName("head")[0]).firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)),n.styleSheet?n.styleSheet.cssText+=e:n.appendChild(a.createTextNode(e))},loadCSS:function(e){var n;q===hi.DOM||a!==document?(e||(e=""),n=a.getElementsByTagName("head")[0],si(e.split(","),function(e){var t;e=It._addCacheSuffix(e),o[e]||(o[e]=!0,t=B("link",{rel:"stylesheet",href:e}),n.appendChild(t))})):hi.DOM.loadCSS(e)},addClass:function(e,t){h(e).addClass(t)},removeClass:function(e,t){L(e,t,!1)},hasClass:function(e,t){return h(e).hasClass(t)},toggleClass:L,show:function(e){h(e).show()},hide:function(e){h(e).hide()},isHidden:function(e){return"none"===h(e).css("display")},uniqueId:function(e){return(e||"mce_")+t++},setHTML:R,getOuterHTML:function(e){var t="string"==typeof e?g(e):e;return Oo.isElement(t)?t.outerHTML:tn("<div></div>").append(tn(t).clone()).html()},setOuterHTML:function(e,t){h(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}P(tn(this).html(t),!0)})},decode:D,encode:O,insertAfter:function(e,t){var r=g(t);return T(e,function(e){var t,n;return t=r.parentNode,(n=r.nextSibling)?t.insertBefore(e,n):t.appendChild(e),e})},replace:I,rename:function(t,e){var n;return t.nodeName!==e.toUpperCase()&&(n=B(e),si(y(t),function(e){b(n,e.nodeName,v(t,e.nodeName))}),I(n,t,!0)),n||t},findCommonAncestor:function(e,t){for(var n,r=e;r;){for(n=t;n&&r!==n;)n=n.parentNode;if(r===n)break;r=r.parentNode}return!r&&e.ownerDocument?e.ownerDocument.documentElement:r},toHex:function(e){return d.toHex(It.trim(e))},run:T,getAttribs:y,isEmpty:function(e,t){var n,r,o,i,a,u,s=0;if(e=e.firstChild){a=new ao(e,e.parentNode),t=t||(f?f.getNonEmptyElements():null),i=f?f.getWhiteSpaceElements():{};do{if(o=e.nodeType,Oo.isElement(e)){var c=e.getAttribute("data-mce-bogus");if(c){e=a.next("all"===c);continue}if(u=e.nodeName.toLowerCase(),t&&t[u]){if("br"===u){s++,e=a.next();continue}return!1}for(n=(r=y(e)).length;n--;)if("name"===(u=r[n].nodeName)||"data-mce-bookmark"===u)return!1}if(8===o)return!1;if(3===o&&!di.test(e.nodeValue))return!1;if(3===o&&e.parentNode&&i[e.parentNode.nodeName]&&di.test(e.nodeValue))return!1;e=a.next()}while(e)}return s<=1},createRng:M,nodeIndex:gi,split:function(e,t,n){var r,o,i,a=M();if(e&&t)return a.setStart(e.parentNode,gi(e)),a.setEnd(t.parentNode,gi(t)),r=a.extractContents(),(a=M()).setStart(t.parentNode,gi(t)+1),a.setEnd(e.parentNode,gi(e)+1),o=a.extractContents(),(i=e.parentNode).insertBefore(Io.trimNode(q,r),e),n?i.insertBefore(n,e):i.insertBefore(t,e),i.insertBefore(Io.trimNode(q,o),e),P(e),n||t},bind:F,unbind:z,fire:function(e,t,n){return m.fire(e,t,n)},getContentEditable:U,getContentEditableParent:function(e){for(var t=C(),n=null;e&&e!==t&&null===(n=U(e));e=e.parentNode);return n},destroy:function(){if(l)for(var e=l.length;e--;){var t=l[e];m.unbind(t[0],t[1],t[2])}mt.setDocument&&mt.setDocument()},isChildOf:function(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset}};return s=mi(d,u,function(){return q}),q}(ui=hi||(hi={})).DOM=ui(document),ui.nodeIndex=gi;var vi=hi,yi=vi.DOM,bi=It.each,Ci=It.grep,xi=function(e){return"function"==typeof e},wi=function(){var f={},o=[],i={},a=[],d=0;this.isDone=function(e){return 2===f[e]},this.markDone=function(e){f[e]=2},this.add=this.load=function(e,t,n,r){f[e]===undefined&&(o.push(e),f[e]=0),t&&(i[e]||(i[e]=[]),i[e].push({success:t,failure:r,scope:n||this}))},this.remove=function(e){delete f[e],delete i[e]},this.loadQueue=function(e,t,n){this.loadScripts(o,e,t,n)},this.loadScripts=function(n,e,t,r){var s,c=[],l=function(t,e){bi(i[e],function(e){xi(e[t])&&e[t].call(e.scope)}),i[e]=undefined};a.push({success:e,failure:r,scope:t||this}),(s=function(){var e=Ci(n);if(n.length=0,bi(e,function(e){var t,n,r,o,i,a,u;2!==f[e]?3!==f[e]?1!==f[e]&&(f[e]=1,d++,t=e,n=function(){f[e]=2,d--,l("success",e),s()},r=function(){f[e]=3,d--,c.push(e),l("failure",e),s()},u=function(){a.remove(i),o&&(o.onreadystatechange=o.onload=o=null),n()},i=(a=yi).uniqueId(),(o=document.createElement("script")).id=i,o.type="text/javascript",o.src=It._addCacheSuffix(t),"onreadystatechange"in o?o.onreadystatechange=function(){/loaded|complete/.test(o.readyState)&&u()}:o.onload=u,o.onerror=function(){xi(r)?r():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+t)},(document.getElementsByTagName("head")[0]||document.body).appendChild(o)):l("failure",e):l("success",e)}),!d){var t=a.slice(0);a.length=0,bi(t,function(e){0===c.length?xi(e.success)&&e.success.call(e.scope):xi(e.failure)&&e.failure.call(e.scope,c)})}})()}};wi.ScriptLoader=new wi;var Ni,Ei=It.each;function Si(){var r=this,o=[],a={},u={},i=[],s=function(e){var t;return u[e]&&(t=u[e].dependencies),t||[]},c=function(e,t){return"object"==typeof t?t:"string"==typeof e?{prefix:"",resource:t,suffix:""}:{prefix:e.prefix,resource:t,suffix:e.suffix}},l=function(n,e,t){var r=s(name);Ei(r,function(e){var t=c(n,e);f(t.resource,t,undefined,undefined)}),e&&(t?e.call(t):e.call(wi))},f=function(e,t,n,r,o){if(!a[e]){var i="string"==typeof t?t:t.prefix+t.resource+t.suffix;0!==i.indexOf("/")&&-1===i.indexOf("://")&&(i=Si.baseURL+"/"+i),a[e]=i.substring(0,i.lastIndexOf("/")),u[e]?l(t,n,r):wi.ScriptLoader.add(i,function(){return l(t,n,r)},r,o)}};return{items:o,urls:a,lookup:u,_listeners:i,get:function(e){return u[e]?u[e].instance:undefined},dependencies:s,requireLangPack:function(e,t){var n=Si.language;if(n&&!1!==Si.languageLoad){if(t)if(-1!==(t=","+t+",").indexOf(","+n.substr(0,2)+","))n=n.substr(0,2);else if(-1===t.indexOf(","+n+","))return;wi.ScriptLoader.add(a[e]+"/langs/"+n+".js")}},add:function(t,e,n){o.push(e),u[t]={instance:e,dependencies:n};var r=H.partition(i,function(e){return e.name===t});return i=r.fail,Ei(r.pass,function(e){e.callback()}),e},remove:function(e){delete a[e],delete u[e]},createUrl:c,addComponents:function(e,t){var n=r.urls[e];Ei(t,function(e){wi.ScriptLoader.add(n+"/"+e)})},load:f,waitFor:function(e,t){u.hasOwnProperty(e)?t():i.push({name:e,callback:t})}}}(Ni=Si||(Si={})).PluginManager=Ni(),Ni.ThemeManager=Ni();var ki,Ti="\ufeff",Ai=function(e){return e===Ti},Ri=Ti,_i=function(e){return e.replace(new RegExp(Ti,"g"),"")},Bi=Oo.isElement,Di=Oo.isText,Oi=function(e){return Di(e)&&(e=e.parentNode),Bi(e)&&e.hasAttribute("data-mce-caret")},Pi=function(e){return Di(e)&&Ai(e.data)},Li=function(e){return Oi(e)||Pi(e)},Ii=function(e){return e.firstChild!==e.lastChild||!Oo.isBr(e.firstChild)},Mi=function(e){var t=e.container();return e&&Oo.isText(t)&&t.data.charAt(e.offset())===Ri},Fi=function(e){var t=e.container();return e&&Oo.isText(t)&&t.data.charAt(e.offset()-1)===Ri},zi=function(e,t,n){var r,o,i;return(r=t.ownerDocument.createElement(e)).setAttribute("data-mce-caret",n?"before":"after"),r.setAttribute("data-mce-bogus","all"),r.appendChild(((i=document.createElement("br")).setAttribute("data-mce-bogus","1"),i)),o=t.parentNode,n?o.insertBefore(r,t):t.nextSibling?o.insertBefore(r,t.nextSibling):o.appendChild(r),r},Ui=function(e){return Di(e)&&e.data[0]===Ri},qi=function(e){return Di(e)&&e.data[e.data.length-1]===Ri},Vi=function(e){return e&&e.hasAttribute("data-mce-caret")?(t=e.getElementsByTagName("br"),n=t[t.length-1],Oo.isBogus(n)&&n.parentNode.removeChild(n),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("_moz_abspos"),e):null;var t,n},Hi=Oo.isContentEditableTrue,ji=Oo.isContentEditableFalse,$i=Oo.isBr,Wi=Oo.isText,Ki=Oo.matchNodeNames("script style textarea"),Xi=Oo.matchNodeNames("img input textarea hr iframe video audio object"),Yi=Oo.matchNodeNames("table"),Gi=Li,Ji=function(e){return!Gi(e)&&(Wi(e)?!Ki(e.parentNode):Xi(e)||$i(e)||Yi(e)||Qi(e))},Qi=function(e){return!1===(t=e,Oo.isElement(t)&&"true"===t.getAttribute("unselectable"))&&ji(e);var t},Zi=function(e,t){return Ji(e)&&function(e,t){for(e=e.parentNode;e&&e!==t;e=e.parentNode){if(Qi(e))return!1;if(Hi(e))return!0}return!0}(e,t)},ea=Math.round,ta=function(e){return e?{left:ea(e.left),top:ea(e.top),bottom:ea(e.bottom),right:ea(e.right),width:ea(e.width),height:ea(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0}},na=function(e,t){return e=ta(e),t||(e.left=e.left+e.width),e.right=e.left,e.width=0,e},ra=function(e,t,n){return 0<=e&&e<=Math.min(t.height,n.height)/2},oa=function(e,t){return e.bottom-e.height/2<t.top||!(e.top>t.bottom)&&ra(t.top-e.bottom,e,t)},ia=function(e,t){return e.top>t.bottom||!(e.bottom<t.top)&&ra(t.bottom-e.top,e,t)},aa=function(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null},ua=function(e,t){return 1===e.nodeType&&e.hasChildNodes()&&(t>=e.childNodes.length&&(t=e.childNodes.length-1),e=e.childNodes[t]),e},sa=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]"),ca=function(e){return"string"==typeof e&&768<=e.charCodeAt(0)&&sa.test(e)},la=[].slice,fa=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=la.call(arguments);return r.length-1>=e.length?e.apply(this,r.slice(1)):function(){var e=r.concat([].slice.call(arguments));return fa.apply(this,e)}},da={constant:function(e){return function(){return e}},negate:function(t){return function(e){return!t(e)}},and:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=la.call(arguments);return function(e){for(var t=0;t<n.length;t++)if(!n[t](e))return!1;return!0}},or:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=la.call(arguments);return function(e){for(var t=0;t<n.length;t++)if(n[t](e))return!0;return!1}},curry:fa,compose:function(t,n){return function(e){return t(n(e))}},noop:function(){}},ma=function(e,t){for(var n=[],r=0;r<e.length;r++){var o=e[r];if(!o.isSome())return A.none();n.push(o.getOrDie())}return A.some(t.apply(null,n))},pa=Oo.isElement,ga=Ji,ha=Oo.matchStyleValues("display","block table"),va=Oo.matchStyleValues("float","left right"),ya=da.and(pa,ga,da.negate(va)),ba=da.negate(Oo.matchStyleValues("white-space","pre pre-line pre-wrap")),Ca=Oo.isText,xa=Oo.isBr,wa=vi.nodeIndex,Na=ua,Ea=function(e){return"createRange"in e?e.createRange():vi.DOM.createRng()},Sa=function(e){return e&&/[\r\n\t ]/.test(e)},ka=function(e){return!!e.setStart&&!!e.setEnd},Ta=function(e){var t,n=e.startContainer,r=e.startOffset;return!!(Sa(e.toString())&&ba(n.parentNode)&&Oo.isText(n)&&(t=n.data,Sa(t[r-1])||Sa(t[r+1])))},Aa=function(e){return 0===e.left&&0===e.right&&0===e.top&&0===e.bottom},Ra=function(e){var t,n,r,o,i,a,u,s;return t=0<(n=e.getClientRects()).length?ta(n[0]):ta(e.getBoundingClientRect()),!ka(e)&&xa(e)&&Aa(t)?(i=(r=e).ownerDocument,a=Ea(i),u=i.createTextNode("\xa0"),(s=r.parentNode).insertBefore(u,r),a.setStart(u,0),a.setEnd(u,1),o=ta(a.getBoundingClientRect()),s.removeChild(u),o):Aa(t)&&ka(e)?function(e){var t=e.startContainer,n=e.endContainer,r=e.startOffset,o=e.endOffset;if(t===n&&Oo.isText(n)&&0===r&&1===o){var i=e.cloneRange();return i.setEndAfter(n),Ra(i)}return null}(e):t},_a=function(e,t){var n=na(e,t);return n.width=1,n.right=n.left+1,n},Ba=function(e){var t,n,r=[],o=function(e){var t,n;0!==e.height&&(0<r.length&&(t=e,n=r[r.length-1],t.left===n.left&&t.top===n.top&&t.bottom===n.bottom&&t.right===n.right)||r.push(e))},i=function(e,t){var n=Ea(e.ownerDocument);if(t<e.data.length){if(ca(e.data[t]))return r;if(ca(e.data[t-1])&&(n.setStart(e,t),n.setEnd(e,t+1),!Ta(n)))return o(_a(Ra(n),!1)),r}0<t&&(n.setStart(e,t-1),n.setEnd(e,t),Ta(n)||o(_a(Ra(n),!1))),t<e.data.length&&(n.setStart(e,t),n.setEnd(e,t+1),Ta(n)||o(_a(Ra(n),!0)))};if(Ca(e.container()))return i(e.container(),e.offset()),r;if(pa(e.container()))if(e.isAtEnd())n=Na(e.container(),e.offset()),Ca(n)&&i(n,n.data.length),ya(n)&&!xa(n)&&o(_a(Ra(n),!1));else{if(n=Na(e.container(),e.offset()),Ca(n)&&i(n,0),ya(n)&&e.isAtEnd())return o(_a(Ra(n),!1)),r;t=Na(e.container(),e.offset()-1),ya(t)&&!xa(t)&&(ha(t)||ha(n)||!ya(n))&&o(_a(Ra(t),!1)),ya(n)&&o(_a(Ra(n),!0))}return r};function Da(t,n,e){var r=function(){return e||(e=Ba(Da(t,n))),e};return{container:da.constant(t),offset:da.constant(n),toRange:function(){var e;return(e=Ea(t.ownerDocument)).setStart(t,n),e.setEnd(t,n),e},getClientRects:r,isVisible:function(){return 0<r().length},isAtStart:function(){return Ca(t),0===n},isAtEnd:function(){return Ca(t)?n>=t.data.length:n>=t.childNodes.length},isEqual:function(e){return e&&t===e.container()&&n===e.offset()},getNode:function(e){return Na(t,e?n-1:n)}}}(ki=Da||(Da={})).fromRangeStart=function(e){return ki(e.startContainer,e.startOffset)},ki.fromRangeEnd=function(e){return ki(e.endContainer,e.endOffset)},ki.after=function(e){return ki(e.parentNode,wa(e)+1)},ki.before=function(e){return ki(e.parentNode,wa(e))},ki.isAbove=function(e,t){return ma([H.head(t.getClientRects()),H.last(e.getClientRects())],oa).getOr(!1)},ki.isBelow=function(e,t){return ma([H.last(t.getClientRects()),H.head(e.getClientRects())],ia).getOr(!1)},ki.isAtStart=function(e){return!!e&&e.isAtStart()},ki.isAtEnd=function(e){return!!e&&e.isAtEnd()},ki.isTextPosition=function(e){return!!e&&Oo.isText(e.container())},ki.isElementPosition=function(e){return!1===ki.isTextPosition(e)};var Oa,Pa,La=Da,Ia=Oo.isElement,Ma=Oo.isText,Fa=function(e){var t=e.parentNode;t&&t.removeChild(e)},za=function(e,t){0===t.length?Fa(e):e.nodeValue=t},Ua=function(e){var t=_i(e);return{count:e.length-t.length,text:t}},qa=function(e,t){return ja(e),t},Va=function(e,t){return Ma(e)&&t.container()===e?(r=t,o=Ua((n=e).data.substr(0,r.offset())),i=Ua(n.data.substr(r.offset())),0<(a=o.text+i.text).length?(za(n,a),La(n,r.offset()-o.count)):r):qa(e,t);var n,r,o,i,a},Ha=function(e,t){return t.container()===e.parentNode?(n=e,o=(r=t).container(),i=H.indexOf(H.from(o.childNodes),n).map(function(e){return e<r.offset()?La(o,r.offset()-1):r}).getOr(r),ja(n),i):qa(e,t);var n,r,o,i},ja=function(e){if(Ia(e)&&Li(e)&&(Ii(e)?e.removeAttribute("data-mce-caret"):Fa(e)),Ma(e)){var t=_i(function(e){try{return e.nodeValue}catch(t){return""}}(e));za(e,t)}},$a={removeAndReposition:function(e,t){return La.isTextPosition(t)?Va(e,t):Ha(e,t)},remove:ja},Wa=function(e){return La.isTextPosition(e)?0===e.offset():Ji(e.getNode())},Ka=function(e){if(La.isTextPosition(e)){var t=e.container();return e.offset()===t.data.length}return Ji(e.getNode(!0))},Xa=function(e,t){return!La.isTextPosition(e)&&!La.isTextPosition(t)&&e.getNode()===t.getNode(!0)},Ya=function(e,t,n){return e?!Xa(t,n)&&(r=t,!(!La.isTextPosition(r)&&Oo.isBr(r.getNode())))&&Ka(t)&&Wa(n):!Xa(n,t)&&Wa(t)&&Ka(n);var r},Ga=function(e,t,n){var r=Ys(t);return A.from(e?r.next(n):r.prev(n))},Ja=function(e,t){var n,r,o,i,a,u=e?t.firstChild:t.lastChild;return Oo.isText(u)?A.some(La(u,e?0:u.data.length)):u?Ji(u)?A.some(e?La.before(u):(a=u,Oo.isBr(a)?La.before(a):La.after(a))):(r=t,o=u,i=(n=e)?La.before(o):La.after(o),Ga(n,r,i)):A.none()},Qa={fromPosition:Ga,nextPosition:V.curry(Ga,!0),prevPosition:V.curry(Ga,!1),navigate:function(t,n,r){return Ga(t,n,r).bind(function(e){return bs(r,e,n)&&Ya(t,r,e)?Ga(t,n,e):A.some(e)})},positionIn:Ja,firstPositionIn:V.curry(Ja,!0),lastPositionIn:V.curry(Ja,!1)},Za=Oo.isContentEditableTrue,eu=Oo.isContentEditableFalse,tu=function(e,t,n,r,o){return t._selectionOverrides.showCaret(e,n,r,o)},nu=function(e,t){var n,r;return e.fire("BeforeObjectSelected",{target:t}).isDefaultPrevented()?null:((r=(n=t).ownerDocument.createRange()).selectNode(n),r)},ru=function(e,t,n){var r=Ss(1,e.getBody(),t),o=La.fromRangeStart(r),i=o.getNode();if(eu(i))return tu(1,e,i,!o.isAtEnd(),!1);var a=o.getNode(!0);if(eu(a))return tu(1,e,a,!1,!1);var u=e.dom.getParent(o.getNode(),function(e){return eu(e)||Za(e)});return eu(u)?tu(1,e,u,!1,n):null},ou=function(e,t,n){if(!t||!t.collapsed)return t;var r=ru(e,t,n);return r||t};(Pa=Oa||(Oa={}))[Pa.Br=0]="Br",Pa[Pa.Block=1]="Block",Pa[Pa.Wrap=2]="Wrap",Pa[Pa.Eol=3]="Eol";var iu,au,uu=function(e,t){return e===iu.Backwards?t.reverse():t},su=function(e,t,n,r){for(var o,i,a,u,s,c,l=Ys(n),f=r,d=[];f&&(s=l,c=f,o=t===iu.Forwards?s.next(c):s.prev(c));){if(Oo.isBr(o.getNode(!1)))return t===iu.Forwards?{positions:uu(t,d).concat([o]),breakType:Oa.Br,breakAt:A.some(o)}:{positions:uu(t,d),breakType:Oa.Br,breakAt:A.some(o)};if(o.isVisible()){if(e(f,o)){var m=(i=t,a=f,u=o,Oo.isBr(u.getNode(i===iu.Forwards))?Oa.Br:!1===bs(a,u)?Oa.Block:Oa.Wrap);return{positions:uu(t,d),breakType:m,breakAt:A.some(o)}}d.push(o),f=o}else f=o}return{positions:uu(t,d),breakType:Oa.Eol,breakAt:A.none()}},cu=function(n,r,o,e){return r(o,e).breakAt.map(function(e){var t=r(o,e).positions;return n===iu.Backwards?t.concat(e):[e].concat(t)}).getOr([])},lu=function(e,i){return H.foldl(e,function(e,o){return e.fold(function(){return A.some(o)},function(r){return ma([H.head(r.getClientRects()),H.head(o.getClientRects())],function(e,t){var n=Math.abs(i-e.left);return Math.abs(i-t.left)<=n?o:r}).or(e)})},A.none())},fu=function(t,e){return H.head(e.getClientRects()).bind(function(e){return lu(t,e.left)})},du=V.curry(su,Da.isAbove,-1),mu=V.curry(su,Da.isBelow,1),pu=V.curry(cu,-1,du),gu=V.curry(cu,1,mu),hu=function(e,t){return Pr.all(t,e)},vu=function(e,t,n,r,o){var i,a,u,s,c,l=hu(Vn.fromDom(n),"td,th").map(function(e){return e.dom()}),f=H.filter((i=e,a=l,H.bind(a,function(e){var t,n,r=(t=e.getBoundingClientRect(),n=-1,{left:t.left-n,top:t.top-n,right:t.right+2*n,bottom:t.bottom+2*n,width:t.width+n,height:t.height+n});return[{x:r.left,y:i(r),cell:e},{x:r.right,y:i(r),cell:e}]})),function(e){return t(e,o)});return(u=f,s=r,c=o,H.foldl(u,function(e,r){return e.fold(function(){return A.some(r)},function(e){var t=Math.sqrt(Math.abs(e.x-s)+Math.abs(e.y-c)),n=Math.sqrt(Math.abs(r.x-s)+Math.abs(r.y-c));return A.some(n<t?r:e)})},A.none())).map(function(e){return e.cell})},yu=V.curry(vu,function(e){return e.bottom},function(e,t){return e.y<t}),bu=V.curry(vu,function(e){return e.top},function(e,t){return e.y>t}),Cu=function(t,n){return H.head(n.getClientRects()).bind(function(e){return yu(t,e.left,e.top)}).bind(function(e){return fu((t=e,Qa.lastPositionIn(t).map(function(e){return du(t,e).positions.concat(e)}).getOr([])),n);var t})},xu=function(t,n){return H.last(n.getClientRects()).bind(function(e){return bu(t,e.left,e.top)}).bind(function(e){return fu((t=e,Qa.firstPositionIn(t).map(function(e){return[e].concat(mu(t,e).positions)}).getOr([])),n);var t})},wu=function(e){for(var t=0,n=0,r=e;r&&r.nodeType;)t+=r.offsetLeft||0,n+=r.offsetTop||0,r=r.offsetParent;return{x:t,y:n}},Nu=function(e,t,n){var r,o,i,a,u,s=e.dom,c=s.getRoot(),l=0;if(u={elm:t,alignToTop:n},e.fire("scrollIntoView",u),!u.isDefaultPrevented()&&Oo.isElement(t)){if(!1===n&&(l=t.offsetHeight),"BODY"!==c.nodeName){var f=e.selection.getScrollContainer();if(f)return r=wu(t).y-wu(f).y+l,a=f.clientHeight,void((r<(i=f.scrollTop)||i+a<r+25)&&(f.scrollTop=r<i?r:r-a+25))}o=s.getViewPort(e.getWin()),r=s.getPos(t).y+l,i=o.y,a=o.h,(r<o.y||i+a<r+25)&&e.getWin().scrollTo(0,r<i?r:r-a+25)}},Eu=function(d,e){H.head(Da.fromRangeStart(e).getClientRects()).each(function(e){var t,n,r,o,i,a,u,s,c,l=function(e){if(e.inline)return e.getBody().getBoundingClientRect();var t=e.getWin();return{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight,width:t.innerWidth,height:t.innerHeight}}(d),f={x:(i=t=l,a=n=e,a.left>i.left&&a.right<i.right?0:a.left<i.left?a.left-i.left:a.right-i.right),y:(r=t,o=n,o.top>r.top&&o.bottom<r.bottom?0:o.top<r.top?o.top-r.top:o.bottom-r.bottom)};s=0!==f.x?0<f.x?f.x+4:f.x-4:0,c=0!==f.y?0<f.y?f.y+4:f.y-4:0,(u=d).inline?(u.getBody().scrollLeft+=s,u.getBody().scrollTop+=c):u.getWin().scrollBy(s,c)})},Su=function(e,t,n){var r=e.getParam(t,n);if(-1!==r.indexOf("=")){var o=e.getParam(t,"","hash");return o.hasOwnProperty(e.id)?o[e.id]:n}return r},ku=function(e){return e.getParam("iframe_attrs",{})},Tu=function(e){return e.getParam("doctype","<!DOCTYPE html>")},Au=function(e){return e.getParam("document_base_url","")},Ru=function(e){return Su(e,"body_id","tinymce")},_u=function(e){return Su(e,"body_class","")},Bu=function(e){return e.getParam("content_security_policy","")},Du=function(e){return e.getParam("br_in_pre",!0)},Ou=function(e){if(e.getParam("force_p_newlines",!1))return"p";var t=e.getParam("forced_root_block","p");return!1===t?"":t},Pu=function(e){return e.getParam("forced_root_block_attrs",{})},Lu=function(e){return e.getParam("br_newline_selector",".mce-toc h2,figcaption,caption")},Iu=function(e){return e.getParam("no_newline_selector","")},Mu=function(e){return e.getParam("keep_styles",!0)},Fu=function(e){return e.getParam("end_container_on_empty_block",!1)},zu=function(e){return It.explode(e.getParam("font_size_style_values",""))},Uu=function(e){return It.explode(e.getParam("font_size_classes",""))},qu=function(t,n){$r.parent(t).each(function(e){e.dom().insertBefore(n.dom(),t.dom())})},Vu=function(e,t){e.dom().appendChild(t.dom())},Hu={before:qu,after:function(e,t){$r.nextSibling(e).fold(function(){$r.parent(e).each(function(e){Vu(e,t)})},function(e){qu(e,t)})},prepend:function(t,n){$r.firstChild(t).fold(function(){Vu(t,n)},function(e){t.dom().insertBefore(n.dom(),e.dom())})},append:Vu,appendAt:function(e,t,n){$r.child(e,n).fold(function(){Vu(e,t)},function(e){qu(e,t)})},wrap:function(e,t){qu(e,t),Vu(t,e)}},ju=Un.detect().browser,$u=function(){return ju.isIE()||ju.isEdge()||ju.isFirefox()},Wu=function(e,t){e.selection.setRng(t),Eu(e,t)},Ku=function(t,n,e){var r=t(n,e);return r.breakType===Oa.Wrap&&0===r.positions.length?r.breakAt.map(function(e){return t(n,e).breakAt.isNone()}).getOr(!0):r.breakAt.isNone()},Xu=da.curry(Ku,du),Yu=da.curry(Ku,mu),Gu=function(e,t,n,r){var o,i,a,u,s=e.selection.getRng(),c=t?1:-1;if($u()&&(o=t,i=s,a=n,u=La.fromRangeStart(i),Qa.positionIn(!o,a).map(function(e){return e.isEqual(u)}).getOr(!1))){var l=tu(c,e,n,!t,!0);return Wu(e,l),!0}return!1},Ju=function(e,t){var n=t.getNode(e);return Oo.isElement(n)&&"TABLE"===n.nodeName?A.some(n):A.none()},Qu=function(u,s,c){var e=Ju(!!s,c),t=!1===s;e.fold(function(){return Wu(u,c.toRange())},function(a){return Qa.positionIn(t,u.getBody()).filter(function(e){return e.isEqual(c)}).fold(function(){return Wu(u,c.toRange())},function(e){return n=s,o=a,t=c,void((i=Ou(r=u))?r.undoManager.transact(function(){var e=Vn.fromTag(i);lr.setAll(e,Pu(r)),Hu.append(e,Vn.fromTag("br")),n?Hu.after(Vn.fromDom(o),e):Hu.before(Vn.fromDom(o),e);var t=r.dom.createRng();t.setStart(e.dom(),0),t.setEnd(e.dom(),0),Wu(r,t)}):Wu(r,t.toRange()));var n,r,o,t,i})})},Zu=function(e,t,n,r){var o,i,a,u,s,c,l=e.selection.getRng(),f=La.fromRangeStart(l),d=e.getBody();if(!t&&Xu(r,f)){var m=(u=d,Cu(s=n,c=f).orThunk(function(){return H.head(c.getClientRects()).bind(function(e){return lu(pu(u,La.before(s)),e.left)})}).getOr(La.before(s)));return Qu(e,t,m),!0}return!(!t||!Yu(r,f))&&(o=d,m=xu(i=n,a=f).orThunk(function(){return H.head(a.getClientRects()).bind(function(e){return lu(gu(o,La.after(i)),e.left)})}).getOr(La.after(i)),Qu(e,t,m),!0)},es=function(t,n){return function(){return A.from(t.dom.getParent(t.selection.getNode(),"td,th")).bind(function(e){return A.from(t.dom.getParent(e,"table")).map(function(e){return Gu(t,n,e)})}).getOr(!1)}},ts=function(n,r){return function(){return A.from(n.dom.getParent(n.selection.getNode(),"td,th")).bind(function(t){return A.from(n.dom.getParent(t,"table")).map(function(e){return Zu(n,r,e,t)})}).getOr(!1)}},ns=function(e){var t=e,n=function(){return t};return{get:n,set:function(e){t=e},clone:function(){return ns(n())}}},rs=Oo.isContentEditableFalse,os=function(e,t,n){var r,o,i,a,u,s=na(t.getBoundingClientRect(),n);return"BODY"===e.tagName?(r=e.ownerDocument.documentElement,o=e.scrollLeft||r.scrollLeft,i=e.scrollTop||r.scrollTop):(u=e.getBoundingClientRect(),o=e.scrollLeft-u.left,i=e.scrollTop-u.top),s.left+=o,s.right+=o,s.top+=i,s.bottom+=i,s.width=1,0<(a=t.offsetWidth-t.clientWidth)&&(n&&(a*=-1),s.left+=a,s.right+=a),s},is=function(a,u,e){var t,s,c=ns(A.none()),l=function(){!function(e){var t,n,r,o,i;for(t=tn("*[contentEditable=false]",e),o=0;o<t.length;o++)r=(n=t[o]).previousSibling,qi(r)&&(1===(i=r.data).length?r.parentNode.removeChild(r):r.deleteData(i.length-1,1)),r=n.nextSibling,Ui(r)&&(1===(i=r.data).length?r.parentNode.removeChild(r):r.deleteData(0,1))}(a),s&&($a.remove(s),s=null),c.get().each(function(e){tn(e.caret).remove(),c.set(A.none())}),clearInterval(t)},f=function(){t=we.setInterval(function(){e()?tn("div.mce-visual-caret",a).toggleClass("mce-visual-caret-hidden"):tn("div.mce-visual-caret",a).addClass("mce-visual-caret-hidden")},500)};return{show:function(t,e){var n,r,o;if(l(),o=e,Oo.isElement(o)&&/^(TD|TH)$/i.test(o.tagName))return null;if(!u(e))return s=function(e,t){var n,r,o;if(r=e.ownerDocument.createTextNode(Ri),o=e.parentNode,t){if(n=e.previousSibling,Di(n)){if(Li(n))return n;if(qi(n))return n.splitText(n.data.length-1)}o.insertBefore(r,e)}else{if(n=e.nextSibling,Di(n)){if(Li(n))return n;if(Ui(n))return n.splitText(1),n}e.nextSibling?o.insertBefore(r,e.nextSibling):o.appendChild(r)}return r}(e,t),r=e.ownerDocument.createRange(),rs(s.nextSibling)?(r.setStart(s,0),r.setEnd(s,0)):(r.setStart(s,1),r.setEnd(s,1)),r;s=zi("p",e,t),n=os(a,e,t),tn(s).css("top",n.top);var i=tn('<div class="mce-visual-caret" data-mce-bogus="all"></div>').css(n).appendTo(a)[0];return c.set(A.some({caret:i,element:e,before:t})),c.get().each(function(e){t&&tn(e.caret).addClass("mce-visual-caret-before")}),f(),(r=e.ownerDocument.createRange()).setStart(s,0),r.setEnd(s,0),r},hide:l,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){c.get().each(function(e){var t=os(a,e.element,e.before);tn(e.caret).css(t)})},destroy:function(){return we.clearInterval(t)}}},as=function(e){return rs(e)||Oo.isTable(e)&&$u()},us=Oo.isContentEditableFalse,ss=Oo.matchStyleValues("display","block table table-cell table-caption list-item"),cs=Li,ls=Oi,fs=da.curry,ds=Oo.isElement,ms=Ji,ps=function(e){return 0<e},gs=function(e){return e<0},hs=function(e,t){for(var n;n=e(t);)if(!ls(n))return n;return null},vs=function(e,t,n,r,o){var i=new ao(e,r);if(gs(t)){if((us(e)||ls(e))&&n(e=hs(i.prev,!0)))return e;for(;e=hs(i.prev,o);)if(n(e))return e}if(ps(t)){if((us(e)||ls(e))&&n(e=hs(i.next,!0)))return e;for(;e=hs(i.next,o);)if(n(e))return e}return null},ys=function(e,t){for(;e&&e!==t;){if(ss(e))return e;e=e.parentNode}return null},bs=function(e,t,n){return ys(e.container(),n)===ys(t.container(),n)},Cs=function(e,t){var n,r;return t?(n=t.container(),r=t.offset(),ds(n)?n.childNodes[r+e]:null):null},xs=function(e,t){var n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n},ws=function(e,t,n){var r,o,i,a;for(o=e?"previousSibling":"nextSibling";n&&n!==t;){if(r=n[o],cs(r)&&(r=r[o]),us(r)){if(a=n,ys(r,i=t)===ys(a,i))return r;break}if(ms(r))break;n=n.parentNode}return null},Ns=fs(xs,!0),Es=fs(xs,!1),Ss=function(e,t,n){var r,o,i,a,u=fs(ws,!0,t),s=fs(ws,!1,t);if(o=n.startContainer,i=n.startOffset,Oi(o)){if(ds(o)||(o=o.parentNode),"before"===(a=o.getAttribute("data-mce-caret"))&&(r=o.nextSibling,as(r)))return Ns(r);if("after"===a&&(r=o.previousSibling,as(r)))return Es(r)}if(!n.collapsed)return n;if(Oo.isText(o)){if(cs(o)){if(1===e){if(r=s(o))return Ns(r);if(r=u(o))return Es(r)}if(-1===e){if(r=u(o))return Es(r);if(r=s(o))return Ns(r)}return n}if(qi(o)&&i>=o.data.length-1)return 1===e&&(r=s(o))?Ns(r):n;if(Ui(o)&&i<=1)return-1===e&&(r=u(o))?Es(r):n;if(i===o.data.length)return(r=s(o))?Ns(r):n;if(0===i)return(r=u(o))?Es(r):n}return n},ks=function(e,t){var n=Cs(e,t);return us(n)&&!Oo.isBogusAll(n)},Ts=function(e,t){return Oo.isTable(Cs(e,t))},As=function(e,t){return A.from(Cs(e?0:-1,t)).filter(us)},Rs=function(e,t,n){var r=Ss(e,t,n);return-1===e?Da.fromRangeStart(r):Da.fromRangeEnd(r)},_s=fs(ks,0),Bs=fs(ks,-1),Ds=fs(Ts,0),Os=fs(Ts,-1);(au=iu||(iu={}))[au.Backwards=-1]="Backwards",au[au.Forwards=1]="Forwards";var Ps,Ls,Is,Ms,Fs,zs=Oo.isContentEditableFalse,Us=Oo.isText,qs=Oo.isElement,Vs=Oo.isBr,Hs=Ji,js=function(e){return Xi(e)||!!Qi(t=e)&&!0!==Bt.reduce(t.getElementsByTagName("*"),function(e,t){return e||Hi(t)},!1);var t},$s=Zi,Ws=function(e,t){return e.hasChildNodes()&&t<e.childNodes.length?e.childNodes[t]:null},Ks=function(e,t){if(ps(e)){if(Hs(t.previousSibling)&&!Us(t.previousSibling))return La.before(t);if(Us(t))return La(t,0)}if(gs(e)){if(Hs(t.nextSibling)&&!Us(t.nextSibling))return La.after(t);if(Us(t))return La(t,t.data.length)}return gs(e)?Vs(t)?La.before(t):La.after(t):La.before(t)},Xs=function(e,t,n){var r,o,i,a,u;if(!qs(n)||!t)return null;if(t.isEqual(La.after(n))&&n.lastChild){if(u=La.after(n.lastChild),gs(e)&&Hs(n.lastChild)&&qs(n.lastChild))return Vs(n.lastChild)?La.before(n.lastChild):u}else u=t;var s,c,l,f=u.container(),d=u.offset();if(Us(f)){if(gs(e)&&0<d)return La(f,--d);if(ps(e)&&d<f.length)return La(f,++d);r=f}else{if(gs(e)&&0<d&&(o=Ws(f,d-1),Hs(o)))return!js(o)&&(i=vs(o,e,$s,o))?Us(i)?La(i,i.data.length):La.after(i):Us(o)?La(o,o.data.length):La.before(o);if(ps(e)&&d<f.childNodes.length&&(o=Ws(f,d),Hs(o)))return Vs(o)&&n.lastChild===o?null:(s=o,c=n,Oo.isBr(s)&&(l=Xs(1,La.after(s),c))&&!bs(La.before(s),La.before(l),c)?Xs(e,La.after(o),n):!js(o)&&(i=vs(o,e,$s,o))?Us(i)?La(i,0):La.before(i):Us(o)?La(o,0):La.after(o));r=o||u.getNode()}return(ps(e)&&u.isAtEnd()||gs(e)&&u.isAtStart())&&(r=vs(r,e,da.constant(!0),n,!0),$s(r,n))?Ks(e,r):(o=vs(r,e,$s,n),!(a=Bt.last(Bt.filter(function(e,t){for(var n=[];e&&e!==t;)n.push(e),e=e.parentNode;return n}(f,n),zs)))||o&&a.contains(o)?o?Ks(e,o):null:u=ps(e)?La.after(a):La.before(a))},Ys=function(t){return{next:function(e){return Xs(iu.Forwards,e,t)},prev:function(e){return Xs(iu.Backwards,e,t)}}},Gs=function(e){return It.grep(e.childNodes,function(e){return"LI"===e.nodeName})},Js=function(e){return e&&e.firstChild&&e.firstChild===e.lastChild&&("\xa0"===(t=e.firstChild).data||Oo.isBr(t));var t},Qs=function(e){return 0<e.length&&(!(t=e[e.length-1]).firstChild||Js(t))?e.slice(0,-1):e;var t},Zs=function(e,t){var n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null},ec=function(e,t){var n=La.after(e),r=Ys(t).prev(n);return r?r.toRange():null},tc=function(t,e,n){var r,o,i,a,u=t.parentNode;return It.each(e,function(e){u.insertBefore(e,t)}),r=t,o=n,i=La.before(r),(a=Ys(o).next(i))?a.toRange():null},nc=function(e,t){var n,r,o,i,a,u,s=t.firstChild,c=t.lastChild;return s&&"meta"===s.name&&(s=s.next),c&&"mce_marker"===c.attr("id")&&(c=c.prev),r=c,u=(n=e).getNonEmptyElements(),r&&(r.isEmpty(u)||(o=r,n.getBlockElements()[o.name]&&(a=o).firstChild&&a.firstChild===a.lastChild&&("br"===(i=o.firstChild).name||"\xa0"===i.value)))&&(c=c.prev),!(!s||s!==c||"ul"!==s.name&&"ol"!==s.name)},rc=function(e,o,i,t){var n,r,a,u,s,c,l,f,d,m,p,g,h,v,y,b,C,x,w,N=(n=o,r=t,c=e.serialize(r),l=n.createFragment(c),u=(a=l).firstChild,s=a.lastChild,u&&"META"===u.nodeName&&u.parentNode.removeChild(u),s&&"mce_marker"===s.id&&s.parentNode.removeChild(s),a),E=Zs(o,i.startContainer),S=Qs(Gs(N.firstChild)),k=o.getRoot(),T=function(e){var t=La.fromRangeStart(i),n=Ys(o.getRoot()),r=1===e?n.prev(t):n.next(t);return!r||Zs(o,r.getNode())!==E};return T(1)?tc(E,S,k):T(2)?(f=E,d=S,m=k,o.insertAfter(d.reverse(),f),ec(d[0],m)):(g=S,h=k,v=p=E,b=(y=i).cloneRange(),C=y.cloneRange(),b.setStartBefore(v),C.setEndAfter(v),x=[b.cloneContents(),C.cloneContents()],(w=p.parentNode).insertBefore(x[0],p),It.each(g,function(e){w.insertBefore(e,p)}),w.insertBefore(x[1],p),w.removeChild(p),ec(g[g.length-1],h))},oc=function(e,t){return!!Zs(e,t)},ic=Oo.isText,ac=Oo.isBogus,uc=vi.nodeIndex,sc=function(e){var t=e.parentNode;return ac(t)?sc(t):t},cc=function(e){return e?Bt.reduce(e.childNodes,function(e,t){return ac(t)&&"BR"!==t.nodeName?e=e.concat(cc(t)):e.push(t),e},[]):[]},lc=function(t){return function(e){return t===e}},fc=function(e){var t,r,n,o;return(ic(e)?"text()":e.nodeName.toLowerCase())+"["+(r=cc(sc(t=e)),n=Bt.findIndex(r,lc(t),t),r=r.slice(0,n+1),o=Bt.reduce(r,function(e,t,n){return ic(t)&&ic(r[n-1])&&e++,e},0),r=Bt.filter(r,Oo.matchNodeNames(t.nodeName)),(n=Bt.findIndex(r,lc(t),t))-o)+"]"},dc=function(e,t){var n,r,o,i,a,u=[];return n=t.container(),r=t.offset(),ic(n)?o=function(e,t){for(;(e=e.previousSibling)&&ic(e);)t+=e.data.length;return t}(n,r):(r>=(i=n.childNodes).length?(o="after",r=i.length-1):o="before",n=i[r]),u.push(fc(n)),a=function(e,t,n){var r=[];for(t=t.parentNode;!(t===e||n&&n(t));t=t.parentNode)r.push(t);return r}(e,n),a=Bt.filter(a,da.negate(Oo.isBogus)),(u=u.concat(Bt.map(a,function(e){return fc(e)}))).reverse().join("/")+","+o},mc=function(e,t){var n,r,o;return t?(t=(n=t.split(","))[0].split("/"),o=1<n.length?n[1]:"before",(r=Bt.reduce(t,function(e,t){return(t=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t))?("text()"===t[1]&&(t[1]="#text"),n=e,r=t[1],o=parseInt(t[2],10),i=cc(n),i=Bt.filter(i,function(e,t){return!ic(e)||!ic(i[t-1])}),(i=Bt.filter(i,Oo.matchNodeNames(r)))[o]):null;var n,r,o,i},e))?ic(r)?function(e,t){for(var n,r=e,o=0;ic(r);){if(n=r.data.length,o<=t&&t<=o+n){e=r,t-=o;break}if(!ic(r.nextSibling)){e=r,t=n;break}o+=n,r=r.nextSibling}return ic(e)&&t>e.data.length&&(t=e.data.length),La(e,t)}(r,parseInt(o,10)):(o="after"===o?uc(r)+1:uc(r),La(r.parentNode,o)):null):null},pc=Oo.isContentEditableFalse,gc=function(e,t,n,r,o){var i,a=r[o?"startContainer":"endContainer"],u=r[o?"startOffset":"endOffset"],s=[],c=0,l=e.getRoot();for(Oo.isText(a)?s.push(n?function(e,t,n){var r,o;for(o=e(t.data.slice(0,n)).length,r=t.previousSibling;r&&Oo.isText(r);r=r.previousSibling)o+=e(r.data).length;return o}(t,a,u):u):(u>=(i=a.childNodes).length&&i.length&&(c=1,u=Math.max(0,i.length-1)),s.push(e.nodeIndex(i[u],n)+c));a&&a!==l;a=a.parentNode)s.push(e.nodeIndex(a,n));return s},hc=function(e){Oo.isText(e)&&0===e.data.length&&e.parentNode.removeChild(e)},vc=function(e,t,n){var r=0;return It.each(e.select(t),function(e){if("all"!==e.getAttribute("data-mce-bogus"))return e!==n&&void r++}),r},yc=function(e,t){var n,r,o,i=t?"start":"end";n=e[i+"Container"],r=e[i+"Offset"],Oo.isElement(n)&&"TR"===n.nodeName&&(n=(o=n.childNodes)[Math.min(t?r:r-1,o.length-1)])&&(r=t?0:n.childNodes.length,e["set"+(t?"Start":"End")](n,r))},bc=function(e){return yc(e,!0),yc(e,!1),e},Cc=function(e,t){var n;if(Oo.isElement(e)&&(e=ua(e,t),pc(e)))return e;if(Li(e)){if(Oo.isText(e)&&Oi(e)&&(e=e.parentNode),n=e.previousSibling,pc(n))return n;if(n=e.nextSibling,pc(n))return n}},xc=function(e,t,n){var r=n.getNode(),o=r?r.nodeName:null,i=n.getRng();if(pc(r)||"IMG"===o)return{name:o,index:vc(n.dom,o,r)};var a,u,s,c,l,f,d,m=Cc((a=i).startContainer,a.startOffset)||Cc(a.endContainer,a.endOffset);return m?{name:o=m.tagName,index:vc(n.dom,o,m)}:(u=e,c=t,l=i,f=(s=n).dom,(d={}).start=gc(f,u,c,l,!0),s.isCollapsed()||(d.end=gc(f,u,c,l,!1)),d)},wc=function(e,t,n){var r={"data-mce-type":"bookmark",id:t,style:"overflow:hidden;line-height:0px"};return n?e.create("span",r,""):e.create("span",r)},Nc=function(e,t){var n=e.dom,r=e.getRng(),o=n.uniqueId(),i=e.isCollapsed(),a=e.getNode(),u=a.nodeName;if("IMG"===u)return{name:u,index:vc(n,u,a)};var s=bc(r.cloneRange());if(!i){s.collapse(!1);var c=wc(n,o+"_end",t);s.insertNode(c),hc(c.nextSibling)}(r=bc(r)).collapse(!0);var l=wc(n,o+"_start",t);return r.insertNode(l),hc(l.previousSibling),e.moveToBookmark({id:o,keep:1}),{id:o}},Ec={getBookmark:function(e,t,n){return 2===t?xc(_i,n,e):3===t?(o=(r=e).getRng(),{start:dc(r.dom.getRoot(),La.fromRangeStart(o)),end:dc(r.dom.getRoot(),La.fromRangeEnd(o))}):t?{rng:e.getRng()}:Nc(e,!1);var r,o},getUndoBookmark:V.curry(xc,V.identity,!0),getPersistentBookmark:Nc},Sc="_mce_caret",kc=function(e){return Oo.isElement(e)&&e.id===Sc},Tc=function(e,t){for(;t&&t!==e;){if(t.id===Sc)return t;t=t.parentNode}return null},Ac=function(e,t){return!e.isBlock(t)||t.innerHTML||ve.ie||(t.innerHTML='<br data-mce-bogus="1" />'),t},Rc=function(e,t){return Qa.lastPositionIn(e).fold(function(){return!1},function(e){return t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0})},_c=function(e,t,n){return!(!1!==t.hasChildNodes()||!Tc(e,t)||(o=n,i=(r=t).ownerDocument.createTextNode(Ri),r.appendChild(i),o.setStart(i,0),o.setEnd(i,0),0));var r,o,i},Bc=function(e,t,n,r){var o,i,a,u,s=n[t?"start":"end"],c=e.getRoot();if(s){for(a=s[0],i=c,o=s.length-1;1<=o;o--){if(u=i.childNodes,_c(c,i,r))return!0;if(s[o]>u.length-1)return!!_c(c,i,r)||Rc(i,r);i=u[s[o]]}3===i.nodeType&&(a=Math.min(s[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(s[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return!0},Dc=function(e){return Oo.isText(e)&&0<e.data.length},Oc=function(e,t,n){var r,o,i,a,u,s,c=e.get(n.id+"_"+t),l=n.keep;if(c){if(r=c.parentNode,"start"===t?l?c.hasChildNodes()?(r=c.firstChild,o=1):Dc(c.nextSibling)?(r=c.nextSibling,o=0):Dc(c.previousSibling)?(r=c.previousSibling,o=c.previousSibling.data.length):(r=c.parentNode,o=e.nodeIndex(c)+1):o=e.nodeIndex(c):l?c.hasChildNodes()?(r=c.firstChild,o=1):Dc(c.previousSibling)?(r=c.previousSibling,o=c.previousSibling.data.length):(r=c.parentNode,o=e.nodeIndex(c)):o=e.nodeIndex(c),u=r,s=o,!l){for(a=c.previousSibling,i=c.nextSibling,It.each(It.grep(c.childNodes),function(e){Oo.isText(e)&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))});c=e.get(n.id+"_"+t);)e.remove(c,!0);a&&i&&a.nodeType===i.nodeType&&Oo.isText(a)&&!ve.opera&&(o=a.nodeValue.length,a.appendData(i.nodeValue),e.remove(i),u=a,s=o)}return A.some(La(u,s))}return A.none()},Pc=function(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,p,g,h,v,y=e.dom;if(t){if(v=t,It.isArray(v.start))return g=t,h=(p=y).createRng(),Bc(p,!0,g,h)&&Bc(p,!1,g,h)?A.some(h):A.none();if("string"==typeof t.start)return A.some((f=t,d=(l=y).createRng(),m=mc(l.getRoot(),f.start),d.setStart(m.container(),m.offset()),m=mc(l.getRoot(),f.end),d.setEnd(m.container(),m.offset()),d));if(t.hasOwnProperty("id"))return s=Oc(o=y,"start",i=t),c=Oc(o,"end",i),ma([s,(a=c,u=s,a.isSome()?a:u)],function(e,t){var n=o.createRng();return n.setStart(Ac(o,e.container()),e.offset()),n.setEnd(Ac(o,t.container()),t.offset()),n});if(t.hasOwnProperty("name"))return n=y,r=t,A.from(n.select(r.name)[r.index]).map(function(e){var t=n.createRng();return t.selectNode(e),t});if(t.hasOwnProperty("rng"))return A.some(t.rng)}return A.none()},Lc=function(e,t,n){return Ec.getBookmark(e,t,n)},Ic=function(t,e){Pc(t,e).each(function(e){t.setRng(e)})},Mc=function(e){return Oo.isElement(e)&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")},Fc=It.each,zc=function(o){this.compare=function(e,t){if(e.nodeName!==t.nodeName)return!1;var n=function(n){var r={};return Fc(o.getAttribs(n),function(e){var t=e.nodeName.toLowerCase();0!==t.indexOf("_")&&"style"!==t&&0!==t.indexOf("data-")&&(r[t]=o.getAttrib(n,t))}),r},r=function(e,t){var n,r;for(r in e)if(e.hasOwnProperty(r)){if(void 0===(n=t[r]))return!1;if(e[r]!==n)return!1;delete t[r]}for(r in t)if(t.hasOwnProperty(r))return!1;return!0};return!(!r(n(e),n(t))||!r(o.parseStyle(o.getAttrib(e,"style")),o.parseStyle(o.getAttrib(t,"style")))||Mc(e)||Mc(t))}},Uc=function(t,e){H.each(e,function(e){Hu.before(t,e)})},qc=function(t,e){H.each(e,function(e){Hu.append(t,e)})},Vc=function(e){var t=e.dom();null!==t.parentNode&&t.parentNode.removeChild(t)},Hc={empty:function(e){e.dom().textContent="",H.each($r.children(e),function(e){Vc(e)})},remove:Vc,unwrap:function(e){var t=$r.children(e);0<t.length&&Uc(e,t),Vc(e)}},jc=(Ps=Zn.isText,Ls="text",Is=function(e){return Ps(e)?A.from(e.dom().nodeValue):A.none()},Ms=Un.detect().browser,{get:function(e){if(!Ps(e))throw new Error("Can only get "+Ls+" value of a "+Ls+" node");return Fs(e).getOr("")},getOption:Fs=Ms.isIE()&&10===Ms.version.major?function(e){try{return Is(e)}catch(Dw){return A.none()}}:Is,set:function(e,t){if(!Ps(e))throw new Error("Can only set raw "+Ls+" value of a "+Ls+" node");e.dom().nodeValue=t}}),$c=function(e){return jc.get(e)},Wc=function(e){var t=hu(e,"br"),n=H.filter(function(e){for(var t=[],n=e.dom();n;)t.push(Vn.fromDom(n)),n=n.lastChild;return t}(e).slice(-1),go);t.length===n.length&&H.each(n,Hc.remove)},Kc=function(e){Hc.empty(e),Hu.append(e,Vn.fromHtml('<br data-mce-bogus="1">'))},Xc=function(n){$r.lastChild(n).each(function(t){$r.prevSibling(t).each(function(e){mo(n)&&go(t)&&mo(e)&&Hc.remove(t)})})},Yc=It.makeMap;function Gc(e){var u,s,c,l,f,d=[];return u=(e=e||{}).indent,s=Yc(e.indent_before||""),c=Yc(e.indent_after||""),l=Ko.getEncodeFunc(e.entity_encoding||"raw",e.entities),f="html"===e.element_format,{start:function(e,t,n){var r,o,i,a;if(u&&s[e]&&0<d.length&&0<(a=d[d.length-1]).length&&"\n"!==a&&d.push("\n"),d.push("<",e),t)for(r=0,o=t.length;r<o;r++)i=t[r],d.push(" ",i.name,'="',l(i.value,!0),'"');d[d.length]=!n||f?">":" />",n&&u&&c[e]&&0<d.length&&0<(a=d[d.length-1]).length&&"\n"!==a&&d.push("\n")},end:function(e){var t;d.push("</",e,">"),u&&c[e]&&0<d.length&&0<(t=d[d.length-1]).length&&"\n"!==t&&d.push("\n")},text:function(e,t){0<e.length&&(d[d.length]=t?e:l(e))},cdata:function(e){d.push("<![CDATA[",e,"]]>")},comment:function(e){d.push("\x3c!--",e,"--\x3e")},pi:function(e,t){t?d.push("<?",e," ",l(t),"?>"):d.push("<?",e,"?>"),u&&d.push("\n")},doctype:function(e){d.push("<!DOCTYPE",e,">",u?"\n":"")},reset:function(){d.length=0},getContent:function(){return d.join("").replace(/\n$/,"")}}}function Jc(t,p){void 0===p&&(p=oi());var g=Gc(t);return(t=t||{}).validate=!("validate"in t)||t.validate,{serialize:function(e){var f,d;d=t.validate,f={3:function(e){g.text(e.value,e.raw)},8:function(e){g.comment(e.value)},7:function(e){g.pi(e.name,e.value)},10:function(e){g.doctype(e.value)},4:function(e){g.cdata(e.value)},11:function(e){if(e=e.firstChild)for(;m(e),e=e.next;);}},g.reset();var m=function(e){var t,n,r,o,i,a,u,s,c,l=f[e.type];if(l)l(e);else{if(t=e.name,n=e.shortEnded,r=e.attributes,d&&r&&1<r.length&&((a=[]).map={},c=p.getElementRule(e.name))){for(u=0,s=c.attributesOrder.length;u<s;u++)(o=c.attributesOrder[u])in r.map&&(i=r.map[o],a.map[o]=i,a.push({name:o,value:i}));for(u=0,s=r.length;u<s;u++)(o=r[u].name)in a.map||(i=r.map[o],a.map[o]=i,a.push({name:o,value:i}));r=a}if(g.start(e.name,r,n),!n){if(e=e.firstChild)for(;m(e),e=e.next;);g.end(t)}}};return 1!==e.type||t.inner?f[11](e):m(e),g.getContent()}}}var Qc=function(a){var u=La.fromRangeStart(a),s=La.fromRangeEnd(a),c=a.commonAncestorContainer;return Qa.fromPosition(!1,c,s).map(function(e){return!bs(u,s,c)&&bs(u,e,c)?(t=u.container(),n=u.offset(),r=e.container(),o=e.offset(),(i=document.createRange()).setStart(t,n),i.setEnd(r,o),i):a;var t,n,r,o,i}).getOr(a)},Zc=function(e){return e.collapsed?e:Qc(e)},el=Oo.matchNodeNames("td th"),tl=function(o,e,t){var n,r,i,a,u,s,c,l,f,d,m,p,g=o.schema.getTextInlineElements(),h=o.selection,v=o.dom;if(/^ | $/.test(e)&&(e=function(e){var t,n,r;t=h.getRng(),n=t.startContainer,r=t.startOffset;var o=function(e){return n[e]&&3===n[e].nodeType};return 3===n.nodeType&&(0<r?e=e.replace(/^ /," "):o("previousSibling")||(e=e.replace(/^ /," ")),r<n.length?e=e.replace(/ (<br>|)$/," "):o("nextSibling")||(e=e.replace(/( | )(<br>|)$/," "))),e}(e)),n=o.parser,p=t.merge,r=Jc({validate:o.settings.validate},o.schema),m='<span id="mce_marker" data-mce-type="bookmark">​</span>',s={content:e,format:"html",selection:!0,paste:t.paste},(s=o.fire("BeforeSetContent",s)).isDefaultPrevented())o.fire("SetContent",{content:s.content,format:"html",selection:!0,paste:t.paste});else{-1===(e=s.content).indexOf("{$caret}")&&(e+="{$caret}"),e=e.replace(/\{\$caret\}/,m);var y,b,C,x,w=(l=h.getRng()).startContainer||(l.parentElement?l.parentElement():null),N=o.getBody();w===N&&h.isCollapsed()&&v.isBlock(N.firstChild)&&(y=N.firstChild)&&!o.schema.getShortEndedElements()[y.nodeName]&&v.isEmpty(N.firstChild)&&((l=v.createRng()).setStart(N.firstChild,0),l.setEnd(N.firstChild,0),h.setRng(l)),h.isCollapsed()||(o.selection.setRng(Zc(o.selection.getRng())),o.getDoc().execCommand("Delete",!1,null),C=(b=h.getRng()).startContainer,x=b.startOffset,3===C.nodeType&&b.collapsed&&("\xa0"===C.data[x]?(C.deleteData(x,1),/[\u00a0| ]$/.test(e)||(e+=" ")):"\xa0"===C.data[x-1]&&(C.deleteData(x-1,1),/[\u00a0| ]$/.test(e)||(e=" "+e))));var E,S,k,T={context:(i=h.getNode()).nodeName.toLowerCase(),data:t.data,insert:!0};if(u=n.parse(e,T),!0===t.paste&&nc(o.schema,u)&&oc(v,i))return l=rc(r,v,o.selection.getRng(),u),o.selection.setRng(l),void o.fire("SetContent",s);if(function(e){for(var t=e;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")}(u),"mce_marker"===(f=u.lastChild).attr("id"))for(f=(c=f).prev;f;f=f.walk(!0))if(3===f.type||!v.isBlock(f.name)){o.schema.isValidChild(f.parent.name,"span")&&f.parent.insert(c,f,"br"===f.name);break}if(o._selectionOverrides.showBlockCaretContainer(i),T.invalid){for(h.setContent(m),i=h.getNode(),a=o.getBody(),9===i.nodeType?i=f=a:f=i;f!==a;)f=(i=f).parentNode;e=i===a?a.innerHTML:v.getOuterHTML(i),e=r.serialize(n.parse(e.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i,function(){return r.serialize(u)}))),i===a?v.setHTML(a,e):v.setOuterHTML(i,e)}else e=r.serialize(u),function(e,t,n){if("all"===n.getAttribute("data-mce-bogus"))n.parentNode.insertBefore(e.dom.createFragment(t),n);else{var r=n.firstChild,o=n.lastChild;!r||r===o&&"BR"===r.nodeName?e.dom.setHTML(n,t):e.selection.setContent(t)}}(o,e,i);!function(){if(p){var n=o.getBody(),r=new zc(v);It.each(v.select("*[data-mce-fragment]"),function(e){for(var t=e.parentNode;t&&t!==n;t=t.parentNode)g[e.nodeName.toLowerCase()]&&r.compare(t,e)&&v.remove(e,!0)})}}(),function(e){var t,n,r;if(e){if(h.scrollIntoView(e),t=function(e){for(var t=o.getBody();e&&e!==t;e=e.parentNode)if("false"===o.dom.getContentEditable(e))return e;return null}(e))return v.remove(e),h.select(t);l=v.createRng(),(f=e.previousSibling)&&3===f.nodeType?(l.setStart(f,f.nodeValue.length),ve.ie||(d=e.nextSibling)&&3===d.nodeType&&(f.appendData(d.data),d.parentNode.removeChild(d))):(l.setStartBefore(e),l.setEndBefore(e)),n=v.getParent(e,v.isBlock),v.remove(e),n&&v.isEmpty(n)&&(o.$(n).empty(),l.setStart(n,0),l.setEnd(n,0),el(n)||n.getAttribute("data-mce-fragment")||!(r=function(e){var t=La.fromRangeStart(e);if(t=Ys(o.getBody()).next(t))return t.toRange()}(l))?v.add(n,v.create("br",{"data-mce-bogus":"1"})):(l=r,v.remove(n))),h.setRng(l)}}(v.get("mce_marker")),E=o.getBody(),It.each(E.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")}),S=o.dom,k=o.selection.getStart(),A.from(S.getParent(k,"td,th")).map(Vn.fromDom).each(Xc),o.fire("SetContent",s),o.addVisual()}},nl=function(e,t){var n,r,o="string"!=typeof(n=t)?(r=It.extend({paste:n.paste,data:{paste:n.paste}},n),{content:n.content,details:r}):{content:n,details:{}};tl(e,o.content,o.details)};function rl(e,t,n,r,o){return e(n,r)?A.some(n):k.isFunction(o)&&o(n)?A.none():t(n,r,o)}var ol=function(e,t,n){for(var r=e.dom(),o=k.isFunction(n)?n:V.constant(!1);r.parentNode;){r=r.parentNode;var i=Vn.fromDom(r);if(t(i))return A.some(i);if(o(i))break}return A.none()},il=function(e,t){return H.find(e.dom().childNodes,V.compose(t,Vn.fromDom)).map(Vn.fromDom)},al=function(e,r){var o=function(e){for(var t=0;t<e.childNodes.length;t++){if(r(Vn.fromDom(e.childNodes[t])))return A.some(Vn.fromDom(e.childNodes[t]));var n=o(e.childNodes[t]);if(n.isSome())return n}return A.none()};return o(e.dom())},ul={first:function(e){return al(mr.body(),e)},ancestor:ol,closest:function(e,t,n){return rl(function(e){return t(e)},ol,e,t,n)},sibling:function(t,n){var e=t.dom();return e.parentNode?il(Vn.fromDom(e.parentNode),function(e){return!Mr.eq(t,e)&&n(e)}):A.none()},child:il,descendant:al},sl=kr.immutable("sections","settings"),cl=Un.detect().deviceType.isTouch(),ll=["lists","autolink","autosave"],fl={theme:"mobile"},dl=function(e){var t=k.isArray(e)?e.join(" "):e,n=H.map(k.isString(t)?t.split(" "):[],On);return H.filter(n,function(e){return 0<e.length})},ml=function(e,t){return e.sections().hasOwnProperty(t)},pl=function(e,t,n,r){var o,i,a=dl(n.forced_plugins),u=dl(r.plugins),s=e&&ml(t,"mobile")?(o=u,H.filter(o,V.curry(H.contains,ll))):u,c=(i=s,[].concat(dl(a)).concat(dl(i)));return It.extend(r,{plugins:c.join(" ")})},gl=function(e,t,n,r){var o,i,a,u,s,c,l,f,d,m,p,g,h,v=(o=["mobile"],i=r,a=ir.bifilter(i,function(e,t){return H.contains(o,t)}),sl(a.t,a.f)),y=It.extend(t,n,v.settings(),(p=e,h=(g=v).settings().inline,p&&ml(g,"mobile")&&!h?(l="mobile",f=fl,d=v.sections(),m=d.hasOwnProperty(l)?d[l]:{},It.extend({},f,m)):{}),{validate:!0,content_editable:v.settings().inline,external_plugins:(u=n,s=v.settings(),c=s.external_plugins?s.external_plugins:{},u&&u.external_plugins?It.extend({},u.external_plugins,c):c)});return pl(e,v,n,y)},hl=function(e,t,n){return A.from(t.settings[n]).filter(e)},vl=V.curry(hl,k.isString),yl=function(e,t,n,r){var o,i,a,u=t in e.settings?e.settings[t]:n;return"hash"===r?(a={},"string"==typeof(i=u)?H.each(0<i.indexOf("=")?i.split(/[;,](?![^=;,]*(?:[;,]|$))/):i.split(","),function(e){var t=e.split("=");1<t.length?a[It.trim(t[0])]=It.trim(t[1]):a[It.trim(t[0])]=It.trim(t)}):a=i,a):"string"===r?hl(k.isString,e,t).getOr(n):"number"===r?hl(k.isNumber,e,t).getOr(n):"boolean"===r?hl(k.isBoolean,e,t).getOr(n):"object"===r?hl(k.isObject,e,t).getOr(n):"array"===r?hl(k.isArray,e,t).getOr(n):"string[]"===r?hl((o=k.isString,function(e){return k.isArray(e)&&H.forall(e,o)}),e,t).getOr(n):"function"===r?hl(k.isFunction,e,t).getOr(n):u},bl=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,Cl=function(e,t){var n=t.container(),r=t.offset();return e?Pi(n)?Oo.isText(n.nextSibling)?La(n.nextSibling,0):La.after(n):Mi(t)?La(n,r+1):t:Pi(n)?Oo.isText(n.previousSibling)?La(n.previousSibling,n.previousSibling.data.length):La.before(n):Fi(t)?La(n,r-1):t},xl={isInlineTarget:function(e,t){var n=vl(e,"inline_boundaries_selector").getOr("a[href],code");return Pr.is(Vn.fromDom(t),n)},findRootInline:function(e,t,n){var r,o,i,a=(r=e,o=t,i=n,H.filter(vi.DOM.getParents(i.container(),"*",o),r));return A.from(a[a.length-1])},isRtl:function(e){return"rtl"===vi.DOM.getStyle(e,"direction",!0)||(t=e.textContent,bl.test(t));var t},isAtZwsp:function(e){return Mi(e)||Fi(e)},normalizePosition:Cl,normalizeForwards:V.curry(Cl,!0),normalizeBackwards:V.curry(Cl,!1),hasSameParentBlock:function(e,t,n){var r=ys(t,e),o=ys(n,e);return r&&r===o}},wl=function(e,t){return Mr.contains(e,t)?ul.closest(t,function(e){return ho(e)||yo(e)},(n=e,function(e){return Mr.eq(n,Vn.fromDom(e.dom().parentNode))})):A.none();var n},Nl=function(e){var t,n,r;e.dom.isEmpty(e.getBody())&&(e.setContent(""),n=(t=e).getBody(),r=n.firstChild&&t.dom.isBlock(n.firstChild)?n.firstChild:n,t.selection.setCursorLocation(r,0))},El=function(i,a,u){return ma([Qa.firstPositionIn(u),Qa.lastPositionIn(u)],function(e,t){var n=xl.normalizePosition(!0,e),r=xl.normalizePosition(!1,t),o=xl.normalizePosition(!1,a);return i?Qa.nextPosition(u,o).map(function(e){return e.isEqual(r)&&a.isEqual(n)}).getOr(!1):Qa.prevPosition(u,o).map(function(e){return e.isEqual(n)&&a.isEqual(r)}).getOr(!1)}).getOr(!0)},Sl=function(e,t,n){return ul.ancestor(e,function(e){return Pr.is(e,t)},n)},kl=Sl,Tl=function(e,t){return Pr.one(t,e)},Al=function(e,t,n){return rl(Pr.is,Sl,e,t,n)},Rl=function(e,t,n){return kl(e,t,n).isSome()},_l=function(e,t){return Oo.isText(t)&&/^[ \t\r\n]*$/.test(t.data)&&!1===(n=e,r=t,o=Vn.fromDom(n),i=Vn.fromDom(r),Rl(i,"pre,code",V.curry(Mr.eq,o)));var n,r,o,i},Bl=function(e,t){return Ji(t)&&!1===_l(e,t)||(n=t,Oo.isElement(n)&&"A"===n.nodeName&&n.hasAttribute("name"))||Dl(t);var n},Dl=Oo.hasAttribute("data-mce-bookmark"),Ol=Oo.hasAttribute("data-mce-bogus"),Pl=Oo.hasAttributeValue("data-mce-bogus","all"),Ll=function(e){return function(e){var t,n,r=0;if(Bl(e,e))return!1;if(!(n=e.firstChild))return!0;t=new ao(n,e);do{if(Pl(n))n=t.next(!0);else if(Ol(n))n=t.next();else if(Oo.isBr(n))r++,n=t.next();else{if(Bl(e,n))return!1;n=t.next()}}while(n);return r<=1}(e.dom())},Il=kr.immutable("block","position"),Ml=kr.immutable("from","to"),Fl=function(e,t){var n=Vn.fromDom(e),r=Vn.fromDom(t.container());return wl(n,r).map(function(e){return Il(e,t)})},zl=function(o,i,e){var t=Fl(o,La.fromRangeStart(e)),n=t.bind(function(e){return Qa.fromPosition(i,o,e.position()).bind(function(e){return Fl(o,e).map(function(e){return t=o,n=i,r=e,Oo.isBr(r.position().getNode())&&!1===Ll(r.block())?Qa.positionIn(!1,r.block().dom()).bind(function(e){return e.isEqual(r.position())?Qa.fromPosition(n,t,e).bind(function(e){return Fl(t,e)}):A.some(r)}).getOr(r):r;var t,n,r})})});return ma([t,n],Ml).filter(function(e){return r=e,!1===Mr.eq(r.from().block(),r.to().block())&&(n=e,$r.parent(n.from().block()).bind(function(t){return $r.parent(n.to().block()).filter(function(e){return Mr.eq(t,e)})}).isSome())&&(t=e,!1===Oo.isContentEditableFalse(t.from().block())&&!1===Oo.isContentEditableFalse(t.to().block()));var t,n,r})},Ul=function(e,t,n){return n.collapsed?zl(e,t,n):A.none()},ql=function(e,t,n){return Mr.contains(t,e)?$r.parents(e,function(e){return n(e)||Mr.eq(e,t)}).slice(0,-1):[]},Vl=function(e,t){return ql(e,t,V.constant(!1))},Hl=Vl,jl=function(e,t){return[e].concat(Vl(e,t))},$l=function(e){var t,n,r=(t=e,n=$r.children(t),H.findIndex(n,mo).fold(function(){return n},function(e){return n.slice(0,e)}));return H.each(r,function(e){Hc.remove(e)}),r},Wl=function(e,t){Qa.positionIn(e,t.dom()).each(function(e){var t=e.getNode();Oo.isBr(t)&&Hc.remove(Vn.fromDom(t))})},Kl=function(e,t){var n=jl(t,e);return H.find(n.reverse(),Ll).each(Hc.remove)},Xl=function(o,i){return Mr.contains(i,o)?$r.parent(o).bind(function(e){return Mr.eq(e,i)?A.some(o):(t=i,n=o,r=$r.parents(n,function(e){return Mr.eq(e,t)}),A.from(r[r.length-2]));var t,n,r}):A.none()},Yl=function(n,r,o){if(Ll(o))return Hc.remove(o),Ll(r)&&Kc(r),Qa.firstPositionIn(r.dom());Wl(!0,r),Wl(!1,o);var i=$l(r);return Xl(r,o).fold(function(){Kl(n,r);var e=Qa.lastPositionIn(o.dom());return H.each(i,function(e){Hu.append(o,e)}),e},function(t){var e=Qa.prevPosition(o.dom(),La.before(t.dom()));return H.each(i,function(e){Hu.before(t,e)}),Kl(n,r),e})},Gl=function(e,t,n,r){return t?Yl(e,r,n):Yl(e,n,r)},Jl=function(t,n){var e,r=Vn.fromDom(t.getBody());return(e=Ul(r.dom(),n,t.selection.getRng()).bind(function(e){return Gl(r,n,e.from().block(),e.to().block())})).each(function(e){t.selection.setRng(e.toRange())}),e.isSome()},Ql=function(e,t){var n=Vn.fromDom(t),r=V.curry(Mr.eq,e);return ul.ancestor(n,xo,r).isSome()},Zl=function(e,t){var n,r,o=Qa.prevPosition(e.dom(),La.fromRangeStart(t)).isNone(),i=Qa.nextPosition(e.dom(),La.fromRangeEnd(t)).isNone();return!(Ql(n=e,(r=t).startContainer)||Ql(n,r.endContainer))&&o&&i},ef=function(e){var n,r,o,t,i=Vn.fromDom(e.getBody()),a=e.selection.getRng();return Zl(i,a)?((t=e).setContent(""),t.selection.setCursorLocation(),!0):(n=i,r=e.selection,o=r.getRng(),ma([wl(n,Vn.fromDom(o.startContainer)),wl(n,Vn.fromDom(o.endContainer))],function(e,t){return!1===Mr.eq(e,t)&&(o.deleteContents(),Gl(n,!0,e,t).each(function(e){r.setRng(e.toRange())}),!0)}).getOr(!1))},tf=function(e,t){return!e.selection.isCollapsed()&&ef(e)},nf=function(a){if(!k.isArray(a))throw new Error("cases must be an array");if(0===a.length)throw new Error("there must be at least one case");var u=[],n={};return H.each(a,function(e,r){var t=ir.keys(e);if(1!==t.length)throw new Error("one and only one name per case");var o=t[0],i=e[o];if(n[o]!==undefined)throw new Error("duplicate key detected:"+o);if("cata"===o)throw new Error("cannot have a case named cata (sorry)");if(!k.isArray(i))throw new Error("case arguments must be an array");u.push(o),n[o]=function(){var e=arguments.length;if(e!==i.length)throw new Error("Wrong number of arguments to case "+o+". Expected "+i.length+" ("+i+"), got "+e);for(var n=new Array(e),t=0;t<n.length;t++)n[t]=arguments[t];return{fold:function(){if(arguments.length!==a.length)throw new Error("Wrong number of arguments to fold. Expected "+a.length+", got "+arguments.length);return arguments[r].apply(null,n)},match:function(e){var t=ir.keys(e);if(u.length!==t.length)throw new Error("Wrong number of arguments to match. Expected: "+u.join(",")+"\nActual: "+t.join(","));if(!H.forall(u,function(e){return H.contains(t,e)}))throw new Error("Not all branches were specified when using match. Specified: "+t.join(", ")+"\nRequired: "+u.join(", "));return e[o].apply(null,n)},log:function(e){console.log(e,{constructors:u,constructor:o,params:n})}}}}),n},rf=nf([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),of=function(e,t,n,r){var o=r.getNode(!1===t);return wl(Vn.fromDom(e),Vn.fromDom(n.getNode())).map(function(e){return Ll(e)?rf.remove(e.dom()):rf.moveToElement(o)}).orThunk(function(){return A.some(rf.moveToElement(o))})},af=function(u,s,c){return Qa.fromPosition(s,u,c).bind(function(e){return a=e.getNode(),xo(Vn.fromDom(a))||yo(Vn.fromDom(a))?A.none():(t=u,o=e,i=function(e){return po(Vn.fromDom(e))&&!bs(r,o,t)},As(!(n=s),r=c).fold(function(){return As(n,o).fold(V.constant(!1),i)},i)?A.none():s&&Oo.isContentEditableFalse(e.getNode())?of(u,s,c,e):!1===s&&Oo.isContentEditableFalse(e.getNode(!0))?of(u,s,c,e):s&&Bs(c)?A.some(rf.moveToPosition(e)):!1===s&&_s(c)?A.some(rf.moveToPosition(e)):A.none());var t,n,r,o,i,a})},uf=function(r,e,o){return i=e,a=o.getNode(!1===i),u=i?"after":"before",Oo.isElement(a)&&a.getAttribute("data-mce-caret")===u?(t=e,n=o.getNode(!1===e),t&&Oo.isContentEditableFalse(n.nextSibling)?A.some(rf.moveToElement(n.nextSibling)):!1===t&&Oo.isContentEditableFalse(n.previousSibling)?A.some(rf.moveToElement(n.previousSibling)):A.none()).fold(function(){return af(r,e,o)},A.some):af(r,e,o).bind(function(e){return t=r,n=o,e.fold(function(e){return A.some(rf.remove(e))},function(e){return A.some(rf.moveToElement(e))},function(e){return bs(n,e,t)?A.none():A.some(rf.moveToPosition(e))});var t,n});var t,n,i,a,u},sf=function(e,t){return r=e,o=(n=t).container(),i=n.offset(),!1===La.isTextPosition(n)&&o===r.parentNode&&i>La.before(r).offset()?La(t.container(),t.offset()-1):t;var n,r,o,i},cf=function(e){return Ji(e.previousSibling)?A.some((t=e.previousSibling,Oo.isText(t)?La(t,t.data.length):La.after(t))):e.previousSibling?Qa.lastPositionIn(e.previousSibling):A.none();var t},lf=function(e){return Ji(e.nextSibling)?A.some((t=e.nextSibling,Oo.isText(t)?La(t,0):La.before(t))):e.nextSibling?Qa.firstPositionIn(e.nextSibling):A.none();var t},ff=function(r,o){return cf(o).orThunk(function(){return lf(o)}).orThunk(function(){return e=r,t=o,n=La.before(t.previousSibling?t.previousSibling:t.parentNode),Qa.prevPosition(e,n).fold(function(){return Qa.nextPosition(e,La.after(t))},A.some);var e,t,n})},df=function(n,r){return lf(r).orThunk(function(){return cf(r)}).orThunk(function(){return e=n,t=r,Qa.nextPosition(e,La.after(t)).fold(function(){return Qa.prevPosition(e,La.before(t))},A.some);var e,t})},mf=function(e,t,n){return(r=e,o=t,i=n,r?df(o,i):ff(o,i)).map(V.curry(sf,n));var r,o,i},pf=function(t,n,e){e.fold(function(){t.focus()},function(e){t.selection.setRng(e.toRange(),n)})},gf=function(e,t){return t&&e.schema.getBlockElements().hasOwnProperty(Zn.name(t))},hf=function(e){if(Ll(e)){var t=Vn.fromHtml('<br data-mce-bogus="1">');return Hc.empty(e),Hu.append(e,t),A.some(La.before(t.dom()))}return A.none()},vf=function(t,n,e){var r,a,o,i=mf(n,t.getBody(),e.dom()),u=ul.ancestor(e,V.curry(gf,t),(r=t.getBody(),function(e){return e.dom()===r})),s=(a=e,o=i,ma([$r.prevSibling(a),$r.nextSibling(a),o],function(e,t,n){var r,o=e.dom(),i=t.dom();return Oo.isText(o)&&Oo.isText(i)?(r=o.data.length,o.appendData(i.data),Hc.remove(t),Hc.remove(a),n.container()===i?La(o,r):n):(Hc.remove(a),n)}).orThunk(function(){return Hc.remove(a),o}));t.dom.isEmpty(t.getBody())?(t.setContent(""),t.selection.setCursorLocation()):u.bind(hf).fold(function(){pf(t,n,s)},function(e){pf(t,n,A.some(e))})},yf=function(a,u){var e,t,n,r,o;return(e=a.getBody(),t=u,n=a.selection.getRng(),r=Ss(t?1:-1,e,n),o=La.fromRangeStart(r),!1===t&&Bs(o)?A.some(rf.remove(o.getNode(!0))):t&&_s(o)?A.some(rf.remove(o.getNode())):uf(e,t,o)).map(function(e){return e.fold((o=a,i=u,function(e){return o._selectionOverrides.hideFakeCaret(),vf(o,i,Vn.fromDom(e)),!0}),(n=a,r=u,function(e){var t=r?La.before(e):La.after(e);return n.selection.setRng(t.toRange()),!0}),(t=a,function(e){return t.selection.setRng(e.toRange()),!0}));var t,n,r,o,i}).getOr(!1)},bf=function(e,t){var n,r=e.selection.getNode();return!!Oo.isContentEditableFalse(r)&&(n=Vn.fromDom(e.getBody()),H.each(hu(n,".mce-offscreen-selection"),Hc.remove),vf(e,t,Vn.fromDom(e.selection.getNode())),Nl(e),!0)},Cf=function(e,t){return e.selection.isCollapsed()?yf(e,t):bf(e,t)},xf=function(e){var t,n=function(e,t){for(;t&&t!==e;){if(Oo.isContentEditableTrue(t)||Oo.isContentEditableFalse(t))return t;t=t.parentNode}return null}(e.getBody(),e.selection.getNode());return Oo.isContentEditableTrue(n)&&e.dom.isBlock(n)&&e.dom.isEmpty(n)&&(t=e.dom.create("br",{"data-mce-bogus":"1"}),e.dom.setHTML(n,""),n.appendChild(t),e.selection.setRng(La.before(t).toRange())),!0},wf=Oo.isText,Nf=function(e){return wf(e)&&e.data[0]===Ri},Ef=function(e){return wf(e)&&e.data[e.data.length-1]===Ri},Sf=function(e){return e.ownerDocument.createTextNode(Ri)},kf=function(e,t){return e?function(e){if(wf(e.previousSibling))return Ef(e.previousSibling)||e.previousSibling.appendData(Ri),e.previousSibling;if(wf(e))return Nf(e)||e.insertData(0,Ri),e;var t=Sf(e);return e.parentNode.insertBefore(t,e),t}(t):function(e){if(wf(e.nextSibling))return Nf(e.nextSibling)||e.nextSibling.insertData(0,Ri),e.nextSibling;if(wf(e))return Ef(e)||e.appendData(Ri),e;var t=Sf(e);return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t}(t)},Tf=V.curry(kf,!0),Af=V.curry(kf,!1),Rf=function(e,t){return Oo.isText(e.container())?kf(t,e.container()):kf(t,e.getNode())},_f=function(e,t){var n=t.get();return n&&e.container()===n&&Pi(n)},Bf=function(n,e){return e.fold(function(e){$a.remove(n.get());var t=Tf(e);return n.set(t),A.some(La(t,t.length-1))},function(e){return Qa.firstPositionIn(e).map(function(e){if(_f(e,n))return La(n.get(),1);$a.remove(n.get());var t=Rf(e,!0);return n.set(t),La(t,1)})},function(e){return Qa.lastPositionIn(e).map(function(e){if(_f(e,n))return La(n.get(),n.get().length-1);$a.remove(n.get());var t=Rf(e,!1);return n.set(t),La(t,t.length-1)})},function(e){$a.remove(n.get());var t=Af(e);return n.set(t),A.some(La(t,1))})},Df=function(e,t){for(var n=0;n<e.length;n++){var r=e[n].apply(null,t);if(r.isSome())return r}return A.none()},Of=nf([{before:["element"]},{start:["element"]},{end:["element"]},{after:["element"]}]),Pf=function(e,t){var n=ys(t,e);return n||e},Lf=function(e,t,n){var r=xl.normalizeForwards(n),o=Pf(t,r.container());return xl.findRootInline(e,o,r).fold(function(){return Qa.nextPosition(o,r).bind(V.curry(xl.findRootInline,e,o)).map(function(e){return Of.before(e)})},A.none)},If=function(e,t){return null===Tc(e,t)},Mf=function(e,t,n){return xl.findRootInline(e,t,n).filter(V.curry(If,t))},Ff=function(e,t,n){var r=xl.normalizeBackwards(n);return Mf(e,t,r).bind(function(e){return Qa.prevPosition(e,r).isNone()?A.some(Of.start(e)):A.none()})},zf=function(e,t,n){var r=xl.normalizeForwards(n);return Mf(e,t,r).bind(function(e){return Qa.nextPosition(e,r).isNone()?A.some(Of.end(e)):A.none()})},Uf=function(e,t,n){var r=xl.normalizeBackwards(n),o=Pf(t,r.container());return xl.findRootInline(e,o,r).fold(function(){return Qa.prevPosition(o,r).bind(V.curry(xl.findRootInline,e,o)).map(function(e){return Of.after(e)})},A.none)},qf=function(e){return!1===xl.isRtl(Hf(e))},Vf=function(e,t,n){return Df([Lf,Ff,zf,Uf],[e,t,n]).filter(qf)},Hf=function(e){return e.fold(V.identity,V.identity,V.identity,V.identity)},jf=function(e){return e.fold(V.constant("before"),V.constant("start"),V.constant("end"),V.constant("after"))},$f=function(e){return e.fold(Of.before,Of.before,Of.after,Of.after)},Wf=function(n,e,r,t,o,i){return ma([xl.findRootInline(e,r,t),xl.findRootInline(e,r,o)],function(e,t){return e!==t&&xl.hasSameParentBlock(r,e,t)?Of.after(n?e:t):i}).getOr(i)},Kf=function(e,r){return e.fold(V.constant(!0),function(e){return n=r,!(jf(t=e)===jf(n)&&Hf(t)===Hf(n));var t,n})},Xf=function(e,t){return e?t.fold(V.compose(A.some,Of.start),A.none,V.compose(A.some,Of.after),A.none):t.fold(A.none,V.compose(A.some,Of.before),A.none,V.compose(A.some,Of.end))},Yf=function(a,u,s,c){var e=xl.normalizePosition(a,c),l=Vf(u,s,e);return Vf(u,s,e).bind(V.curry(Xf,a)).orThunk(function(){return t=a,n=u,r=s,o=l,e=c,i=xl.normalizePosition(t,e),Qa.fromPosition(t,r,i).map(V.curry(xl.normalizePosition,t)).fold(function(){return o.map($f)},function(e){return Vf(n,r,e).map(V.curry(Wf,t,n,r,i,e)).filter(V.curry(Kf,o))}).filter(qf);var t,n,r,o,e,i})},Gf=Vf,Jf=Yf,Qf=(V.curry(Yf,!1),V.curry(Yf,!0),$f),Zf=function(e){return e.fold(Of.start,Of.start,Of.end,Of.end)},ed=function(e){return k.isFunction(e.selection.getSel().modify)},td=function(e,t,n){var r=e?1:-1;return t.setRng(La(n.container(),n.offset()+r).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0},nd=function(e,t){var n=t.selection.getRng(),r=e?La.fromRangeEnd(n):La.fromRangeStart(n);return!!ed(t)&&(e&&Mi(r)?td(!0,t.selection,r):!(e||!Fi(r))&&td(!1,t.selection,r))},rd=function(e,t){var n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)},od=function(e){return!1!==e.settings.inline_boundaries},id=function(e,t){e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")},ad=function(t,e,n){return Bf(e,n).map(function(e){return rd(t,e),n})},ud=function(e,t,n){return function(){return!!od(t)&&nd(e,t)}},sd={move:function(a,u,s){return function(){return!!od(a)&&(t=a,n=u,e=s,r=t.getBody(),o=La.fromRangeStart(t.selection.getRng()),i=V.curry(xl.isInlineTarget,t),Jf(e,i,r,o).bind(function(e){return ad(t,n,e)})).isSome();var t,n,e,r,o,i}},moveNextWord:V.curry(ud,!0),movePrevWord:V.curry(ud,!1),setupSelectedState:function(a){var u=ns(null),s=V.curry(xl.isInlineTarget,a);return a.on("NodeChange",function(e){var t,n,r,o,i;od(a)&&(t=s,n=a.dom,r=e.parents,o=H.filter(n.select('*[data-mce-selected="inline-boundary"]'),t),i=H.filter(r,t),H.each(H.difference(o,i),V.curry(id,!1)),H.each(H.difference(i,o),V.curry(id,!0)),function(e,t){if(e.selection.isCollapsed()&&!0!==e.composing&&t.get()){var n=La.fromRangeStart(e.selection.getRng());La.isTextPosition(n)&&!1===xl.isAtZwsp(n)&&(rd(e,$a.removeAndReposition(t.get(),n)),t.set(null))}}(a,u),function(n,r,o,e){if(r.selection.isCollapsed()){var t=H.filter(e,n);H.each(t,function(e){var t=La.fromRangeStart(r.selection.getRng());Gf(n,r.getBody(),t).bind(function(e){return ad(r,o,e)})})}}(s,a,u,e.parents))}),u},setCaretPosition:rd},cd=function(t,n){return function(e){return Bf(n,e).map(function(e){return sd.setCaretPosition(t,e),!0}).getOr(!1)}},ld=function(r,o,i,a){var u=r.getBody(),s=V.curry(xl.isInlineTarget,r);r.undoManager.ignore(function(){var e,t,n;r.selection.setRng((e=i,t=a,(n=document.createRange()).setStart(e.container(),e.offset()),n.setEnd(t.container(),t.offset()),n)),r.execCommand("Delete"),Gf(s,u,La.fromRangeStart(r.selection.getRng())).map(Zf).map(cd(r,o))}),r.nodeChanged()},fd=function(n,r,i,o){var e,t,a=(e=n.getBody(),t=o.container(),ys(t,e)||e),u=V.curry(xl.isInlineTarget,n),s=Gf(u,a,o);return s.bind(function(e){return i?e.fold(V.constant(A.some(Zf(e))),A.none,V.constant(A.some(Qf(e))),A.none):e.fold(A.none,V.constant(A.some(Qf(e))),A.none,V.constant(A.some(Zf(e))))}).map(cd(n,r)).getOrThunk(function(){var t=Qa.navigate(i,a,o),e=t.bind(function(e){return Gf(u,a,e)});return s.isSome()&&e.isSome()?xl.findRootInline(u,a,o).map(function(e){return o=e,!!ma([Qa.firstPositionIn(o),Qa.lastPositionIn(o)],function(e,t){var n=xl.normalizePosition(!0,e),r=xl.normalizePosition(!1,t);return Qa.nextPosition(o,n).map(function(e){return e.isEqual(r)}).getOr(!0)}).getOr(!0)&&(vf(n,i,Vn.fromDom(e)),!0);var o}).getOr(!1):e.bind(function(e){return t.map(function(e){return i?ld(n,r,o,e):ld(n,r,e,o),!0})}).getOr(!1)})},dd=function(e,t,n){if(e.selection.isCollapsed()&&!1!==e.settings.inline_boundaries){var r=La.fromRangeStart(e.selection.getRng());return fd(e,t,n,r)}return!1},md=kr.immutable("start","end"),pd=kr.immutable("rng","table","cells"),gd=nf([{removeTable:["element"]},{emptyCells:["cells"]}]),hd=function(e,t){return Al(Vn.fromDom(e),"td,th",t)},vd=function(e,t){return kl(e,"table",t)},yd=function(e){return!1===Mr.eq(e.start(),e.end())},bd=function(e,n){return vd(e.start(),n).bind(function(t){return vd(e.end(),n).bind(function(e){return Mr.eq(t,e)?A.some(t):A.none()})})},Cd=function(e){return hu(e,"td,th")},xd=function(r,e){var t=hd(e.startContainer,r),n=hd(e.endContainer,r);return e.collapsed?A.none():ma([t,n],md).fold(function(){return t.fold(function(){return n.bind(function(t){return vd(t,r).bind(function(e){return H.head(Cd(e)).map(function(e){return md(e,t)})})})},function(t){return vd(t,r).bind(function(e){return H.last(Cd(e)).map(function(e){return md(t,e)})})})},function(e){return wd(r,e)?A.none():(n=r,vd((t=e).start(),n).bind(function(e){return H.last(Cd(e)).map(function(e){return md(t.start(),e)})}));var t,n})},wd=function(e,t){return bd(t,e).isSome()},Nd=function(e,t){var n,r,o,i,a,u=(n=e,V.curry(Mr.eq,n));return(r=t,o=u,i=hd(r.startContainer,o),a=hd(r.endContainer,o),ma([i,a],md).filter(yd).filter(function(e){return wd(o,e)}).orThunk(function(){return xd(o,r)})).bind(function(e){return bd(t=e,u).map(function(e){return pd(t,e,Cd(e))});var t})},Ed=function(e,t){return H.findIndex(e,function(e){return Mr.eq(e,t)})},Sd=function(n){return(r=n,ma([Ed(r.cells(),r.rng().start()),Ed(r.cells(),r.rng().end())],function(e,t){return r.cells().slice(e,t+1)})).map(function(e){var t=n.cells();return e.length===t.length?gd.removeTable(n.table()):gd.emptyCells(e)});var r},kd=function(e,t){return Nd(e,t).bind(Sd)},Td=function(e){var t=[];if(e)for(var n=0;n<e.rangeCount;n++)t.push(e.getRangeAt(n));return t},Ad=Td,Rd=function(e){return H.bind(e,function(e){var t=aa(e);return t?[Vn.fromDom(t)]:[]})},_d=function(e){return 1<Td(e).length},Bd=function(e){return H.filter(Rd(e),xo)},Dd=function(e){return hu(e,"td[data-mce-selected],th[data-mce-selected]")},Od=function(e,t){var n=Dd(t),r=Bd(e);return 0<n.length?n:r},Pd=Od,Ld=function(e){return Od(Ad(e.selection.getSel()),Vn.fromDom(e.getBody()))},Id=function(e,t){return H.each(t,Kc),e.selection.setCursorLocation(t[0].dom(),0),!0},Md=function(e,t){return vf(e,!1,t),!0},Fd=function(n,e,r,t){return Ud(e,t).fold(function(){return t=n,kd(e,r).map(function(e){return e.fold(V.curry(Md,t),V.curry(Id,t))});var t},function(e){return qd(n,e)}).getOr(!1)},zd=function(e,t){return H.find(jl(t,e),xo)},Ud=function(e,t){return H.find(jl(t,e),function(e){return"caption"===Zn.name(e)})},qd=function(e,t){return Kc(t),e.selection.setCursorLocation(t.dom(),0),A.some(!0)},Vd=function(u,s,c,l,f){return Qa.navigate(c,u.getBody(),f).bind(function(e){return r=l,o=c,i=f,a=e,Qa.firstPositionIn(r.dom()).bind(function(t){return Qa.lastPositionIn(r.dom()).map(function(e){return o?i.isEqual(t)&&a.isEqual(e):i.isEqual(e)&&a.isEqual(t)})}).getOr(!0)?qd(u,l):(t=l,n=e,Ud(s,Vn.fromDom(n.getNode())).map(function(e){return!1===Mr.eq(e,t)}));var t,n,r,o,i,a}).or(A.some(!0))},Hd=function(a,u,s,e){var c=La.fromRangeStart(a.selection.getRng());return zd(s,e).bind(function(e){return Ll(e)?qd(a,e):(t=a,n=s,r=u,o=e,i=c,Qa.navigate(r,t.getBody(),i).bind(function(e){return zd(n,Vn.fromDom(e.getNode())).map(function(e){return!1===Mr.eq(e,o)})}));var t,n,r,o,i})},jd=function(a,u,e){var s=Vn.fromDom(a.getBody());return Ud(s,e).fold(function(){return Hd(a,u,s,e)},function(e){return t=a,n=u,r=s,o=e,i=La.fromRangeStart(t.selection.getRng()),Ll(o)?qd(t,o):Vd(t,r,n,o,i);var t,n,r,o,i}).getOr(!1)},$d=function(e,t){var n,r,o,i,a,u=Vn.fromDom(e.selection.getStart(!0)),s=Ld(e);return e.selection.isCollapsed()&&0===s.length?jd(e,t,u):(n=e,r=u,o=Vn.fromDom(n.getBody()),i=n.selection.getRng(),0!==(a=Ld(n)).length?Id(n,a):Fd(n,o,i,r))},Wd=function(e,t){e.getDoc().execCommand(t,!1,null)},Kd=function(e){Cf(e,!1)||dd(e,!1)||Jl(e,!1)||$d(e)||tf(e,!1)||(Wd(e,"Delete"),Nl(e))},Xd=function(e){Cf(e,!0)||dd(e,!0)||Jl(e,!0)||$d(e)||tf(e,!0)||Wd(e,"ForwardDelete")},Yd=function(s){return function(u,e){return A.from(e).map(Vn.fromDom).filter(Zn.isElement).bind(function(e){return(r=s,o=u,i=e.dom(),a=function(e){return Cr(e,r)},ul.closest(Vn.fromDom(i),function(e){return a(e).isSome()},function(e){return Mr.eq(Vn.fromDom(o),e)}).bind(a)).or((t=s,n=e.dom(),A.from(vi.DOM.getStyle(n,t,!0))));var t,n,r,o,i,a}).getOr("")}},Gd={getFontSize:Yd("font-size"),getFontFamily:V.compose(function(e){return e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,",")},Yd("font-family")),toPt:function(e,t){return/[0-9.]+px$/.test(e)?(n=72*parseInt(e,10)/96,r=t||0,o=Math.pow(10,r),Math.round(n*o)/o+"pt"):e;var n,r,o}},Jd=function(e){return Qa.firstPositionIn(e.getBody()).map(function(e){var t=e.container();return Oo.isText(t)?t.parentNode:t})},Qd=function(o){return A.from(o.selection.getRng()).bind(function(e){var t,n,r=o.getBody();return n=r,(t=e).startContainer===n&&0===t.startOffset?A.none():A.from(o.selection.getStart(!0))})},Zd=function(e,t){if(/^[0-9\.]+$/.test(t)){var n=parseInt(t,10);if(1<=n&&n<=7){var r=zu(e),o=Uu(e);return o?o[n-1]||t:r[n-1]||t}return t}return t},em=function(e,t){return e&&t&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset},tm=function(e,t,n){return null!==function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(e,t,n)},nm=function(e,t,n){return tm(e,t,function(e){return e.nodeName===n})},rm=function(e){return e&&"TABLE"===e.nodeName},om=function(e,t,n){for(var r=new ao(t,e.getParent(t.parentNode,e.isBlock)||e.getRoot());t=r[n?"prev":"next"]();)if(Oo.isBr(t))return!0},im=function(e,t,n,r,o){var i,a,u,s,c,l,f=e.getRoot(),d=e.schema.getNonEmptyElements();if(u=e.getParent(o.parentNode,e.isBlock)||f,r&&Oo.isBr(o)&&t&&e.isEmpty(u))return A.some(Da(o.parentNode,e.nodeIndex(o)));for(i=new ao(o,u);s=i[r?"prev":"next"]();){if("false"===e.getContentEditableParent(s)||(l=f,Li(c=s)&&!1===tm(c,l,kc)))return A.none();if(Oo.isText(s)&&0<s.nodeValue.length)return!1===nm(s,f,"A")?A.some(Da(s,r?s.nodeValue.length:0)):A.none();if(e.isBlock(s)||d[s.nodeName.toLowerCase()])return A.none();a=s}return n&&a?A.some(Da(a,0)):A.none()},am=function(e,t,n,r){var o,i,a,u,s,c,l,f,d,m,p=e.getRoot(),g=!1;if(o=r[(n?"start":"end")+"Container"],i=r[(n?"start":"end")+"Offset"],l=Oo.isElement(o)&&i===o.childNodes.length,s=e.schema.getNonEmptyElements(),c=n,Li(o))return A.none();if(Oo.isElement(o)&&i>o.childNodes.length-1&&(c=!1),Oo.isDocument(o)&&(o=p,i=0),o===p){if(c&&(u=o.childNodes[0<i?i-1:0])){if(Li(u))return A.none();if(s[u.nodeName]||rm(u))return A.none()}if(o.hasChildNodes()){if(i=Math.min(!c&&0<i?i-1:i,o.childNodes.length-1),o=o.childNodes[i],i=Oo.isText(o)&&l?o.data.length:0,!t&&o===p.lastChild&&rm(o))return A.none();if(function(e,t){for(;t&&t!==e;){if(Oo.isContentEditableFalse(t))return!0;t=t.parentNode}return!1}(p,o)||Li(o))return A.none();if(o.hasChildNodes()&&!1===rm(o)){a=new ao(u=o,p);do{if(Oo.isContentEditableFalse(u)||Li(u)){g=!1;break}if(Oo.isText(u)&&0<u.nodeValue.length){i=c?0:u.nodeValue.length,o=u,g=!0;break}if(s[u.nodeName.toLowerCase()]&&(!(f=u)||!/^(TD|TH|CAPTION)$/.test(f.nodeName))){i=e.nodeIndex(u),o=u.parentNode,c||i++,g=!0;break}}while(u=c?a.next():a.prev())}}}return t&&(Oo.isText(o)&&0===i&&im(e,l,t,!0,o).each(function(e){o=e.container(),i=e.offset(),g=!0}),Oo.isElement(o)&&((u=o.childNodes[i])||(u=o.childNodes[i-1]),!u||!Oo.isBr(u)||(m="A",(d=u).previousSibling&&d.previousSibling.nodeName===m)||om(e,u,!1)||om(e,u,!0)||im(e,l,t,!0,u).each(function(e){o=e.container(),i=e.offset(),g=!0}))),c&&!t&&Oo.isText(o)&&i===o.nodeValue.length&&im(e,l,t,!1,o).each(function(e){o=e.container(),i=e.offset(),g=!0}),g?A.some(Da(o,i)):A.none()},um=function(e,t){var n=t.collapsed,r=t.cloneRange(),o=Da.fromRangeStart(t);return am(e,n,!0,r).each(function(e){n&&Da.isAbove(o,e)||r.setStart(e.container(),e.offset())}),n||am(e,n,!1,r).each(function(e){r.setEnd(e.container(),e.offset())}),n&&r.collapse(!0),em(t,r)?A.none():A.some(r)},sm=function(e,t,n){var r=e.create("span",{}," ");n.parentNode.insertBefore(r,n),t.scrollIntoView(r),e.remove(r)},cm=function(e,t,n,r){var o=e.createRng();r?(o.setStartBefore(n),o.setEndBefore(n)):(o.setStartAfter(n),o.setEndAfter(n)),t.setRng(o)},lm=function(e,t){var n,r,o=e.selection,i=e.dom,a=o.getRng();um(i,a).each(function(e){a.setStart(e.startContainer,e.startOffset),a.setEnd(e.endContainer,e.endOffset)});var u=a.startOffset,s=a.startContainer;if(1===s.nodeType&&s.hasChildNodes()){var c=u>s.childNodes.length-1;s=s.childNodes[Math.min(u,s.childNodes.length-1)]||s,u=c&&3===s.nodeType?s.nodeValue.length:0}var l=i.getParent(s,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",m=t&&t.ctrlKey;"LI"!==d||m||(l=f),s&&3===s.nodeType&&u>=s.nodeValue.length&&(function(e,t,n){for(var r,o=new ao(t,n),i=e.getNonEmptyElements();r=o.next();)if(i[r.nodeName.toLowerCase()]||0<r.length)return!0}(e.schema,s,l)||(n=i.create("br"),a.insertNode(n),a.setStartAfter(n),a.setEndAfter(n),r=!0)),n=i.create("br"),a.insertNode(n),sm(i,o,n),cm(i,o,n,r),e.undoManager.add()},fm=function(e,t){var n=Vn.fromTag("br");Hu.before(Vn.fromDom(t),n),e.undoManager.add()},dm=function(e,t){mm(e.getBody(),t)||Hu.after(Vn.fromDom(t),Vn.fromTag("br"));var n=Vn.fromTag("br");Hu.after(Vn.fromDom(t),n),sm(e.dom,e.selection,n.dom()),cm(e.dom,e.selection,n.dom(),!1),e.undoManager.add()},mm=function(e,t){return n=La.after(t),!!Oo.isBr(n.getNode())||Qa.nextPosition(e,La.after(t)).map(function(e){return Oo.isBr(e.getNode())}).getOr(!1);var n},pm=function(e){return e&&"A"===e.nodeName&&"href"in e},gm=function(e){return e.fold(V.constant(!1),pm,pm,V.constant(!1))},hm=function(e,t){t.fold(V.noop,V.curry(fm,e),V.curry(dm,e),V.noop)},vm=function(e,t){var n,r,o,i=(n=e,r=V.curry(xl.isInlineTarget,n),o=La.fromRangeStart(n.selection.getRng()),Gf(r,n.getBody(),o).filter(gm));i.isSome()?i.each(V.curry(hm,e)):lm(e,t)},ym=nf([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),bm=(ym.before,ym.on,ym.after,function(e){return e.fold(V.identity,V.identity,V.identity)}),Cm=nf([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),xm=kr.immutable("start","soffset","finish","foffset"),wm={domRange:Cm.domRange,relative:Cm.relative,exact:Cm.exact,exactFromRange:function(e){return Cm.exact(e.start(),e.soffset(),e.finish(),e.foffset())},range:xm,getWin:function(e){var t=e.match({domRange:function(e){return Vn.fromDom(e.startContainer)},relative:function(e,t){return bm(e)},exact:function(e,t,n,r){return e}});return $r.defaultView(t)}},Nm=Un.detect().browser,Em=function(e,t){var n=Zn.isText(t)?$c(t).length:$r.children(t).length+1;return n<e?n:e<0?0:e},Sm=function(e){return wm.range(e.start(),Em(e.soffset(),e.start()),e.finish(),Em(e.foffset(),e.finish()))},km=function(e,t){return Mr.contains(e,t)||Mr.eq(e,t)},Tm=function(t){return function(e){return km(t,e.start())&&km(t,e.finish())}},Am=function(e){return!0===e.inline||Nm.isIE()},Rm=function(e){return wm.range(Vn.fromDom(e.startContainer),e.startOffset,Vn.fromDom(e.endContainer),e.endOffset)},_m=function(e){var t=e.getSelection();return(t&&0!==t.rangeCount?A.from(t.getRangeAt(0)):A.none()).map(Rm)},Bm=function(e){var t=$r.defaultView(e);return _m(t.dom()).filter(Tm(e))},Dm=function(e,t){return A.from(t).filter(Tm(e)).map(Sm)},Om=function(e){var t=document.createRange();try{return t.setStart(e.start().dom(),e.soffset()),t.setEnd(e.finish().dom(),e.foffset()),A.some(t)}catch(n){return A.none()}},Pm=function(e){return(e.bookmark?e.bookmark:A.none()).bind(V.curry(Dm,Vn.fromDom(e.getBody()))).bind(Om)},Lm=function(e){var t=Am(e)?Bm(Vn.fromDom(e.getBody())):A.none();e.bookmark=t.isSome()?t:e.bookmark},Im=function(t){Pm(t).each(function(e){t.selection.setRng(e)})},Mm=Pm,Fm=function(e,t){var n=e.settings,r=e.dom,o=e.selection,i=e.formatter,a=/[a-z%]+$/i.exec(n.indentation)[0],u=parseInt(n.indentation,10),s=e.getParam("indent_use_margin",!1);e.queryCommandState("InsertUnorderedList")||e.queryCommandState("InsertOrderedList")||(n.forced_root_block||r.getParent(o.getNode(),r.isBlock)||i.apply("div"),H.each(o.getSelectedBlocks(),function(e){return function(e,t,n,r,o,i){if("false"!==e.getContentEditable(i)&&"LI"!==i.nodeName){var a=n?"margin":"padding";if(a="TABLE"===i.nodeName?"margin":a,a+="rtl"===e.getStyle(i,"direction",!0)?"Right":"Left","outdent"===t){var u=Math.max(0,parseInt(i.style[a]||0,10)-r);e.setStyle(i,a,u?u+o:"")}else u=parseInt(i.style[a]||0,10)+r+o,e.setStyle(i,a,u)}}(r,t,s,u,a,e)}))},zm=It.each,Um=It.extend,qm=It.map,Vm=It.inArray;function Hm(s){var o,i,a,t,c={state:{},exec:{},value:{}},n=s.settings;s.on("PreInit",function(){o=s.dom,i=s.selection,n=s.settings,a=s.formatter});var r=function(e){var t;if(!s.quirks.isHidden()&&!s.removed){if(e=e.toLowerCase(),t=c.state[e])return t(e);try{return s.getDoc().queryCommandState(e)}catch(n){}return!1}},e=function(e,n){n=n||"exec",zm(e,function(t,e){zm(e.toLowerCase().split(","),function(e){c[n][e]=t})})},u=function(e,t,n){e=e.toLowerCase(),c.value[e]=function(){return t.call(n||s)}};Um(this,{execCommand:function(t,n,r,e){var o,i,a=!1;if(!s.removed){if(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(t)||e&&e.skip_focus?Im(s):s.focus(),(e=s.fire("BeforeExecCommand",{command:t,ui:n,value:r})).isDefaultPrevented())return!1;if(i=t.toLowerCase(),o=c.exec[i])return o(i,n,r),s.fire("ExecCommand",{command:t,ui:n,value:r}),!0;if(zm(s.plugins,function(e){if(e.execCommand&&e.execCommand(t,n,r))return s.fire("ExecCommand",{command:t,ui:n,value:r}),!(a=!0)}),a)return a;if(s.theme&&s.theme.execCommand&&s.theme.execCommand(t,n,r))return s.fire("ExecCommand",{command:t,ui:n,value:r}),!0;try{a=s.getDoc().execCommand(t,n,r)}catch(u){}return!!a&&(s.fire("ExecCommand",{command:t,ui:n,value:r}),!0)}},queryCommandState:r,queryCommandValue:function(e){var t;if(!s.quirks.isHidden()&&!s.removed){if(e=e.toLowerCase(),t=c.value[e])return t(e);try{return s.getDoc().queryCommandValue(e)}catch(n){}}},queryCommandSupported:function(e){if(e=e.toLowerCase(),c.exec[e])return!0;try{return s.getDoc().queryCommandSupported(e)}catch(t){}return!1},addCommands:e,addCommand:function(e,o,i){e=e.toLowerCase(),c.exec[e]=function(e,t,n,r){return o.call(i||s,t,n,r)}},addQueryStateHandler:function(e,t,n){e=e.toLowerCase(),c.state[e]=function(){return t.call(n||s)}},addQueryValueHandler:u,hasCustomCommand:function(e){return e=e.toLowerCase(),!!c.exec[e]}});var l=function(e,t,n){return t===undefined&&(t=!1),n===undefined&&(n=null),s.getDoc().execCommand(e,t,n)},f=function(e){return a.match(e)},d=function(e,t){a.toggle(e,t?{value:t}:undefined),s.nodeChanged()},m=function(e){t=i.getBookmark(e)},p=function(){i.moveToBookmark(t)};e({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){s.undoManager.add()},"Cut,Copy,Paste":function(e){var t,n=s.getDoc();try{l(e)}catch(o){t=!0}if("paste"!==e||n.queryCommandEnabled(e)||(t=!0),t||!n.queryCommandSupported(e)){var r=s.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");ve.mac&&(r=r.replace(/Ctrl\+/g,"\u2318+")),s.notificationManager.open({text:r,type:"error"})}},unlink:function(){if(i.isCollapsed()){var e=s.dom.getParent(s.selection.getStart(),"a");e&&s.dom.remove(e,!0)}else a.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(e){var t=e.substring(7);"full"===t&&(t="justify"),zm("left,center,right,justify".split(","),function(e){t!==e&&a.remove("align"+e)}),"none"!==t&&d("align"+t)},"InsertUnorderedList,InsertOrderedList":function(e){var t,n;l(e),(t=o.getParent(i.getNode(),"ol,ul"))&&(n=t.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(n.nodeName)&&(m(),o.split(n,t),p()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){d(e)},"ForeColor,HiliteColor":function(e,t,n){d(e,n)},FontName:function(e,t,n){var r,o;o=n,(r=s).formatter.toggle("fontname",{value:Zd(r,o)}),r.nodeChanged()},FontSize:function(e,t,n){var r,o;o=n,(r=s).formatter.toggle("fontsize",{value:Zd(r,o)}),r.nodeChanged()},RemoveFormat:function(e){a.remove(e)},mceBlockQuote:function(){d("blockquote")},FormatBlock:function(e,t,n){return d(n||"p")},mceCleanup:function(){var e=i.getBookmark();s.setContent(s.getContent()),i.moveToBookmark(e)},mceRemoveNode:function(e,t,n){var r=n||i.getNode();r!==s.getBody()&&(m(),s.dom.remove(r,!0),p())},mceSelectNodeDepth:function(e,t,n){var r=0;o.getParent(i.getNode(),function(e){if(1===e.nodeType&&r++===n)return i.select(e),!1},s.getBody())},mceSelectNode:function(e,t,n){i.select(n)},mceInsertContent:function(e,t,n){nl(s,n)},mceInsertRawHTML:function(e,t,n){var r=s.getContent();i.setContent("tiny_mce_marker"),s.setContent(r.replace(/tiny_mce_marker/g,function(){return n}))},mceToggleFormat:function(e,t,n){d(n)},mceSetContent:function(e,t,n){s.setContent(n)},"Indent,Outdent":function(e){Fm(s,e)},mceRepaint:function(){},InsertHorizontalRule:function(){s.execCommand("mceInsertContent",!1,"<hr />")},mceToggleVisualAid:function(){s.hasVisual=!s.hasVisual,s.addVisual()},mceReplaceContent:function(e,t,n){s.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,i.getContent({format:"text"})))},mceInsertLink:function(e,t,n){var r;"string"==typeof n&&(n={href:n}),r=o.getParent(i.getNode(),"a"),n.href=n.href.replace(" ","%20"),r&&n.href||a.remove("link"),n.href&&a.apply("link",n,r)},selectAll:function(){var e=o.getParent(i.getStart(),Oo.isContentEditableTrue);if(e){var t=o.createRng();t.selectNodeContents(e),i.setRng(t)}},"delete":function(){Kd(s)},forwardDelete:function(){Xd(s)},mceNewDocument:function(){s.setContent("")},InsertLineBreak:function(e,t,n){return vm(s,n),!0}});var g=function(n){return function(){var e=i.isCollapsed()?[o.getParent(i.getNode(),o.isBlock)]:i.getSelectedBlocks(),t=qm(e,function(e){return!!a.matchNode(e,n)});return-1!==Vm(t,!0)}};e({JustifyLeft:g("alignleft"),JustifyCenter:g("aligncenter"),JustifyRight:g("alignright"),JustifyFull:g("alignjustify"),"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return f(e)},mceBlockQuote:function(){return f("blockquote")},Outdent:function(){var e;if(n.inline_styles){if((e=o.getParent(i.getStart(),o.isBlock))&&0<parseInt(e.style.paddingLeft,10))return!0;if((e=o.getParent(i.getEnd(),o.isBlock))&&0<parseInt(e.style.paddingLeft,10))return!0}return r("InsertUnorderedList")||r("InsertOrderedList")||!n.inline_styles&&!!o.getParent(i.getNode(),"BLOCKQUOTE")},"InsertUnorderedList,InsertOrderedList":function(e){var t=o.getParent(i.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),e({Undo:function(){s.undoManager.undo()},Redo:function(){s.undoManager.redo()}}),u("FontName",function(){return Qd(t=s).fold(function(){return Jd(t).map(function(e){return Gd.getFontFamily(t.getBody(),e)}).getOr("")},function(e){return Gd.getFontFamily(t.getBody(),e)});var t},this),u("FontSize",function(){return Qd(t=s).fold(function(){return Jd(t).map(function(e){return Gd.getFontSize(t.getBody(),e)}).getOr("")},function(e){return Gd.getFontSize(t.getBody(),e)});var t},this)}var jm=It.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend"," "),$m=function(a){var u,s,c=this,l={},f=function(){return!1},d=function(){return!0};u=(a=a||{}).scope||c,s=a.toggleEvent||f;var r=function(e,t,n,r){var o,i,a;if(!1===t&&(t=f),t)for(t={func:t},r&&It.extend(t,r),a=(i=e.toLowerCase().split(" ")).length;a--;)e=i[a],(o=l[e])||(o=l[e]=[],s(e,!0)),n?o.unshift(t):o.push(t);return c},m=function(e,t){var n,r,o,i,a;if(e)for(n=(i=e.toLowerCase().split(" ")).length;n--;){if(e=i[n],r=l[e],!e){for(o in l)s(o,!1),delete l[o];return c}if(r){if(t)for(a=r.length;a--;)r[a].func===t&&(r=r.slice(0,a).concat(r.slice(a+1)),l[e]=r);else r.length=0;r.length||(s(e,!1),delete l[e])}}else{for(e in l)s(e,!1);l={}}return c};c.fire=function(e,t){var n,r,o,i;if(e=e.toLowerCase(),(t=t||{}).type=e,t.target||(t.target=u),t.preventDefault||(t.preventDefault=function(){t.isDefaultPrevented=d},t.stopPropagation=function(){t.isPropagationStopped=d},t.stopImmediatePropagation=function(){t.isImmediatePropagationStopped=d},t.isDefaultPrevented=f,t.isPropagationStopped=f,t.isImmediatePropagationStopped=f),a.beforeFire&&a.beforeFire(t),n=l[e])for(r=0,o=n.length;r<o;r++){if((i=n[r]).once&&m(e,i.func),t.isImmediatePropagationStopped())return t.stopPropagation(),t;if(!1===i.func.call(u,t))return t.preventDefault(),t}return t},c.on=r,c.off=m,c.once=function(e,t,n){return r(e,t,n,{once:!0})},c.has=function(e){return e=e.toLowerCase(),!(!l[e]||0===l[e].length)}};$m.isNative=function(e){return!!jm[e.toLowerCase()]};var Wm,Km=function(n){return n._eventDispatcher||(n._eventDispatcher=new $m({scope:n,toggleEvent:function(e,t){$m.isNative(e)&&n.toggleNativeEvent&&n.toggleNativeEvent(e,t)}})),n._eventDispatcher},Xm={fire:function(e,t,n){if(this.removed&&"remove"!==e)return t;if(t=Km(this).fire(e,t,n),!1!==n&&this.parent)for(var r=this.parent();r&&!t.isPropagationStopped();)r.fire(e,t,!1),r=r.parent();return t},on:function(e,t,n){return Km(this).on(e,t,n)},off:function(e,t){return Km(this).off(e,t)},once:function(e,t){return Km(this).once(e,t)},hasEventListeners:function(e){return Km(this).has(e)}},Ym=function(e,t){var n=lr.get(e,t);return n===undefined||""===n?[]:n.split(" ")},Gm=Ym,Jm=function(e,t,n){var r=Ym(e,t).concat([n]);lr.set(e,t,r.join(" "))},Qm=function(e,t,n){var r=H.filter(Ym(e,t),function(e){return e!==n});0<r.length?lr.set(e,t,r.join(" ")):lr.remove(e,t)},Zm=function(e){return Gm(e,"class")},ep=function(e,t){return Jm(e,"class",t)},tp=function(e,t){return Qm(e,"class",t)},np=Zm,rp=ep,op=tp,ip=function(e,t){H.contains(Zm(e),t)?tp(e,t):ep(e,t)},ap=function(e){return e.dom().classList!==undefined},up=function(e,t){return ap(e)&&e.dom().classList.contains(t)},sp={add:function(e,t){ap(e)?e.dom().classList.add(t):rp(e,t)},remove:function(e,t){var n;ap(e)?e.dom().classList.remove(t):op(e,t),0===(ap(n=e)?n.dom().classList:np(n)).length&&lr.remove(n,"class")},toggle:function(e,t){return ap(e)?e.dom().classList.toggle(t):ip(e,t)},toggler:function(e,t){var n,r,o,i,a,u,s=ap(e),c=e.dom().classList;return n=function(){s?c.remove(t):op(e,t)},r=function(){s?c.add(t):rp(e,t)},o=up(e,t),i=o||!1,{on:a=function(){r(),i=!0},off:u=function(){n(),i=!1},toggle:function(){(i?u:a)()},isOn:function(){return i}}},has:up},cp=function(e,t){return e.fire("PreProcess",t)},lp=function(e,t){return e.fire("PostProcess",t)},fp=function(e){return e.fire("remove")},dp=function(e,t){return e.fire("SwitchMode",{mode:t})},mp=function(e,t,n,r){e.fire("ObjectResizeStart",{target:t,width:n,height:r})},pp=function(e,t,n,r){e.fire("ObjectResized",{target:t,width:n,height:r})},gp=function(e,t,n){try{e.getDoc().execCommand(t,!1,n)}catch(r){}},hp=function(e,t){var n,r,o;n=Vn.fromDom(e.getBody()),r="mce-content-readonly",o=t,sp.has(n,r)&&!1===o?sp.remove(n,r):o&&sp.add(n,r),t?(e.selection.controlSelection.hideResizeRect(),e.readonly=!0,e.getBody().contentEditable="false"):(e.readonly=!1,e.getBody().contentEditable="true",gp(e,"StyleWithCSS",!1),gp(e,"enableInlineTableEditing",!1),gp(e,"enableObjectResizing",!1),e.focus(),e.nodeChanged())},vp=function(e){return e.readonly?"readonly":"design"},yp=vi.DOM,bp=function(e,t){return"selectionchange"===t?e.getDoc():!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t)?e.getDoc().documentElement:e.settings.event_root?(e.eventRoot||(e.eventRoot=yp.select(e.settings.event_root)[0]),e.eventRoot):e.getBody()},Cp=function(e,t,n){var r;(r=e).hidden||r.readonly?!0===e.readonly&&n.preventDefault():e.fire(t,n)},xp=function(i,a){var e,t;if(i.delegates||(i.delegates={}),!i.delegates[a]&&!i.removed)if(e=bp(i,a),i.settings.event_root){if(Wm||(Wm={},i.editorManager.on("removeEditor",function(){var e;if(!i.editorManager.activeEditor&&Wm){for(e in Wm)i.dom.unbind(bp(i,e));Wm=null}})),Wm[a])return;t=function(e){for(var t=e.target,n=i.editorManager.get(),r=n.length;r--;){var o=n[r].getBody();(o===t||yp.isChildOf(t,o))&&Cp(n[r],a,e)}},Wm[a]=t,yp.bind(e,a,t)}else t=function(e){Cp(i,a,e)},yp.bind(e,a,t),i.delegates[a]=t},wp={bindPendingEventDelegates:function(){var t=this;It.each(t._pendingNativeEvents,function(e){xp(t,e)})},toggleNativeEvent:function(e,t){var n=this;"focus"!==e&&"blur"!==e&&(t?n.initialized?xp(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(bp(n,e),e,n.delegates[e]),delete n.delegates[e]))},unbindAllNativeEvents:function(){var e,t=this,n=t.getBody(),r=t.dom;if(t.delegates){for(e in t.delegates)t.dom.unbind(bp(t,e),e,t.delegates[e]);delete t.delegates}!t.inline&&n&&r&&(n.onload=null,r.unbind(t.getWin()),r.unbind(t.getDoc())),r&&(r.unbind(n),r.unbind(t.getContainer()))}},Np=wp=It.extend({},Xm,wp),Ep=It.each,Sp=It.explode,kp={f9:120,f10:121,f11:122},Tp=It.makeMap("alt,ctrl,shift,meta,access");function Ap(i){var a={},r=[],u=function(e){var t,n,r={};for(n in Ep(Sp(e,"+"),function(e){e in Tp?r[e]=!0:/^[0-9]{2,}$/.test(e)?r.keyCode=parseInt(e,10):(r.charCode=e.charCodeAt(0),r.keyCode=kp[e]||e.toUpperCase().charCodeAt(0))}),t=[r.keyCode],Tp)r[n]?t.push(n):r[n]=!1;return r.id=t.join(","),r.access&&(r.alt=!0,ve.mac?r.ctrl=!0:r.shift=!0),r.meta&&(ve.mac?r.meta=!0:(r.ctrl=!0,r.meta=!1)),r},s=function(e,t,n,r){var o;return(o=It.map(Sp(e,">"),u))[o.length-1]=It.extend(o[o.length-1],{func:n,scope:r||i}),It.extend(o[0],{desc:i.translate(t),subpatterns:o.slice(1)})},o=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},c=function(e){return e.func?e.func.call(e.scope):null};i.on("keyup keypress keydown",function(t){var e,n;((n=t).altKey||n.ctrlKey||n.metaKey||"keydown"===(e=t).type&&112<=e.keyCode&&e.keyCode<=123)&&!t.isDefaultPrevented()&&(Ep(a,function(e){if(o(t,e))return r=e.subpatterns.slice(0),"keydown"===t.type&&c(e),!0}),o(t,r[0])&&(1===r.length&&"keydown"===t.type&&c(r[0]),r.shift()))}),this.add=function(e,n,r,o){var t;return"string"==typeof(t=r)?r=function(){i.execCommand(t,!1,null)}:It.isArray(t)&&(r=function(){i.execCommand(t[0],t[1],t[2])}),Ep(Sp(It.trim(e.toLowerCase())),function(e){var t=s(e,n,r,o);a[t.id]=t}),!0},this.remove=function(e){var t=s(e);return!!a[t.id]&&(delete a[t.id],!0)}}var Rp=function(e){var t=e!==undefined?e.dom():document;return A.from(t.activeElement).map(Vn.fromDom)},_p=function(e){var t=$r.owner(e).dom();return e.dom()===t.activeElement},Bp=function(t){return Rp($r.owner(t)).filter(function(e){return t.dom().contains(e.dom())})},Dp=function(t,e){return(n=e,n.collapsed?A.from(ua(n.startContainer,n.startOffset)).map(Vn.fromDom):A.none()).bind(function(e){return Co(e)?A.some(e):!1===Mr.contains(t,e)?A.some(t):A.none()});var n},Op=function(t,e){Dp(Vn.fromDom(t.getBody()),e).bind(function(e){return Qa.firstPositionIn(e.dom())}).fold(function(){t.selection.normalize()},function(e){return t.selection.setRng(e.toRange())})},Pp=function(e){if(e.setActive)try{e.setActive()}catch(t){e.focus()}else e.focus()},Lp=function(e){var t,n=e.getBody();return n&&(t=Vn.fromDom(n),_p(t)||Bp(t).isSome())},Ip=function(e){return e.inline?Lp(e):(t=e).iframeElement&&_p(Vn.fromDom(t.iframeElement));var t},Mp=function(e){return e.editorManager.setActive(e)},Fp=function(e,t){e.removed||(t?Mp(e):function(t){var e=t.selection,n=t.settings.content_editable,r=t.getBody(),o=e.getRng();t.quirks.refreshContentEditable();var i,a,u=(i=t,a=e.getNode(),i.dom.getParent(a,function(e){return"true"===i.dom.getContentEditable(e)}));if(t.$.contains(r,u))return Pp(u),Op(t,o),Mp(t);t.bookmark!==undefined&&!1===Ip(t)&&Mm(t).each(function(e){t.selection.setRng(e),o=e}),n||(ve.opera||Pp(r),t.getWin().focus()),(ve.gecko||n)&&(Pp(r),Op(t,o)),Mp(t)}(e))},zp=Ip,Up=function(e,t){return t.dom()[e]},qp=function(e,t){return parseInt(br(t,e),10)},Vp=V.curry(Up,"clientWidth"),Hp=V.curry(Up,"clientHeight"),jp=V.curry(qp,"margin-top"),$p=V.curry(qp,"margin-left"),Wp=function(e,t,n){var r,o,i,a,u,s,c,l,f,d,m=Vn.fromDom(e.getBody()),p=e.inline?m:$r.documentElement(m),g=(r=e.inline,i=t,a=n,u=(o=p).dom().getBoundingClientRect(),{x:i-(r?u.left+o.dom().clientLeft+$p(o):0),y:a-(r?u.top+o.dom().clientTop+jp(o):0)});return c=g.x,l=g.y,f=Vp(s=p),d=Hp(s),0<=c&&0<=l&&c<=f&&l<=d},Kp=function(e){var t,n=e.inline?e.getBody():e.getContentAreaContainer();return(t=n,A.from(t).map(Vn.fromDom)).map(function(e){return Mr.contains($r.owner(e),e)}).getOr(!1)};function Xp(n){var t,o=[],i=function(){var e,t=n.theme;return t&&t.getNotificationManagerImpl?t.getNotificationManagerImpl():{open:e=function(){throw new Error("Theme did not provide a NotificationManager implementation.")},close:e,reposition:e,getArgs:e}},a=function(){0<o.length&&i().reposition(o)},u=function(t){H.findIndex(o,function(e){return e===t}).each(function(e){o.splice(e,1)})},r=function(r){if(!n.removed&&Kp(n))return H.find(o,function(e){return t=i().getArgs(e),n=r,!(t.type!==n.type||t.text!==n.text||t.progressBar||t.timeout||n.progressBar||n.timeout);var t,n}).getOrThunk(function(){n.editorManager.setActive(n);var e,t=i().open(r,function(){u(t),a()});return e=t,o.push(e),a(),t})};return(t=n).on("SkinLoaded",function(){var e=t.settings.service_message;e&&r({text:e,type:"warning",timeout:0,icon:""})}),t.on("ResizeEditor ResizeWindow",function(){we.requestAnimationFrame(a)}),t.on("remove",function(){H.each(o,function(e){i().close(e)})}),{open:r,close:function(){A.from(o[0]).each(function(e){i().close(e),u(e),a()})},getNotifications:function(){return o}}}function Yp(r){var o=[],i=function(){var e,t=r.theme;return t&&t.getWindowManagerImpl?t.getWindowManagerImpl():{open:e=function(){throw new Error("Theme did not provide a WindowManager implementation.")},alert:e,confirm:e,close:e,getParams:e,setParams:e}},a=function(e,t){return function(){return t?t.apply(e,arguments):undefined}},u=function(e){var t;o.push(e),t=e,r.fire("OpenWindow",{win:t})},s=function(n){H.findIndex(o,function(e){return e===n}).each(function(e){var t;o.splice(e,1),t=n,r.fire("CloseWindow",{win:t}),0===o.length&&r.focus()})},e=function(){return A.from(o[o.length-1])};return r.on("remove",function(){H.each(o.slice(0),function(e){i().close(e)})}),{windows:o,open:function(e,t){r.editorManager.setActive(r),Lm(r);var n=i().open(e,t,s);return u(n),n},alert:function(e,t,n){var r=i().alert(e,a(n||this,t),s);u(r)},confirm:function(e,t,n){var r=i().confirm(e,a(n||this,t),s);u(r)},close:function(){e().each(function(e){i().close(e),s(e)})},getParams:function(){return e().map(i().getParams).getOr(null)},setParams:function(t){e().each(function(e){i().setParams(e,t)})},getWindows:function(){return o}}}var Gp=Si.PluginManager,Jp=function(e,t){var n=function(e,t){for(var n in Gp.urls)if(Gp.urls[n]+"/plugin"+t+".js"===e)return n;return null}(t,e.suffix);return n?"Failed to load plugin: "+n+" from url "+t:"Failed to load plugin url: "+t},Qp=function(e,t){e.notificationManager.open({type:"error",text:t})},Zp=function(e,t){e._skinLoaded?Qp(e,t):e.on("SkinLoaded",function(){Qp(e,t)})},eg=function(e,t){Zp(e,Jp(e,t))},tg=function(e,t){Zp(e,"Failed to upload image: "+t)},ng=Zp,rg=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=window.console;r&&(r.error?r.error.apply(r,arguments):r.log.apply(r,arguments))},og=Si.PluginManager,ig=Si.ThemeManager;function ag(){return new(W.getOrDie("XMLHttpRequest"))}function ug(u,s){var r={},n=function(e,r,o,t){var i,n;(i=new ag).open("POST",s.url),i.withCredentials=s.credentials,i.upload.onprogress=function(e){t(e.loaded/e.total*100)},i.onerror=function(){o("Image upload failed due to a XHR Transport error. Code: "+i.status)},i.onload=function(){var e,t,n;i.status<200||300<=i.status?o("HTTP Error: "+i.status):(e=JSON.parse(i.responseText))&&"string"==typeof e.location?r((t=s.basePath,n=e.location,t?t.replace(/\/$/,"")+"/"+n.replace(/^\//,""):n)):o("Invalid JSON: "+i.responseText)},(n=new FormData).append("file",e.blob(),e.filename()),i.send(n)},c=function(e,t){return{url:t,blobInfo:e,status:!0}},l=function(e,t){return{url:"",blobInfo:e,status:!1,error:t}},f=function(e,t){It.each(r[e],function(e){e(t)}),delete r[e]},o=function(e,n){return e=It.grep(e,function(e){return!u.isUploaded(e.blobUri())}),ye.all(It.map(e,function(e){return u.isPending(e.blobUri())?(t=e.blobUri(),new ye(function(e){r[t]=r[t]||[],r[t].push(e)})):(o=e,i=s.handler,a=n,u.markPending(o.blobUri()),new ye(function(t){var n;try{var r=function(){n&&n.close()};i(o,function(e){r(),u.markUploaded(o.blobUri(),e),f(o.blobUri(),c(o,e)),t(c(o,e))},function(e){r(),u.removeFailed(o.blobUri()),f(o.blobUri(),l(o,e)),t(l(o,e))},function(e){e<0||100<e||(n||(n=a()),n.progressBar.value(e))})}catch(e){t(l(o,e.message))}}));var o,i,a,t}))};return s=It.extend({credentials:!1,handler:n},s),{upload:function(e,t){return s.url||s.handler!==n?o(e,t):new ye(function(e){e([])})}}}function sg(e,t){return new(W.getOrDie("Blob"))(e,t)}function cg(){return new(W.getOrDie("FileReader"))}function lg(e){return new(W.getOrDie("Uint8Array"))(e)}var fg=function(e){return W.getOrDie("atob")(e)},dg=function(e){var t,n;return e=decodeURIComponent(e).split(","),(n=/data:([^;]+)/.exec(e[0]))&&(t=n[1]),{type:t,data:e[1]}},mg=function(e){return 0===e.indexOf("blob:")?(i=e,new ye(function(e,t){var n=function(){t("Cannot convert "+i+" to Blob. Resource might not exist or is inaccessible.")};try{var r=new ag;r.open("GET",i,!0),r.responseType="blob",r.onload=function(){200===this.status?e(this.response):n()},r.onerror=n,r.send()}catch(o){n()}})):0===e.indexOf("data:")?(o=e,new ye(function(e){var t,n,r;o=dg(o);try{t=fg(o.data)}catch(Dw){return void e(new sg([]))}for(n=new lg(t.length),r=0;r<n.length;r++)n[r]=t.charCodeAt(r);e(new sg([n],{type:o.type}))})):null;var i,o},pg=function(n){return new ye(function(e){var t=new cg;t.onloadend=function(){e(t.result)},t.readAsDataURL(n)})},gg=dg,hg=0,vg=function(e){return(e||"blobid")+hg++},yg=function(n,r,o,t){var i,a;0!==r.src.indexOf("blob:")?(i=gg(r.src).data,(a=n.findFirst(function(e){return e.base64()===i}))?o({image:r,blobInfo:a}):mg(r.src).then(function(e){a=n.create(vg(),e,i),n.add(a),o({image:r,blobInfo:a})},function(e){t(e)})):(a=n.getByUri(r.src))?o({image:r,blobInfo:a}):mg(r.src).then(function(t){pg(t).then(function(e){i=gg(e).data,a=n.create(vg(),t,i),n.add(a),o({image:r,blobInfo:a})})},function(e){t(e)})},bg=function(e){return e?e.getElementsByTagName("img"):[]},Cg=0,xg={uuid:function(e){return e+Cg+++(t=function(){return Math.round(4294967295*Math.random()).toString(36)},"s"+(new Date).getTime().toString(36)+t()+t()+t());var t}};function wg(u){var n,o,i,t,e,a,r,s,c,l,f=(n=[],o=da.constant,i=function(e){var t,n,r;if(!e.blob||!e.base64)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");return t=e.id||xg.uuid("blobid"),n=e.name||t,{id:o(t),name:o(n),filename:o(n+"."+(r=e.blob.type,{"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png"}[r.toLowerCase()]||"dat")),blob:o(e.blob),base64:o(e.base64),blobUri:o(e.blobUri||X.createObjectURL(e.blob)),uri:o(e.uri)}},{create:function(e,t,n,r){return i("object"==typeof e?e:{id:e,name:r,blob:t,base64:n})},add:function(e){t(e.id())||n.push(e)},get:t=function(t){return e(function(e){return e.id()===t})},getByUri:function(t){return e(function(e){return e.blobUri()===t})},findFirst:e=function(e){return Bt.filter(n,e)[0]},removeByUri:function(t){n=Bt.filter(n,function(e){return e.blobUri()!==t||(X.revokeObjectURL(e.blobUri()),!1)})},destroy:function(){Bt.each(n,function(e){X.revokeObjectURL(e.blobUri())}),n=[]}}),d=u.settings,m=(s={},c=function(e,t){return{status:e,resultUri:t}},{hasBlobUri:l=function(e){return e in s},getResultUri:function(e){var t=s[e];return t?t.resultUri:null},isPending:function(e){return!!l(e)&&1===s[e].status},isUploaded:function(e){return!!l(e)&&2===s[e].status},markPending:function(e){s[e]=c(1,null)},markUploaded:function(e,t){s[e]=c(2,t)},removeFailed:function(e){delete s[e]},destroy:function(){s={}}}),p=function(t){return function(e){return u.selection?t(e):[]}},g=function(e,t,n){for(var r=0;-1!==(r=e.indexOf(t,r))&&(e=e.substring(0,r)+n+e.substr(r+t.length),r+=n.length-t.length+1),-1!==r;);return e},h=function(e,t,n){return e=g(e,'src="'+t+'"','src="'+n+'"'),e=g(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')},v=function(t,n){Bt.each(u.undoManager.data,function(e){"fragmented"===e.type?e.fragments=Bt.map(e.fragments,function(e){return h(e,t,n)}):e.content=h(e.content,t,n)})},y=function(){return u.notificationManager.open({text:u.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0})},b=function(e,t){f.removeByUri(e.src),v(e.src,t),u.$(e).attr({src:d.images_reuse_filename?t+"?"+(new Date).getTime():t,"data-mce-src":u.convertURL(t,"src")})},C=function(n){return a||(a=ug(m,{url:d.images_upload_url,basePath:d.images_upload_base_path,credentials:d.images_upload_credentials,handler:d.images_upload_handler})),N().then(p(function(r){var e;return e=Bt.map(r,function(e){return e.blobInfo}),a.upload(e,y).then(p(function(e){var t=Bt.map(e,function(e,t){var n=r[t].image;return e.status&&!1!==u.settings.images_replace_blob_uris?b(n,e.url):e.error&&tg(u,e.error),{element:n,status:e.status}});return n&&n(t),t}))}))},x=function(e){if(!1!==d.automatic_uploads)return C(e)},w=function(e){return!d.images_dataimg_filter||d.images_dataimg_filter(e)},N=function(){var o,i,a;return r||(o=m,i=f,a={},r={findAll:function(e,n){var t;n||(n=da.constant(!0)),t=Bt.filter(bg(e),function(e){var t=e.src;return!!ve.fileApi&&!e.hasAttribute("data-mce-bogus")&&!e.hasAttribute("data-mce-placeholder")&&!(!t||t===ve.transparentSrc)&&(0===t.indexOf("blob:")?!o.isUploaded(t):0===t.indexOf("data:")&&n(e))});var r=Bt.map(t,function(n){if(a[n.src])return new ye(function(t){a[n.src].then(function(e){if("string"==typeof e)return e;t({image:n,blobInfo:e.blobInfo})})});var e=new ye(function(e,t){yg(i,n,e,t)}).then(function(e){return delete a[e.image.src],e})["catch"](function(e){return delete a[n.src],e});return a[n.src]=e});return ye.all(r)}}),r.findAll(u.getBody(),w).then(p(function(e){return e=Bt.filter(e,function(e){return"string"!=typeof e||(ng(u,e),!1)}),Bt.each(e,function(e){v(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")}),e}))},E=function(e){return e.replace(/src="(blob:[^"]+)"/g,function(e,n){var t=m.getResultUri(n);if(t)return'src="'+t+'"';var r=f.getByUri(n);return r||(r=Bt.reduce(u.editorManager.get(),function(e,t){return e||t.editorUpload&&t.editorUpload.blobCache.getByUri(n)},null)),r?'src="data:'+r.blob().type+";base64,"+r.base64()+'"':e})};return u.on("setContent",function(){!1!==u.settings.automatic_uploads?x():N()}),u.on("RawSaveContent",function(e){e.content=E(e.content)}),u.on("getContent",function(e){e.source_view||"raw"===e.format||(e.content=E(e.content))}),u.on("PostRender",function(){u.parser.addNodeFilter("img",function(e){Bt.each(e,function(e){var t=e.attr("src");if(!f.getByUri(t)){var n=m.getResultUri(t);n&&e.attr("src",n)}})})}),{blobCache:f,uploadImages:C,uploadImagesAuto:x,scanForImages:N,destroy:function(){f.destroy(),m.destroy(),r=a=null}}}var Ng=function(e,t){return e.hasOwnProperty(t.nodeName)},Eg=function(e,t){if(Oo.isText(t)){if(0===t.nodeValue.length)return!0;if(/^\s+$/.test(t.nodeValue)&&(!t.nextSibling||Ng(e,t.nextSibling)))return!0}return!1},Sg=function(e){var t,n,r,o,i,a,u,s,c,l,f,d=e.settings,m=e.dom,p=e.selection,g=e.schema,h=g.getBlockElements(),v=p.getStart(),y=e.getBody();if(f=d.forced_root_block,v&&Oo.isElement(v)&&f&&(l=y.nodeName.toLowerCase(),g.isValidChild(l,f.toLowerCase())&&(b=h,C=y,x=v,!H.exists(Hl(Vn.fromDom(x),Vn.fromDom(C)),function(e){return Ng(b,e.dom())})))){var b,C,x,w,N;for(n=(t=p.getRng()).startContainer,r=t.startOffset,o=t.endContainer,i=t.endOffset,c=zp(e),v=y.firstChild;v;)if(w=h,N=v,Oo.isText(N)||Oo.isElement(N)&&!Ng(w,N)&&!Mc(N)){if(Eg(h,v)){v=(u=v).nextSibling,m.remove(u);continue}a||(a=m.create(f,e.settings.forced_root_block_attrs),v.parentNode.insertBefore(a,v),s=!0),v=(u=v).nextSibling,a.appendChild(u)}else a=null,v=v.nextSibling;s&&c&&(t.setStart(n,r),t.setEnd(o,i),p.setRng(t),e.nodeChanged())}},kg=function(e){e.settings.forced_root_block&&e.on("NodeChange",V.curry(Sg,e))},Tg=function(t){return $r.firstChild(t).fold(V.constant([t]),function(e){return[t].concat(Tg(e))})},Ag=function(t){return $r.lastChild(t).fold(V.constant([t]),function(e){return"br"===Zn.name(e)?$r.prevSibling(e).map(function(e){return[t].concat(Ag(e))}).getOr([]):[t].concat(Ag(e))})},Rg=function(o,e){return ma([(i=e,a=i.startContainer,u=i.startOffset,Oo.isText(a)?0===u?A.some(Vn.fromDom(a)):A.none():A.from(a.childNodes[u]).map(Vn.fromDom)),(t=e,n=t.endContainer,r=t.endOffset,Oo.isText(n)?r===n.data.length?A.some(Vn.fromDom(n)):A.none():A.from(n.childNodes[r-1]).map(Vn.fromDom))],function(e,t){var n=H.find(Tg(o),V.curry(Mr.eq,e)),r=H.find(Ag(o),V.curry(Mr.eq,t));return n.isSome()&&r.isSome()}).getOr(!1);var t,n,r,i,a,u},_g=function(e,t,n,r){var o=n,i=new ao(n,o),a=e.schema.getNonEmptyElements();do{if(3===n.nodeType&&0!==It.trim(n.nodeValue).length)return void(r?t.setStart(n,0):t.setEnd(n,n.nodeValue.length));if(a[n.nodeName]&&!/^(TD|TH)$/.test(n.nodeName))return void(r?t.setStartBefore(n):"BR"===n.nodeName?t.setEndBefore(n):t.setEndAfter(n));if(ve.ie&&ve.ie<11&&e.isBlock(n)&&e.isEmpty(n))return void(r?t.setStart(n,0):t.setEnd(n,0))}while(n=r?i.next():i.prev());"BODY"===o.nodeName&&(r?t.setStart(o,0):t.setEnd(o,o.childNodes.length))},Bg=function(e){var t=e.selection.getSel();return t&&0<t.rangeCount};function Dg(i){var r,o=[];"onselectionchange"in i.getDoc()||i.on("NodeChange Click MouseUp KeyUp Focus",function(e){var t,n;n={startContainer:(t=i.selection.getRng()).startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset},"nodechange"!==e.type&&em(n,r)||i.fire("SelectionChange"),r=n}),i.on("contextmenu",function(){i.fire("SelectionChange")}),i.on("SelectionChange",function(){var e=i.selection.getStart(!0);!e||!ve.range&&i.selection.isCollapsed()||Bg(i)&&!function(e){var t,n;if((n=i.$(e).parentsUntil(i.getBody()).add(e)).length===o.length){for(t=n.length;0<=t&&n[t]===o[t];t--);if(-1===t)return o=n,!0}return o=n,!1}(e)&&i.dom.isChildOf(e,i.getBody())&&i.nodeChanged({selectionChange:!0})}),i.on("MouseUp",function(e){!e.isDefaultPrevented()&&Bg(i)&&("IMG"===i.selection.getNode().nodeName?we.setEditorTimeout(i,function(){i.nodeChanged()}):i.nodeChanged())}),this.nodeChanged=function(e){var t,n,r,o=i.selection;i.initialized&&o&&!i.settings.disable_nodechange&&!i.readonly&&(r=i.getBody(),(t=o.getStart(!0)||r).ownerDocument===i.getDoc()&&i.dom.isChildOf(t,r)||(t=r),n=[],i.dom.getParent(t,function(e){if(e===r)return!0;n.push(e)}),(e=e||{}).element=t,e.parents=n,i.fire("NodeChange",e))}}var Og,Pg,Lg=function(e){var t,n,r,o;return o=e.getBoundingClientRect(),n=(t=e.ownerDocument).documentElement,r=t.defaultView,{top:o.top+r.pageYOffset-n.clientTop,left:o.left+r.pageXOffset-n.clientLeft}},Ig=function(e,t){return n=(u=e).inline?Lg(u.getBody()):{left:0,top:0},a=(i=e).getBody(),r=i.inline?{left:a.scrollLeft,top:a.scrollTop}:{left:0,top:0},{pageX:(o=function(e,t){if(t.target.ownerDocument!==e.getDoc()){var n=Lg(e.getContentAreaContainer()),r=(i=(o=e).getBody(),a=o.getDoc().documentElement,u={left:i.scrollLeft,top:i.scrollTop},s={left:i.scrollLeft||a.scrollLeft,top:i.scrollTop||a.scrollTop},o.inline?u:s);return{left:t.pageX-n.left+r.left,top:t.pageY-n.top+r.top}}var o,i,a,u,s;return{left:t.pageX,top:t.pageY}}(e,t)).left-n.left+r.left,pageY:o.top-n.top+r.top};var n,r,o,i,a,u},Mg=Oo.isContentEditableFalse,Fg=Oo.isContentEditableTrue,zg=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},Ug=function(u,s){return function(e){if(0===e.button){var t=Bt.find(s.dom.getParents(e.target),da.or(Mg,Fg));if(i=s.getBody(),Mg(a=t)&&a!==i){var n=s.dom.getPos(t),r=s.getBody(),o=s.getDoc().documentElement;u.element=t,u.screenX=e.screenX,u.screenY=e.screenY,u.maxX=(s.inline?r.scrollWidth:o.offsetWidth)-2,u.maxY=(s.inline?r.scrollHeight:o.offsetHeight)-2,u.relX=e.pageX-n.x,u.relY=e.pageY-n.y,u.width=t.offsetWidth,u.height=t.offsetHeight,u.ghost=function(e,t,n,r){var o=t.cloneNode(!0);e.dom.setStyles(o,{width:n,height:r}),e.dom.setAttrib(o,"data-mce-selected",null);var i=e.dom.create("div",{"class":"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return e.dom.setStyles(i,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:r}),e.dom.setStyles(o,{margin:0,boxSizing:"border-box"}),i.appendChild(o),i}(s,t,u.width,u.height)}}var i,a}},qg=function(l,f){return function(e){if(l.dragging&&(s=(i=f).selection,c=s.getSel().getRangeAt(0).startContainer,a=3===c.nodeType?c.parentNode:c,u=l.element,a!==u&&!i.dom.isChildOf(a,u)&&!Mg(a))){var t=(r=l.element,(o=r.cloneNode(!0)).removeAttribute("data-mce-selected"),o),n=f.fire("drop",{targetClone:t,clientX:e.clientX,clientY:e.clientY});n.isDefaultPrevented()||(t=n.targetClone,f.undoManager.transact(function(){zg(l.element),f.insertContent(f.dom.getOuterHTML(t)),f._selectionOverrides.hideFakeCaret()}))}var r,o,i,a,u,s,c;Vg(l)}},Vg=function(e){e.dragging=!1,e.element=null,zg(e.ghost)},Hg=function(e){var t,n,r,o,i,a,g,h,v,u,s,c={};t=vi.DOM,a=document,n=Ug(c,e),g=c,h=e,v=we.throttle(function(e,t){h._selectionOverrides.hideFakeCaret(),h.selection.placeCaretAt(e,t)},0),r=function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m=Math.max(Math.abs(e.screenX-g.screenX),Math.abs(e.screenY-g.screenY));if(g.element&&!g.dragging&&10<m){if(h.fire("dragstart",{target:g.element}).isDefaultPrevented())return;g.dragging=!0,h.focus()}if(g.dragging){var p=(f=g,{pageX:(d=Ig(h,e)).pageX-f.relX,pageY:d.pageY+5});c=g.ghost,l=h.getBody(),c.parentNode!==l&&l.appendChild(c),t=g.ghost,n=p,r=g.width,o=g.height,i=g.maxX,a=g.maxY,s=u=0,t.style.left=n.pageX+"px",t.style.top=n.pageY+"px",n.pageX+r>i&&(u=n.pageX+r-i),n.pageY+o>a&&(s=n.pageY+o-a),t.style.width=r-u+"px",t.style.height=o-s+"px",v(e.clientX,e.clientY)}},o=qg(c,e),u=c,i=function(){u.dragging&&s.fire("dragend"),Vg(u)},(s=e).on("mousedown",n),e.on("mousemove",r),e.on("mouseup",o),t.bind(a,"mousemove",r),t.bind(a,"mouseup",i),e.on("remove",function(){t.unbind(a,"mousemove",r),t.unbind(a,"mouseup",i)})},jg=function(e){var n;Hg(e),(n=e).on("drop",function(e){var t="undefined"!=typeof e.clientX?n.getDoc().elementFromPoint(e.clientX,e.clientY):null;(Mg(t)||Mg(n.dom.getContentEditableParent(t)))&&e.preventDefault()})},$g=function(e){return Bt.reduce(e,function(e,t){return e.concat(function(t){var e=function(e){return Bt.map(e,function(e){return(e=ta(e)).node=t,e})};if(Oo.isElement(t))return e(t.getClientRects());if(Oo.isText(t)){var n=t.ownerDocument.createRange();return n.setStart(t,0),n.setEnd(t,t.data.length),e(n.getClientRects())}}(t))},[])};(Pg=Og||(Og={}))[Pg.Up=-1]="Up",Pg[Pg.Down=1]="Down";var Wg=function(o,i,a,e,u,t){var n,s,c=0,l=[],r=function(e){var t,n,r;for(r=$g([e]),-1===o&&(r=r.reverse()),t=0;t<r.length;t++)if(n=r[t],!a(n,s)){if(0<l.length&&i(n,Bt.last(l))&&c++,n.line=c,u(n))return!0;l.push(n)}};return(s=Bt.last(t.getClientRects()))&&(r(n=t.getNode()),function(e,t,n,r){for(;r=vs(r,e,Zi,t);)if(n(r))return}(o,e,r,n)),l},Kg=V.curry(Wg,Og.Up,oa,ia),Xg=V.curry(Wg,Og.Down,ia,oa),Yg=function(n){return function(e){return t=n,e.line>t;var t}},Gg=function(n){return function(e){return t=n,e.line===t;var t}},Jg=Oo.isContentEditableFalse,Qg=vs,Zg=function(e,t){return Math.abs(e.left-t)},eh=function(e,t){return Math.abs(e.right-t)},th=function(e,t){return e>=t.left&&e<=t.right},nh=function(e,o){return Bt.reduce(e,function(e,t){var n,r;return n=Math.min(Zg(e,o),eh(e,o)),r=Math.min(Zg(t,o),eh(t,o)),th(o,t)?t:th(o,e)?e:r===n&&Jg(t.node)?t:r<n?t:e})},rh=function(e,t,n,r){for(;r=Qg(r,e,Zi,t);)if(n(r))return},oh=function(e,t,n){var r,o,i,a,u,s,c,l,f=$g((o=e,Bt.filter(Bt.toArray(o.getElementsByTagName("*")),as))),d=Bt.filter(f,function(e){return n>=e.top&&n<=e.bottom});return(r=nh(d,t))&&(r=nh((u=e,l=function(t,e){var n;return n=Bt.filter($g([e]),function(e){return!t(e,s)}),c=c.concat(n),0===n.length},(c=[]).push(s=r),rh(Og.Up,u,V.curry(l,oa),s.node),rh(Og.Down,u,V.curry(l,ia),s.node),c),t))&&as(r.node)?(a=t,{node:(i=r).node,before:Zg(i,a)<eh(i,a)}):null},ih=function(i,a,e){return!e.collapsed&&H.foldl(e.getClientRects(),function(e,t){return e||(o=a,(r=i)>=(n=t).left&&r<=n.right&&o>=n.top&&o<=n.bottom);var n,r,o},!1)},ah=function(t,n){var r=null;return{cancel:function(){null!==r&&(clearTimeout(r),r=null)},throttle:function(){var e=arguments;null===r&&(r=setTimeout(function(){t.apply(null,e),e=r=null},n))}}},uh=function(t){var e=ah(function(){if(!t.removed&&t.selection.getRng().collapsed){var e=ou(t,t.selection.getRng(),!1);t.selection.setRng(e)}},0);t.on("focus",function(){e.throttle()}),t.on("blur",function(){e.cancel()})},sh={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(e){return e.shiftKey||e.ctrlKey||e.altKey||this.metaKeyPressed(e)},metaKeyPressed:function(e){return ve.mac?e.metaKey:e.ctrlKey&&!e.altKey}},ch=Oo.isContentEditableTrue,lh=Oo.isContentEditableFalse,fh=Bs,dh=_s,mh=function(e,t){for(var n=e.getBody();t&&t!==n;){if(ch(t)||lh(t))return t;t=t.parentNode}return null},ph=function(p){var g,e,t,a=p.getBody(),o=is(p.getBody(),function(e){return p.dom.isBlock(e)},function(){return zp(p)}),h="sel-"+p.dom.uniqueId(),u=function(e){e&&p.selection.setRng(e)},s=function(){return p.selection.getRng()},v=function(e,t,n,r){return void 0===r&&(r=!0),p.fire("ShowCaret",{target:t,direction:e,before:n}).isDefaultPrevented()?null:(r&&p.selection.scrollIntoView(t,-1===e),o.show(n,t))},y=function(e,t){return t=Ss(e,a,t),-1===e?La.fromRangeStart(t):La.fromRangeEnd(t)},n=function(e){return Li(e)||Ui(e)||qi(e)},b=function(e){return n(e.startContainer)||n(e.endContainer)},c=function(e,t){var n,r,o,i,a,u,s,c,l,f,d=p.$,m=p.dom;if(!e)return null;if(e.collapsed){if(!b(e))if(!1===t){if(c=y(-1,e),as(c.getNode(!0)))return v(-1,c.getNode(!0),!1,!1);if(as(c.getNode()))return v(-1,c.getNode(),!c.isAtEnd(),!1)}else{if(c=y(1,e),as(c.getNode()))return v(1,c.getNode(),!c.isAtEnd(),!1);if(as(c.getNode(!0)))return v(1,c.getNode(!0),!1,!1)}return null}return i=e.startContainer,a=e.startOffset,u=e.endOffset,3===i.nodeType&&0===a&&lh(i.parentNode)&&(i=i.parentNode,a=m.nodeIndex(i),i=i.parentNode),1!==i.nodeType?null:(u===a+1&&(n=i.childNodes[a]),lh(n)?(l=f=n.cloneNode(!0),(s=p.fire("ObjectSelected",{target:n,targetClone:l})).isDefaultPrevented()?null:(r=Tl(Vn.fromDom(p.getBody()),"#"+h).fold(function(){return d([])},function(e){return d([e.dom()])}),l=s.targetClone,0===r.length&&(r=d('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>').attr("id",h)).appendTo(p.getBody()),e=p.dom.createRng(),l===f&&ve.ie?(r.empty().append('<p style="font-size: 0" data-mce-bogus="all">\xa0</p>').append(l),e.setStartAfter(r[0].firstChild.firstChild),e.setEndAfter(l)):(r.empty().append("\xa0").append(l).append("\xa0"),e.setStart(r[0].firstChild,1),e.setEnd(r[0].lastChild,0)),r.css({top:m.getPos(n,p.getBody()).y}),r[0].focus(),(o=p.selection.getSel()).removeAllRanges(),o.addRange(e),H.each(hu(Vn.fromDom(p.getBody()),"*[data-mce-selected]"),function(e){lr.remove(e,"data-mce-selected")}),n.setAttribute("data-mce-selected","1"),g=n,C(),e)):null)},l=function(){g&&g.removeAttribute("data-mce-selected"),Tl(Vn.fromDom(p.getBody()),"#"+h).each(Hc.remove),g=null},C=function(){o.hide()};return ve.ceFalse&&(function(){p.on("mouseup",function(e){var t=s();t.collapsed&&Wp(p,e.clientX,e.clientY)&&u(ru(p,t,!1))}),p.on("click",function(e){var t;(t=mh(p,e.target))&&(lh(t)&&(e.preventDefault(),p.focus()),ch(t)&&p.dom.isChildOf(t,p.selection.getNode())&&l())}),p.on("blur NewBlock",function(){l()}),p.on("ResizeWindow FullscreenStateChanged",function(){return o.reposition()});var n,r,i=function(e,t){var n,r,o=p.dom.getParent(e,p.dom.isBlock),i=p.dom.getParent(t,p.dom.isBlock);return!(!o||!p.dom.isChildOf(o,i)||!1!==lh(mh(p,o)))||o&&(n=o,r=i,!(p.dom.getParent(n,p.dom.isBlock)===p.dom.getParent(r,p.dom.isBlock)))&&function(e){var t=Ys(e);if(!e.firstChild)return!1;var n=La.before(e.firstChild),r=t.next(n);return r&&!dh(r)&&!fh(r)}(o)};r=!1,(n=p).on("touchstart",function(){r=!1}),n.on("touchmove",function(){r=!0}),n.on("touchend",function(e){var t=mh(n,e.target);lh(t)&&(r||(e.preventDefault(),c(nu(n,t))))}),p.on("mousedown",function(e){var t,n=e.target;if((n===a||"HTML"===n.nodeName||p.dom.isChildOf(n,a))&&!1!==Wp(p,e.clientX,e.clientY))if(t=mh(p,n))lh(t)?(e.preventDefault(),c(nu(p,t))):(l(),ch(t)&&e.shiftKey||ih(e.clientX,e.clientY,p.selection.getRng())||(C(),p.selection.placeCaretAt(e.clientX,e.clientY)));else if(!1===as(n)){l(),C();var r=oh(a,e.clientX,e.clientY);if(r&&!i(e.target,r.node)){e.preventDefault();var o=v(1,r.node,r.before,!1);p.getBody().focus(),u(o)}}}),p.on("keypress",function(e){sh.modifierPressed(e)||(e.keyCode,lh(p.selection.getNode())&&e.preventDefault())}),p.on("getSelectionRange",function(e){var t=e.range;if(g){if(!g.parentNode)return void(g=null);(t=t.cloneRange()).selectNode(g),e.range=t}}),p.on("setSelectionRange",function(e){var t;(t=c(e.range,e.forward))&&(e.range=t)}),p.on("AfterSetSelectionRange",function(e){var t,n=e.range;b(n)||C(),t=n.startContainer.parentNode,p.dom.hasClass(t,"mce-offscreen-selection")||l()}),p.on("copy",function(e){var t,n=e.clipboardData;if(!e.isDefaultPrevented()&&e.clipboardData&&!ve.ie){var r=(t=p.dom.get(h))?t.getElementsByTagName("*")[0]:t;r&&(e.preventDefault(),n.clearData(),n.setData("text/html",r.outerHTML),n.setData("text/plain",r.outerText))}}),jg(p),uh(p)}(),e=p.contentStyles,t=".mce-content-body",e.push(o.getCss()),e.push(t+" .mce-offscreen-selection {position: absolute;left: -9999999999px;max-width: 1000000px;}"+t+" *[contentEditable=false] {cursor: default;}"+t+" *[contentEditable=true] {cursor: text;}")),{showCaret:v,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(Vi(e),u(s()),p.selection.scrollIntoView(e[0]))},hideFakeCaret:C,destroy:function(){o.destroy(),g=null}}},gh=function(e,t,n){var r,o,i,a,u=1;for(a=e.getShortEndedElements(),(i=/<([!?\/])?([A-Za-z0-9\-_\:\.]+)((?:\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g).lastIndex=r=n;o=i.exec(t);){if(r=i.lastIndex,"/"===o[1])u--;else if(!o[1]){if(o[2]in a)continue;u++}if(0===u)break}return r};function hh(F,z){void 0===z&&(z=oi());var e=function(){};!1!==(F=F||{}).fix_self_closing&&(F.fix_self_closing=!0);var U=F.comment?F.comment:e,q=F.cdata?F.cdata:e,V=F.text?F.text:e,H=F.start?F.start:e,j=F.end?F.end:e,$=F.pi?F.pi:e,W=F.doctype?F.doctype:e;return{parse:function(e){var t,n,r,d,o,i,a,m,u,s,p,c,g,l,f,h,v,y,b,C,x,w,N,E,S,k,T,A,R,_=0,B=[],D=0,O=Ko.decode,P=It.makeMap("src,href,data,background,formaction,poster,xlink:href"),L=/((java|vb)script|mhtml):/i,I=function(e){var t,n;for(t=B.length;t--&&B[t].name!==e;);if(0<=t){for(n=B.length-1;t<=n;n--)(e=B[n]).valid&&j(e.name);B.length=t}},M=function(e,t,n,r,o){var i,a,u,s,c;if(n=(t=t.toLowerCase())in p?t:O(n||r||o||""),g&&!m&&0==(0===(u=t).indexOf("data-")||0===u.indexOf("aria-"))){if(!(i=y[t])&&b){for(a=b.length;a--&&!(i=b[a]).pattern.test(t););-1===a&&(i=null)}if(!i)return;if(i.validValues&&!(n in i.validValues))return}if(P[t]&&!F.allow_script_urls){var l=n.replace(/[\s\u0000-\u001F]+/g,"");try{l=decodeURIComponent(l)}catch(f){l=unescape(l)}if(L.test(l))return;if(c=l,!(s=F).allow_html_data_urls&&(/^data:image\//i.test(c)?!1===s.allow_svg_data_urls&&/^data:image\/svg\+xml/i.test(c):/^data:/i.test(c)))return}m&&(t in P||0===t.indexOf("on"))||(d.map[t]=n,d.push({name:t,value:n}))};for(S=new RegExp("<(?:(?:!--([\\w\\W]*?)--\x3e)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g"),k=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,s=z.getShortEndedElements(),E=F.self_closing_elements||z.getSelfClosingElements(),p=z.getBoolAttrs(),g=F.validate,u=F.remove_internals,R=F.fix_self_closing,T=z.getSpecialElements(),N=e+">";t=S.exec(N);){if(_<t.index&&V(O(e.substr(_,t.index-_))),n=t[6])":"===(n=n.toLowerCase()).charAt(0)&&(n=n.substr(1)),I(n);else if(n=t[7]){if(t.index+t[0].length>e.length){V(O(e.substr(t.index))),_=t.index+t[0].length;continue}if(":"===(n=n.toLowerCase()).charAt(0)&&(n=n.substr(1)),c=n in s,R&&E[n]&&0<B.length&&B[B.length-1].name===n&&I(n),!g||(l=z.getElementRule(n))){if(f=!0,g&&(y=l.attributes,b=l.attributePatterns),(v=t[8])?((m=-1!==v.indexOf("data-mce-type"))&&u&&(f=!1),(d=[]).map={},v.replace(k,M)):(d=[]).map={},g&&!m){if(C=l.attributesRequired,x=l.attributesDefault,w=l.attributesForced,l.removeEmptyAttrs&&!d.length&&(f=!1),w)for(o=w.length;o--;)a=(h=w[o]).name,"{$uid}"===(A=h.value)&&(A="mce_"+D++),d.map[a]=A,d.push({name:a,value:A});if(x)for(o=x.length;o--;)(a=(h=x[o]).name)in d.map||("{$uid}"===(A=h.value)&&(A="mce_"+D++),d.map[a]=A,d.push({name:a,value:A}));if(C){for(o=C.length;o--&&!(C[o]in d.map););-1===o&&(f=!1)}if(h=d.map["data-mce-bogus"]){if("all"===h){_=gh(z,e,S.lastIndex),S.lastIndex=_;continue}f=!1}}f&&H(n,d,c)}else f=!1;if(r=T[n]){r.lastIndex=_=t.index+t[0].length,(t=r.exec(e))?(f&&(i=e.substr(_,t.index-_)),_=t.index+t[0].length):(i=e.substr(_),_=e.length),f&&(0<i.length&&V(i,!0),j(n)),S.lastIndex=_;continue}c||(v&&v.indexOf("/")===v.length-1?f&&j(n):B.push({name:n,valid:f}))}else(n=t[1])?(">"===n.charAt(0)&&(n=" "+n),F.allow_conditional_comments||"[if"!==n.substr(0,3).toLowerCase()||(n=" "+n),U(n)):(n=t[2])?q(n.replace(/<!--|-->/g,"")):(n=t[3])?W(n):(n=t[4])&&$(n,t[5]);_=t.index+t[0].length}for(_<e.length&&V(O(e.substr(_))),o=B.length-1;0<=o;o--)(n=B[o]).valid&&j(n.name)}}}(hh||(hh={})).findEndTag=gh;var vh=hh,yh=function(e,t){var n,r,o,i,a,u,s,c,l=t,f=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,d=e.schema;for(u=e.getTempAttrs(),s=l,c=new RegExp(["\\s?("+u.join("|")+')="[^"]+"'].join("|"),"gi"),l=s.replace(c,""),a=d.getShortEndedElements();i=f.exec(l);)r=f.lastIndex,o=i[0].length,n=a[i[1]]?r:vh.findEndTag(d,l,r),l=l.substring(0,r-o)+l.substring(n),f.lastIndex=r-o;return _i(l)},bh={trimExternal:yh,trimInternal:yh},Ch=0,xh=2,wh=1,Nh=function(p,g){var e=p.length+g.length+2,h=new Array(e),v=new Array(e),c=function(e,t,n,r,o){var i=l(e,t,n,r);if(null===i||i.start===t&&i.diag===t-r||i.end===e&&i.diag===e-n)for(var a=e,u=n;a<t||u<r;)a<t&&u<r&&p[a]===g[u]?(o.push([0,p[a]]),++a,++u):r-n<t-e?(o.push([2,p[a]]),++a):(o.push([1,g[u]]),++u);else{c(e,i.start,n,i.start-i.diag,o);for(var s=i.start;s<i.end;++s)o.push([0,p[s]]);c(i.end,t,i.end-i.diag,r,o)}},y=function(e,t,n,r){for(var o=e;o-t<r&&o<n&&p[o]===g[o-t];)++o;return{start:e,end:o,diag:t}},l=function(e,t,n,r){var o=t-e,i=r-n;if(0===o||0===i)return null;var a,u,s,c,l,f=o-i,d=i+o,m=(d%2==0?d:d+1)/2;for(h[1+m]=e,v[1+m]=t+1,a=0;a<=m;++a){for(u=-a;u<=a;u+=2){for(s=u+m,u===-a||u!==a&&h[s-1]<h[s+1]?h[s]=h[s+1]:h[s]=h[s-1]+1,l=(c=h[s])-e+n-u;c<t&&l<r&&p[c]===g[l];)h[s]=++c,++l;if(f%2!=0&&f-a<=u&&u<=f+a&&v[s-f]<=h[s])return y(v[s-f],u+e-n,t,r)}for(u=f-a;u<=f+a;u+=2){for(s=u+m-f,u===f-a||u!==f+a&&v[s+1]<=v[s-1]?v[s]=v[s+1]-1:v[s]=v[s-1],l=(c=v[s]-1)-e+n-u;e<=c&&n<=l&&p[c]===g[l];)v[s]=c--,l--;if(f%2==0&&-a<=u&&u<=a&&v[s]<=h[s+f])return y(v[s],u+e-n,t,r)}}},t=[];return c(0,p.length,0,g.length,t),t},Eh=function(e){return Oo.isElement(e)?e.outerHTML:Oo.isText(e)?Ko.encodeRaw(e.data,!1):Oo.isComment(e)?"\x3c!--"+e.data+"--\x3e":""},Sh=function(e,t,n){var r=function(e){var t,n,r;for(r=document.createElement("div"),t=document.createDocumentFragment(),e&&(r.innerHTML=e);n=r.firstChild;)t.appendChild(n);return t}(t);if(e.hasChildNodes()&&n<e.childNodes.length){var o=e.childNodes[n];o.parentNode.insertBefore(r,o)}else e.appendChild(r)},kh=function(e){return Bt.filter(Bt.map(e.childNodes,Eh),function(e){return 0<e.length})},Th=function(e,t){var n,r,o,i=Bt.map(t.childNodes,Eh);return n=Nh(i,e),r=t,o=0,Bt.each(n,function(e){e[0]===Ch?o++:e[0]===wh?(Sh(r,e[1],o),o++):e[0]===xh&&function(e,t){if(e.hasChildNodes()&&t<e.childNodes.length){var n=e.childNodes[t];n.parentNode.removeChild(n)}}(r,o)}),t},Ah=function(e,t){var n=(t||document).createElement("div");return n.innerHTML=e,$r.children(Vn.fromDom(n))},Rh=function(e){return e.dom().innerHTML},_h=Rh,Bh=function(e,t){var n=$r.owner(e).dom(),r=Vn.fromDom(n.createDocumentFragment()),o=Ah(t,n);qc(r,o),Hc.empty(e),Hu.append(e,r)},Dh=ns(A.none()),Oh=function(e){return{type:"fragmented",fragments:e,content:"",bookmark:null,beforeBookmark:null}},Ph=function(e){return{type:"complete",fragments:null,content:e,bookmark:null,beforeBookmark:null}},Lh=function(e){return"fragmented"===e.type?e.fragments.join(""):e.content},Ih=function(e){var t=Vn.fromTag("body",Dh.get().getOrThunk(function(){var e=document.implementation.createHTMLDocument("undo");return Dh.set(A.some(e)),e}));return Bh(t,Lh(e)),H.each(hu(t,"*[data-mce-bogus]"),Hc.unwrap),_h(t)},Mh=function(n){var e,t,r;return e=kh(n.getBody()),-1!==(t=(r=H.bind(e,function(e){var t=bh.trimInternal(n.serializer,e);return 0<t.length?[t]:[]})).join("")).indexOf("</iframe>")?Oh(r):Ph(t)},Fh=function(e,t,n){"fragmented"===t.type?Th(t.fragments,e.getBody()):e.setContent(t.content,{format:"raw"}),e.selection.moveToBookmark(n?t.beforeBookmark:t.bookmark)},zh=function(e,t){return!(!e||!t)&&(r=t,Lh(e)===Lh(r)||(n=t,Ih(e)===Ih(n)));var n,r};function Uh(u){var s,r,o=this,c=0,l=[],t=0,f=function(){return 0===t},i=function(e){f()&&(o.typing=e)},d=function(e){u.setDirty(e)},a=function(e){i(!1),o.add({},e)},n=function(){o.typing&&(i(!1),o.add())};return u.on("init",function(){o.add()}),u.on("BeforeExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&(n(),o.beforeChange())}),u.on("ExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&a(e)}),u.on("ObjectResizeStart Cut",function(){o.beforeChange()}),u.on("SaveContent ObjectResized blur",a),u.on("DragEnd",a),u.on("KeyUp",function(e){var t=e.keyCode;e.isDefaultPrevented()||((33<=t&&t<=36||37<=t&&t<=40||45===t||e.ctrlKey)&&(a(),u.nodeChanged()),46!==t&&8!==t||u.nodeChanged(),r&&o.typing&&!1===zh(Mh(u),l[0])&&(!1===u.isDirty()&&(d(!0),u.fire("change",{level:l[0],lastLevel:null})),u.fire("TypingUndo"),r=!1,u.nodeChanged()))}),u.on("KeyDown",function(e){var t=e.keyCode;if(!e.isDefaultPrevented())if(33<=t&&t<=36||37<=t&&t<=40||45===t)o.typing&&a(e);else{var n=e.ctrlKey&&!e.altKey||e.metaKey;!(t<16||20<t)||224===t||91===t||o.typing||n||(o.beforeChange(),i(!0),o.add({},e),r=!0)}}),u.on("MouseDown",function(e){o.typing&&a(e)}),u.on("input",function(e){var t;e.inputType&&("insertReplacementText"===e.inputType||"insertText"===(t=e).inputType&&null===t.data)&&a(e)}),u.addShortcut("meta+z","","Undo"),u.addShortcut("meta+y,meta+shift+z","","Redo"),u.on("AddUndo Undo Redo ClearUndos",function(e){e.isDefaultPrevented()||u.nodeChanged()}),o={data:l,typing:!1,beforeChange:function(){f()&&(s=Ec.getUndoBookmark(u.selection))},add:function(e,t){var n,r,o,i=u.settings;if(o=Mh(u),e=e||{},e=It.extend(e,o),!1===f()||u.removed)return null;if(r=l[c],u.fire("BeforeAddUndo",{level:e,lastLevel:r,originalEvent:t}).isDefaultPrevented())return null;if(r&&zh(r,e))return null;if(l[c]&&(l[c].beforeBookmark=s),i.custom_undo_redo_levels&&l.length>i.custom_undo_redo_levels){for(n=0;n<l.length-1;n++)l[n]=l[n+1];l.length--,c=l.length}e.bookmark=Ec.getUndoBookmark(u.selection),c<l.length-1&&(l.length=c+1),l.push(e),c=l.length-1;var a={level:e,lastLevel:r,originalEvent:t};return u.fire("AddUndo",a),0<c&&(d(!0),u.fire("change",a)),e},undo:function(){var e;return o.typing&&(o.add(),o.typing=!1,i(!1)),0<c&&(e=l[--c],Fh(u,e,!0),d(!0),u.fire("undo",{level:e})),e},redo:function(){var e;return c<l.length-1&&(e=l[++c],Fh(u,e,!1),d(!0),u.fire("redo",{level:e})),e},clear:function(){l=[],c=0,o.typing=!1,o.data=l,u.fire("ClearUndos")},hasUndo:function(){return 0<c||o.typing&&l[0]&&!zh(Mh(u),l[0])},hasRedo:function(){return c<l.length-1&&!o.typing},transact:function(e){return n(),o.beforeChange(),o.ignore(e),o.add()},ignore:function(e){try{t++,e()}finally{t--}},extra:function(e,t){var n,r;o.transact(e)&&(r=l[c].bookmark,n=l[c-1],Fh(u,n,!0),o.transact(t)&&(l[c-1].beforeBookmark=r))}}}var qh,Vh,Hh=function(e){return e&&/^(IMG)$/.test(e.nodeName)},jh=function(e){return e&&3===e.nodeType&&/^([\t \r\n]+|)$/.test(e.nodeValue)},$h=function(e,t,n){return"color"!==n&&"backgroundColor"!==n||(t=e.toHex(t)),"fontWeight"===n&&700===t&&(t="bold"),"fontFamily"===n&&(t=t.replace(/[\'\"]/g,"").replace(/,\s+/g,",")),""+t},Wh={isInlineBlock:Hh,moveStart:function(e,t,n){var r,o,i,a=n.startOffset,u=n.startContainer;if((n.startContainer!==n.endContainer||!Hh(n.startContainer.childNodes[n.startOffset]))&&1===u.nodeType)for(a<(i=u.childNodes).length?r=new ao(u=i[a],e.getParent(u,e.isBlock)):(r=new ao(u=i[i.length-1],e.getParent(u,e.isBlock))).next(!0),o=r.current();o;o=r.next())if(3===o.nodeType&&!jh(o))return n.setStart(o,0),void t.setRng(n)},getNonWhiteSpaceSibling:function(e,t,n){if(e)for(t=t?"nextSibling":"previousSibling",e=n?e:e[t];e;e=e[t])if(1===e.nodeType||!jh(e))return e},isTextBlock:function(e,t){return t.nodeType&&(t=t.nodeName),!!e.schema.getTextBlockElements()[t.toLowerCase()]},isValid:function(e,t,n){return e.schema.isValidChild(t,n)},isWhiteSpaceNode:jh,replaceVars:function(e,n){return"string"!=typeof e?e=e(n):n&&(e=e.replace(/%(\w+)/g,function(e,t){return n[t]||e})),e},isEq:function(e,t){return t=t||"",e=""+((e=e||"").nodeName||e),t=""+(t.nodeName||t),e.toLowerCase()===t.toLowerCase()},normalizeStyleValue:$h,getStyle:function(e,t,n){return $h(e,e.getStyle(t,n),n)},getTextDecoration:function(t,e){var n;return t.getParent(e,function(e){return(n=t.getStyle(e,"text-decoration"))&&"none"!==n}),n},getParents:function(e,t,n){return e.getParents(t,n,e.getRoot())}},Kh=Mc,Xh=Wh.getParents,Yh=Wh.isWhiteSpaceNode,Gh=Wh.isTextBlock,Jh=function(e,t){for(void 0===t&&(t=3===e.nodeType?e.length:e.childNodes.length);e&&e.hasChildNodes();)(e=e.childNodes[t])&&(t=3===e.nodeType?e.length:e.childNodes.length);return{node:e,offset:t}},Qh=function(e,t){for(var n=t;n;){if(1===n.nodeType&&e.getContentEditable(n))return"false"===e.getContentEditable(n)?n:t;n=n.parentNode}return t},Zh=function(e,t,n,r){var o,i,a=n.nodeValue;return void 0===r&&(r=e?a.length:0),e?(o=a.lastIndexOf(" ",r),-1===(o=(i=a.lastIndexOf("\xa0",r))<o?o:i)||t||o++):(o=a.indexOf(" ",r),i=a.indexOf("\xa0",r),o=-1!==o&&(-1===i||o<i)?o:i),o},ev=function(e,t,n,r,o,i){var a,u,s,c;if(3===n.nodeType){if(-1!==(s=Zh(o,i,n,r)))return{container:n,offset:s};c=n}for(a=new ao(n,e.getParent(n,e.isBlock)||t);u=a[o?"prev":"next"]();)if(3===u.nodeType){if(-1!==(s=Zh(o,i,c=u)))return{container:u,offset:s}}else if(e.isBlock(u))break;if(c)return{container:c,offset:r=o?0:c.length}},tv=function(e,t,n,r,o){var i,a,u,s;for(3===r.nodeType&&0===r.nodeValue.length&&r[o]&&(r=r[o]),i=Xh(e,r),a=0;a<i.length;a++)for(u=0;u<t.length;u++)if(!("collapsed"in(s=t[u])&&s.collapsed!==n.collapsed)&&e.is(i[a],s.selector))return i[a];return r},nv=function(t,e,n,r){var o,i=t.dom,a=i.getRoot();if(e[0].wrapper||(o=i.getParent(n,e[0].block,a)),!o){var u=i.getParent(n,"LI,TD,TH");o=i.getParent(3===n.nodeType?n.parentNode:n,function(e){return e!==a&&Gh(t,e)},u)}if(o&&e[0].wrapper&&(o=Xh(i,o,"ul,ol").reverse()[0]||o),!o)for(o=n;o[r]&&!i.isBlock(o[r])&&(o=o[r],!Wh.isEq(o,"br")););return o||n},rv=function(e,t,n,r,o,i,a){var u,s,c,l,f,d;if(u=s=a?n:o,l=a?"previousSibling":"nextSibling",f=e.getRoot(),3===u.nodeType&&!Yh(u)&&(a?0<r:i<u.nodeValue.length))return u;for(;;){if(!t[0].block_expand&&e.isBlock(s))return s;for(c=s[l];c;c=c[l])if(!Kh(c)&&!Yh(c)&&("BR"!==(d=c).nodeName||!d.getAttribute("data-mce-bogus")||d.nextSibling))return s;if(s===f||s.parentNode===f){u=s;break}s=s.parentNode}return u},ov=function(e,t,n,r){var o,i=t.startContainer,a=t.startOffset,u=t.endContainer,s=t.endOffset,c=e.dom;return 1===i.nodeType&&i.hasChildNodes()&&3===(i=ua(i,a)).nodeType&&(a=0),1===u.nodeType&&u.hasChildNodes()&&3===(u=ua(u,t.collapsed?s:s-1)).nodeType&&(s=u.nodeValue.length),i=Qh(c,i),u=Qh(c,u),(Kh(i.parentNode)||Kh(i))&&3===(i=(i=Kh(i)?i:i.parentNode).nextSibling||i).nodeType&&(a=0),(Kh(u.parentNode)||Kh(u))&&3===(u=(u=Kh(u)?u:u.parentNode).previousSibling||u).nodeType&&(s=u.length),n[0].inline&&(t.collapsed&&((o=ev(c,e.getBody(),i,a,!0,r))&&(i=o.container,a=o.offset),(o=ev(c,e.getBody(),u,s,!1,r))&&(u=o.container,s=o.offset)),u=r?u:function(e,t){var n=Jh(e,t);if(n.node){for(;n.node&&0===n.offset&&n.node.previousSibling;)n=Jh(n.node.previousSibling);n.node&&0<n.offset&&3===n.node.nodeType&&" "===n.node.nodeValue.charAt(n.offset-1)&&1<n.offset&&(e=n.node).splitText(n.offset-1)}return e}(u,s)),(n[0].inline||n[0].block_expand)&&(n[0].inline&&3===i.nodeType&&0!==a||(i=rv(c,n,i,a,u,s,!0)),n[0].inline&&3===u.nodeType&&s!==u.nodeValue.length||(u=rv(c,n,i,a,u,s,!1))),n[0].selector&&!1!==n[0].expand&&!n[0].inline&&(i=tv(c,n,t,i,"previousSibling"),u=tv(c,n,t,u,"nextSibling")),(n[0].block||n[0].selector)&&(i=nv(e,n,i,"previousSibling"),u=nv(e,n,u,"nextSibling"),n[0].block&&(c.isBlock(i)||(i=rv(c,n,i,a,u,s,!0)),c.isBlock(u)||(u=rv(c,n,i,a,u,s,!1)))),1===i.nodeType&&(a=c.nodeIndex(i),i=i.parentNode),1===u.nodeType&&(s=c.nodeIndex(u)+1,u=u.parentNode),{startContainer:i,startOffset:a,endContainer:u,endOffset:s}},iv=Wh.isEq,av=function(e,t,n){var r=e.formatter.get(n);if(r)for(var o=0;o<r.length;o++)if(!1===r[o].inherit&&e.dom.is(t,r[o].selector))return!0;return!1},uv=function(t,e,n,r){var o=t.dom.getRoot();return e!==o&&(e=t.dom.getParent(e,function(e){return!!av(t,e,n)||e.parentNode===o||!!lv(t,e,n,r,!0)}),lv(t,e,n,r))},sv=function(e,t,n){return!!iv(t,n.inline)||!!iv(t,n.block)||(n.selector?1===t.nodeType&&e.is(t,n.selector):void 0)},cv=function(e,t,n,r,o,i){var a,u,s,c=n[r];if(n.onmatch)return n.onmatch(t,n,r);if(c)if("undefined"==typeof c.length){for(a in c)if(c.hasOwnProperty(a)){if(u="attributes"===r?e.getAttrib(t,a):Wh.getStyle(e,t,a),o&&!u&&!n.exact)return;if((!o||n.exact)&&!iv(u,Wh.normalizeStyleValue(e,Wh.replaceVars(c[a],i),a)))return}}else for(s=0;s<c.length;s++)if("attributes"===r?e.getAttrib(t,c[s]):Wh.getStyle(e,t,c[s]))return n;return n},lv=function(e,t,n,r,o){var i,a,u,s,c=e.formatter.get(n),l=e.dom;if(c&&t)for(a=0;a<c.length;a++)if(i=c[a],sv(e.dom,t,i)&&cv(l,t,i,"attributes",o,r)&&cv(l,t,i,"styles",o,r)){if(s=i.classes)for(u=0;u<s.length;u++)if(!e.dom.hasClass(t,s[u]))return;return i}},fv={matchNode:lv,matchName:sv,match:function(e,t,n,r){var o;return r?uv(e,r,t,n):(r=e.selection.getNode(),!!uv(e,r,t,n)||!((o=e.selection.getStart())===r||!uv(e,o,t,n)))},matchAll:function(r,o,i){var e,a=[],u={};return e=r.selection.getStart(),r.dom.getParent(e,function(e){var t,n;for(t=0;t<o.length;t++)n=o[t],!u[n]&&lv(r,e,n,i)&&(u[n]=!0,a.push(n))},r.dom.getRoot()),a},canApply:function(e,t){var n,r,o,i,a,u=e.formatter.get(t),s=e.dom;if(u)for(n=e.selection.getStart(),r=Wh.getParents(s,n),i=u.length-1;0<=i;i--){if(!(a=u[i].selector)||u[i].defaultBlock)return!0;for(o=r.length-1;0<=o;o--)if(s.is(r[o],a))return!0}return!1},matchesUnInheritedFormatSelector:av},dv=function(e,t){return e.splitText(t)},mv=function(e){var t=e.startContainer,n=e.startOffset,r=e.endContainer,o=e.endOffset;return t===r&&Oo.isText(t)?0<n&&n<t.nodeValue.length&&(t=(r=dv(t,n)).previousSibling,n<o?(t=r=dv(r,o-=n).previousSibling,o=r.nodeValue.length,n=0):o=0):(Oo.isText(t)&&0<n&&n<t.nodeValue.length&&(t=dv(t,n),n=0),Oo.isText(r)&&0<o&&o<r.nodeValue.length&&(o=(r=dv(r,o).previousSibling).nodeValue.length)),{startContainer:t,startOffset:n,endContainer:r,endOffset:o}},pv=Ri,gv="_mce_caret",hv=function(e){return 0<function(e){for(var t=[];e;){if(3===e.nodeType&&e.nodeValue!==pv||1<e.childNodes.length)return[];1===e.nodeType&&t.push(e),e=e.firstChild}return t}(e).length},vv=function(e){var t;if(e)for(e=(t=new ao(e,e)).current();e;e=t.next())if(3===e.nodeType)return e;return null},yv=function(e){var t=Vn.fromTag("span");return lr.setAll(t,{id:gv,"data-mce-bogus":"1","data-mce-type":"format-caret"}),e&&Hu.append(t,Vn.fromText(pv)),t},bv=function(e,t,n,r){var o,i,a,u;o=t.getRng(!0),i=e.getParent(n,e.isBlock),hv(n)?(!1!==r&&(o.setStartBefore(n),o.setEndBefore(n)),e.remove(n)):((u=vv(n))&&u.nodeValue.charAt(0)===pv&&u.deleteData(0,1),a=u,o.startContainer===a&&0<o.startOffset&&o.setStart(a,o.startOffset-1),o.endContainer===a&&0<o.endOffset&&o.setEnd(a,o.endOffset-1),e.remove(n,!0)),i&&e.isEmpty(i)&&Kc(Vn.fromDom(i)),t.setRng(o)},Cv=function(e,t,n,r,o){if(r)bv(t,n,r,o);else if(!(r=Tc(e,n.getStart())))for(;r=t.get(gv);)bv(t,n,r,!1)},xv=function(e,t,n){var r=e.dom,o=r.getParent(n,da.curry(Wh.isTextBlock,e));o&&r.isEmpty(o)?n.parentNode.replaceChild(t,n):(Wc(Vn.fromDom(n)),r.isEmpty(n)?n.parentNode.replaceChild(t,n):r.insertAfter(t,n))},wv=function(e,t){return e.appendChild(t),t},Nv=function(e,t){var n=H.foldr(e,function(e,t){return wv(e,t.cloneNode(!1))},t);return wv(n,n.ownerDocument.createTextNode(pv))},Ev=function(e){var i=e.dom,a=e.selection,u=e.getBody();e.on("mouseup keydown",function(e){var t,n,r,o;t=u,n=i,r=a,o=e.keyCode,Cv(t,n,r,null,!1),8===o&&r.isCollapsed()&&r.getStart().innerHTML===pv&&Cv(t,n,r,Tc(t,r.getStart())),37!==o&&39!==o||Cv(t,n,r,Tc(t,r.getStart()))})},Sv=function(e,t){return e.schema.getTextInlineElements().hasOwnProperty(Zn.name(t))&&!kc(t.dom())&&!Oo.isBogus(t.dom())},kv={},Tv=Bt.filter,Av=Bt.each;Vh=function(e){var t,n,r=e.selection.getRng();t=Oo.matchNodeNames("pre"),r.collapsed||(n=e.selection.getSelectedBlocks(),Av(Tv(Tv(n,t),function(e){return t(e.previousSibling)&&-1!==Bt.indexOf(n,e.previousSibling)}),function(e){var t,n;t=e.previousSibling,tn(n=e).remove(),tn(t).append("<br><br>").append(n.childNodes)}))},kv[qh="pre"]||(kv[qh]=[]),kv[qh].push(Vh);var Rv=function(e,t){Av(kv[e],function(e){e(t)})},_v=It.each,Bv=function(e,t,o){var n,r,i,a,u,s,c,l=t.startContainer,f=t.startOffset,d=t.endContainer,m=t.endOffset;if(0<(c=e.select("td[data-mce-selected],th[data-mce-selected]")).length)_v(c,function(e){o([e])});else{var p,g,h,v=function(e){var t;return 3===(t=e[0]).nodeType&&t===l&&f>=t.nodeValue.length&&e.splice(0,1),t=e[e.length-1],0===m&&0<e.length&&t===d&&3===t.nodeType&&e.splice(e.length-1,1),e},y=function(e,t,n){for(var r=[];e&&e!==n;e=e[t])r.push(e);return r},b=function(e,t){do{if(e.parentNode===t)return e;e=e.parentNode}while(e)},C=function(e,t,n){var r=n?"nextSibling":"previousSibling";for(u=(a=e).parentNode;a&&a!==t;a=u)u=a.parentNode,(s=y(a===e?a:a[r],r)).length&&(n||s.reverse(),o(v(s)))};if(1===l.nodeType&&l.hasChildNodes()&&(l=l.childNodes[f]),1===d.nodeType&&d.hasChildNodes()&&(g=m,h=(p=d).childNodes,--g>h.length-1?g=h.length-1:g<0&&(g=0),d=h[g]||p),l===d)return o(v([l]));for(n=e.findCommonAncestor(l,d),a=l;a;a=a.parentNode){if(a===d)return C(l,n,!0);if(a===n)break}for(a=d;a;a=a.parentNode){if(a===l)return C(d,n);if(a===n)break}r=b(l,n)||l,i=b(d,n)||d,C(l,r,!0),(s=y(r===l?r:r.nextSibling,"nextSibling",i===d?i.nextSibling:i)).length&&o(v(s)),C(d,i)}},Dv=/^(src|href|style)$/,Ov=It.each,Pv=Wh.isEq,Lv=function(e){return/^(TH|TD)$/.test(e.nodeName)},Iv=function(e,t,n){var r,o,i;return r=t[n?"startContainer":"endContainer"],o=t[n?"startOffset":"endOffset"],Oo.isElement(r)&&(i=r.childNodes.length-1,!n&&o&&o--,r=r.childNodes[i<o?i:o]),Oo.isText(r)&&n&&o>=r.nodeValue.length&&(r=new ao(r,e.getBody()).next()||r),Oo.isText(r)&&!n&&0===o&&(r=new ao(r,e.getBody()).prev()||r),r},Mv=function(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o},Fv=function(e,t,n,r){return!(t=Wh.getNonWhiteSpaceSibling(t,n,r))||"BR"===t.nodeName||e.isBlock(t)},zv=function(e,n,r,o,i){var t,a,u,s,c,l,f,d,m,p,g,h,v,y,b=e.dom;if(c=b,!(Pv(l=o,(f=n).inline)||Pv(l,f.block)||(f.selector?Oo.isElement(l)&&c.is(l,f.selector):void 0)||(s=o,n.links&&"A"===s.tagName)))return!1;if("all"!==n.remove)for(Ov(n.styles,function(e,t){e=Wh.normalizeStyleValue(b,Wh.replaceVars(e,r),t),"number"==typeof t&&(t=e,i=0),(n.remove_similar||!i||Pv(Wh.getStyle(b,i,t),e))&&b.setStyle(o,t,""),u=1}),u&&""===b.getAttrib(o,"style")&&(o.removeAttribute("style"),o.removeAttribute("data-mce-style")),Ov(n.attributes,function(e,t){var n;if(e=Wh.replaceVars(e,r),"number"==typeof t&&(t=e,i=0),!i||Pv(b.getAttrib(i,t),e)){if("class"===t&&(e=b.getAttrib(o,t))&&(n="",Ov(e.split(/\s+/),function(e){/mce\-\w+/.test(e)&&(n+=(n?" ":"")+e)}),n))return void b.setAttrib(o,t,n);"class"===t&&o.removeAttribute("className"),Dv.test(t)&&o.removeAttribute("data-mce-"+t),o.removeAttribute(t)}}),Ov(n.classes,function(e){e=Wh.replaceVars(e,r),i&&!b.hasClass(i,e)||b.removeClass(o,e)}),a=b.getAttribs(o),t=0;t<a.length;t++){var C=a[t].nodeName;if(0!==C.indexOf("_")&&0!==C.indexOf("data-"))return!1}return"none"!==n.remove?(d=e,p=n,h=(m=o).parentNode,v=d.dom,y=d.settings.forced_root_block,p.block&&(y?h===v.getRoot()&&(p.list_block&&Pv(m,p.list_block)||Ov(It.grep(m.childNodes),function(e){Wh.isValid(d,y,e.nodeName.toLowerCase())?g?g.appendChild(e):(g=Mv(v,e,y),v.setAttribs(g,d.settings.forced_root_block_attrs)):g=0})):v.isBlock(m)&&!v.isBlock(h)&&(Fv(v,m,!1)||Fv(v,m.firstChild,!0,1)||m.insertBefore(v.create("br"),m.firstChild),Fv(v,m,!0)||Fv(v,m.lastChild,!1,1)||m.appendChild(v.create("br")))),p.selector&&p.inline&&!Pv(p.inline,m)||v.remove(m,1),!0):void 0},Uv=zv,qv=function(s,c,l,e,f){var t,n,d=s.formatter.get(c),m=d[0],a=!0,u=s.dom,r=s.selection,o=function(e){var n,t,r,o,i,a,u=(n=s,t=e,r=c,o=l,i=f,Ov(Wh.getParents(n.dom,t.parentNode).reverse(),function(e){var t;a||"_start"===e.id||"_end"===e.id||(t=fv.matchNode(n,e,r,o,i))&&!1!==t.split&&(a=e)}),a);return function(e,t,n,r,o,i,a,u){var s,c,l,f,d,m,p=e.dom;if(n){for(m=n.parentNode,s=r.parentNode;s&&s!==m;s=s.parentNode){for(c=p.clone(s,!1),d=0;d<t.length;d++)if(zv(e,t[d],u,c,c)){c=0;break}c&&(l&&c.appendChild(l),f||(f=c),l=c)}!i||a.mixed&&p.isBlock(n)||(r=p.split(n,r)),l&&(o.parentNode.insertBefore(l,o),f.appendChild(o))}return r}(s,d,u,e,e,!0,m,l)},p=function(e){var t,n,r,o,i;if(Oo.isElement(e)&&u.getContentEditable(e)&&(o=a,a="true"===u.getContentEditable(e),i=!0),t=It.grep(e.childNodes),a&&!i)for(n=0,r=d.length;n<r&&!zv(s,d[n],l,e,e);n++);if(m.deep&&t.length){for(n=0,r=t.length;n<r;n++)p(t[n]);i&&(a=o)}},i=function(e){var t=u.get(e?"_start":"_end"),n=t[e?"firstChild":"lastChild"];return Mc(n)&&(n=n[e?"firstChild":"lastChild"]),Oo.isText(n)&&0===n.data.length&&(n=e?t.previousSibling||t.nextSibling:t.nextSibling||t.previousSibling),u.remove(t,!0),n},g=function(e){var t,n,r=e.commonAncestorContainer;if(e=ov(s,e,d,!0),m.split){if((t=Iv(s,e,!0))!==(n=Iv(s,e))){if(/^(TR|TH|TD)$/.test(t.nodeName)&&t.firstChild&&(t="TR"===t.nodeName?t.firstChild.firstChild||t:t.firstChild||t),r&&/^T(HEAD|BODY|FOOT|R)$/.test(r.nodeName)&&Lv(n)&&n.firstChild&&(n=n.firstChild||n),u.isChildOf(t,n)&&t!==n&&!u.isBlock(n)&&!Lv(t)&&!Lv(n))return t=Mv(u,t,"span",{id:"_start","data-mce-type":"bookmark"}),o(t),void(t=i(!0));t=Mv(u,t,"span",{id:"_start","data-mce-type":"bookmark"}),n=Mv(u,n,"span",{id:"_end","data-mce-type":"bookmark"}),o(t),o(n),t=i(!0),n=i()}else t=n=o(t);e.startContainer=t.parentNode?t.parentNode:t,e.startOffset=u.nodeIndex(t),e.endContainer=n.parentNode?n.parentNode:n,e.endOffset=u.nodeIndex(n)+1}Bv(u,e,function(e){Ov(e,function(e){p(e),Oo.isElement(e)&&"underline"===s.dom.getStyle(e,"text-decoration")&&e.parentNode&&"underline"===Wh.getTextDecoration(u,e.parentNode)&&zv(s,{deep:!1,exact:!0,inline:"span",styles:{textDecoration:"underline"}},null,e)})})};if(e)e.nodeType?((n=u.createRng()).setStartBefore(e),n.setEndAfter(e),g(n)):g(e);else if("false"!==u.getContentEditable(r.getNode()))r.isCollapsed()&&m.inline&&!u.select("td[data-mce-selected],th[data-mce-selected]").length?function(e,t,n,r){var o,i,a,u,s,c,l,f=e.dom,d=e.selection,m=[],p=d.getRng();for(o=p.startContainer,i=p.startOffset,3===(s=o).nodeType&&(i!==o.nodeValue.length&&(u=!0),s=s.parentNode);s;){if(fv.matchNode(e,s,t,n,r)){c=s;break}s.nextSibling&&(u=!0),m.push(s),s=s.parentNode}if(c)if(u){a=d.getBookmark(),p.collapse(!0);var g=ov(e,p,e.formatter.get(t),!0);g=mv(g),e.formatter.remove(t,n,g),d.moveToBookmark(a)}else{l=Tc(e.getBody(),c);var h=yv(!1).dom(),v=Nv(m,h);xv(e,h,l||c),bv(f,d,l,!1),d.setCursorLocation(v,1),f.isEmpty(c)&&f.remove(c)}}(s,c,l,f):(t=Ec.getPersistentBookmark(s.selection,!0),g(r.getRng()),r.moveToBookmark(t),m.inline&&fv.match(s,c,l,r.getStart())&&Wh.moveStart(u,r,r.getRng()),s.nodeChanged());else{e=r.getNode();for(var h=0,v=d.length;h<v&&(!d[h].ceFalseOverride||!zv(s,d[h],l,e,e));h++);}},Vv=It.each,Hv=function(e){return e&&1===e.nodeType&&!Mc(e)&&!kc(e)&&!Oo.isBogus(e)},jv=function(e,t){var n;for(n=e;n;n=n[t]){if(3===n.nodeType&&0!==n.nodeValue.length)return e;if(1===n.nodeType&&!Mc(n))return n}return e},$v=function(e,t,n){var r,o,i=new zc(e);if(t&&n&&(t=jv(t,"previousSibling"),n=jv(n,"nextSibling"),i.compare(t,n))){for(r=t.nextSibling;r&&r!==n;)r=(o=r).nextSibling,t.appendChild(o);return e.remove(n),It.each(It.grep(n.childNodes),function(e){t.appendChild(e)}),t}return n},Wv=function(e,t,n){Vv(e.childNodes,function(e){Hv(e)&&(t(e)&&n(e),e.hasChildNodes()&&Wv(e,t,n))})},Kv=function(n,e){return V.curry(function(e,t){return!(!t||!Wh.getStyle(n,t,e))},e)},Xv=function(r,e,t){return V.curry(function(e,t,n){r.setStyle(n,e,t),""===n.getAttribute("style")&&n.removeAttribute("style"),Yv(r,n)},e,t)},Yv=function(e,t){"SPAN"===t.nodeName&&0===e.getAttribs(t).length&&e.remove(t,!0)},Gv=function(e,t){var n;1===t.nodeType&&t.parentNode&&1===t.parentNode.nodeType&&(n=Wh.getTextDecoration(e,t.parentNode),e.getStyle(t,"color")&&n?e.setStyle(t,"text-decoration",n):e.getStyle(t,"text-decoration")===n&&e.setStyle(t,"text-decoration",null))},Jv=function(n,e,r,o){Vv(e,function(t){Vv(n.dom.select(t.inline,o),function(e){Hv(e)&&Uv(n,t,r,e,t.exact?e:null)}),function(r,e,t){if(e.clear_child_styles){var n=e.links?"*:not(a)":"*";Vv(r.select(n,t),function(n){Hv(n)&&Vv(e.styles,function(e,t){r.setStyle(n,t,"")})})}}(n.dom,t,o)})},Qv=function(e,t,n,r){(t.styles.color||t.styles.textDecoration)&&(It.walk(r,V.curry(Gv,e),"childNodes"),Gv(e,r))},Zv=function(e,t,n,r){t.styles&&t.styles.backgroundColor&&Wv(r,Kv(e,"fontSize"),Xv(e,"backgroundColor",Wh.replaceVars(t.styles.backgroundColor,n)))},ey=function(e,t,n,r){"sub"!==t.inline&&"sup"!==t.inline||(Wv(r,Kv(e,"fontSize"),Xv(e,"fontSize","")),e.remove(e.select("sup"===t.inline?"sub":"sup",r),!0))},ty=function(e,t,n,r){r&&!1!==t.merge_siblings&&(r=$v(e,Wh.getNonWhiteSpaceSibling(r),r),r=$v(e,r,Wh.getNonWhiteSpaceSibling(r,!0)))},ny=function(t,n,r,o,i){fv.matchNode(t,i.parentNode,r,o)&&Uv(t,n,o,i)||n.merge_with_parents&&t.dom.getParent(i.parentNode,function(e){if(fv.matchNode(t,e,r,o))return Uv(t,n,o,i),!0})},ry=It.each,oy=function(p,g,h,r){var e,t,v=p.formatter.get(g),y=v[0],o=!r&&p.selection.isCollapsed(),i=p.dom,n=p.selection,b=function(n,e){if(e=e||y,n){if(e.onformat&&e.onformat(n,e,h,r),ry(e.styles,function(e,t){i.setStyle(n,t,Wh.replaceVars(e,h))}),e.styles){var t=i.getAttrib(n,"style");t&&n.setAttribute("data-mce-style",t)}ry(e.attributes,function(e,t){i.setAttrib(n,t,Wh.replaceVars(e,h))}),ry(e.classes,function(e){e=Wh.replaceVars(e,h),i.hasClass(n,e)||i.addClass(n,e)})}},C=function(e,t){var n=!1;return!!y.selector&&(ry(e,function(e){if(!("collapsed"in e&&e.collapsed!==o))return i.is(t,e.selector)&&!kc(t)?(b(t,e),!(n=!0)):void 0}),n)},a=function(s,e,t,c){var l,f,d=[],m=!0;l=y.inline||y.block,f=s.create(l),b(f),Bv(s,e,function(e){var a,u=function(e){var t,n,r,o;if(o=m,t=e.nodeName.toLowerCase(),n=e.parentNode.nodeName.toLowerCase(),1===e.nodeType&&s.getContentEditable(e)&&(o=m,m="true"===s.getContentEditable(e),r=!0),Wh.isEq(t,"br"))return a=0,void(y.block&&s.remove(e));if(y.wrapper&&fv.matchNode(p,e,g,h))a=0;else{if(m&&!r&&y.block&&!y.wrapper&&Wh.isTextBlock(p,t)&&Wh.isValid(p,n,l))return e=s.rename(e,l),b(e),d.push(e),void(a=0);if(y.selector){var i=C(v,e);if(!y.inline||i)return void(a=0)}!m||r||!Wh.isValid(p,l,t)||!Wh.isValid(p,n,l)||!c&&3===e.nodeType&&1===e.nodeValue.length&&65279===e.nodeValue.charCodeAt(0)||kc(e)||y.inline&&s.isBlock(e)?(a=0,ry(It.grep(e.childNodes),u),r&&(m=o),a=0):(a||(a=s.clone(f,!1),e.parentNode.insertBefore(a,e),d.push(a)),a.appendChild(e))}};ry(e,u)}),!0===y.links&&ry(d,function(e){var t=function(e){"A"===e.nodeName&&b(e,y),ry(It.grep(e.childNodes),t)};t(e)}),ry(d,function(e){var t,n,r,o,i,a=function(e){var n=!1;return ry(e.childNodes,function(e){if((t=e)&&1===t.nodeType&&!Mc(t)&&!kc(t)&&!Oo.isBogus(t))return n=e,!1;var t}),n};n=0,ry(e.childNodes,function(e){Wh.isWhiteSpaceNode(e)||Mc(e)||n++}),t=n,!(1<d.length)&&s.isBlock(e)||0!==t?(y.inline||y.wrapper)&&(y.exact||1!==t||((o=a(r=e))&&!Mc(o)&&fv.matchName(s,o,y)&&(i=s.clone(o,!1),b(i),s.replace(i,r,!0),s.remove(o,1)),e=i||r),Jv(p,v,h,e),ny(p,y,g,h,e),Zv(s,y,h,e),ey(s,y,h,e),ty(s,y,h,e)):s.remove(e,1)})};if("false"!==i.getContentEditable(n.getNode())){if(y){if(r)r.nodeType?C(v,r)||((t=i.createRng()).setStartBefore(r),t.setEndAfter(r),a(i,ov(p,t,v),0,!0)):a(i,r,0,!0);else if(o&&y.inline&&!i.select("td[data-mce-selected],th[data-mce-selected]").length)!function(e,t,n){var r,o,i,a,u,s,c=e.selection;a=(r=c.getRng(!0)).startOffset,s=r.startContainer.nodeValue,(o=Tc(e.getBody(),c.getStart()))&&(i=vv(o));var l,f,d=/[^\s\u00a0\u00ad\u200b\ufeff]/;s&&0<a&&a<s.length&&d.test(s.charAt(a))&&d.test(s.charAt(a-1))?(u=c.getBookmark(),r.collapse(!0),r=ov(e,r,e.formatter.get(t)),r=mv(r),e.formatter.apply(t,n,r),c.moveToBookmark(u)):(o&&i.nodeValue===pv||(l=e.getDoc(),f=yv(!0).dom(),i=(o=l.importNode(f,!0)).firstChild,r.insertNode(o),a=1),e.formatter.apply(t,n,o),c.setCursorLocation(i,a))}(p,g,h);else{var u=p.selection.getNode();p.settings.forced_root_block||!v[0].defaultBlock||i.getParent(u,i.isBlock)||oy(p,v[0].defaultBlock),p.selection.setRng(Zc(p.selection.getRng())),e=Ec.getPersistentBookmark(p.selection,!0),a(i,ov(p,n.getRng(),v)),y.styles&&Qv(i,y,h,u),n.moveToBookmark(e),Wh.moveStart(i,n,n.getRng()),p.nodeChanged()}Rv(g,p)}}else{r=n.getNode();for(var s=0,c=v.length;s<c;s++)if(v[s].ceFalseOverride&&i.is(r,v[s].selector))return void b(r,v[s])}},iy={applyFormat:oy},ay=It.each,uy=function(e,t,n,r,o){var i,a,u,s,c,l,f,d;null===t.get()&&(a=e,u={},(i=t).set({}),a.on("NodeChange",function(n){var r=Wh.getParents(a.dom,n.element),o={};r=It.grep(r,function(e){return 1===e.nodeType&&!e.getAttribute("data-mce-bogus")}),ay(i.get(),function(e,n){ay(r,function(t){return a.formatter.matchNode(t,n,{},e.similar)?(u[n]||(ay(e,function(e){e(!0,{node:t,format:n,parents:r})}),u[n]=e),o[n]=e,!1):!fv.matchesUnInheritedFormatSelector(a,t,n)&&void 0})}),ay(u,function(e,t){o[t]||(delete u[t],ay(e,function(e){e(!1,{node:n.element,format:t,parents:r})}))})})),c=n,l=r,f=o,d=(s=t).get(),ay(c.split(","),function(e){d[e]||(d[e]=[],d[e].similar=f),d[e].push(l)}),s.set(d)},sy={get:function(r){var t={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"left"},preview:"font-family font-size"}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"right"},preview:"font-family font-size"}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},inherit:!1,defaultBlock:"div",preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",toggle:!1,styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",toggle:!1,styles:{fontSize:"%value"},clear_child_styles:!0},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(){return!0},onformat:function(n,e,t){It.each(t,function(e,t){r.setAttrib(n,t,e)})}},removeformat:[{selector:"b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]};return It.each("p h1 h2 h3 h4 h5 h6 div address pre div dt dd samp".split(/\s/),function(e){t[e]={block:e,remove:"all"}}),t}},cy=It.each,ly=vi.DOM,fy=function(e,t){var n,o,r,m=t&&t.schema||oi({}),p=function(e){var t,n,r;return o="string"==typeof e?{name:e,classes:[],attrs:{}}:e,t=ly.create(o.name),n=t,(r=o).classes.length&&ly.addClass(n,r.classes.join(" ")),ly.setAttribs(n,r.attrs),t},g=function(n,e,t){var r,o,i,a,u,s,c,l,f=0<e.length&&e[0],d=f&&f.name;if(u=d,s="string"!=typeof(a=n)?a.nodeName.toLowerCase():a,c=m.getElementRule(s),i=!(!(l=c&&c.parentsRequired)||!l.length)&&(u&&-1!==It.inArray(l,u)?u:l[0]))d===i?(o=e[0],e=e.slice(1)):o=i;else if(f)o=e[0],e=e.slice(1);else if(!t)return n;return o&&(r=p(o)).appendChild(n),t&&(r||(r=ly.create("div")).appendChild(n),It.each(t,function(e){var t=p(e);r.insertBefore(t,n)})),g(r,e,o&&o.siblings)};return e&&e.length?(o=e[0],n=p(o),(r=ly.create("div")).appendChild(g(n,e.slice(1),o.siblings)),r):""},dy=function(e){var t,a={classes:[],attrs:{}};return"*"!==(e=a.selector=It.trim(e))&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,function(e,t,n,r,o){switch(t){case"#":a.attrs.id=n;break;case".":a.classes.push(n);break;case":":-1!==It.inArray("checked disabled enabled read-only required".split(" "),n)&&(a.attrs[n]=n)}if("["===r){var i=o.match(/([\w\-]+)(?:\=\"([^\"]+))?/);i&&(a.attrs[i[1]]=i[2])}return""})),a.name=t||"div",a},my=function(e){return e&&"string"==typeof e?(e=(e=e.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),It.map(e.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=It.map(e.split(/(?:~\+|~|\+)/),dy),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[]},py=function(n,e){var t,r,o,i,a,u,s="";if(!1===(u=n.settings.preview_styles))return"";"string"!=typeof u&&(u="font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow");var c=function(e){return e.replace(/%(\w+)/g,"")};if("string"==typeof e){if(!(e=n.formatter.get(e)))return;e=e[0]}return"preview"in e&&!1===(u=e.preview)?"":(t=e.block||e.inline||"span",(i=my(e.selector)).length?(i[0].name||(i[0].name=t),t=e.selector,r=fy(i,n)):r=fy([t],n),o=ly.select(t,r)[0]||r.firstChild,cy(e.styles,function(e,t){(e=c(e))&&ly.setStyle(o,t,e)}),cy(e.attributes,function(e,t){(e=c(e))&&ly.setAttrib(o,t,e)}),cy(e.classes,function(e){e=c(e),ly.hasClass(o,e)||ly.addClass(o,e)}),n.fire("PreviewFormats"),ly.setStyles(r,{position:"absolute",left:-65535}),n.getBody().appendChild(r),a=ly.getStyle(n.getBody(),"fontSize",!0),a=/px$/.test(a)?parseInt(a,10):0,cy(u.split(" "),function(e){var t=ly.getStyle(o,e,!0);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=ly.getStyle(n.getBody(),e,!0),"#ffffff"===ly.toHex(t).toLowerCase())||"color"===e&&"#000000"===ly.toHex(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===a)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*a+"px"}"border"===e&&t&&(s+="padding:0 2px;"),s+=e+":"+t+";"}}),n.fire("AfterPreviewFormats"),ly.remove(r),s)},gy=function(e,t,n,r,o){var i=t.get(n);!fv.match(e,n,r,o)||"toggle"in i[0]&&!i[0].toggle?iy.applyFormat(e,n,r,o):qv(e,n,r,o)},hy=function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])};function vy(e){var t,n,r,o=(t=e,n={},(r=function(e,t){e&&("string"!=typeof e?It.each(e,function(e,t){r(t,e)}):(t=t.length?t:[t],It.each(t,function(e){"undefined"==typeof e.deep&&(e.deep=!e.selector),"undefined"==typeof e.split&&(e.split=!e.selector||e.inline),"undefined"==typeof e.remove&&e.selector&&!e.inline&&(e.remove="none"),e.selector&&e.inline&&(e.mixed=!0,e.block_expand=!0),"string"==typeof e.classes&&(e.classes=e.classes.split(/\s+/))}),n[e]=t))})(sy.get(t.dom)),r(t.settings.formats),{get:function(e){return e?n[e]:n},register:r,unregister:function(e){return e&&n[e]&&delete n[e],n}}),i=ns(null);return hy(e),Ev(e),{get:o.get,register:o.register,unregister:o.unregister,apply:V.curry(iy.applyFormat,e),remove:V.curry(qv,e),toggle:V.curry(gy,e,o),match:V.curry(fv.match,e),matchAll:V.curry(fv.matchAll,e),matchNode:V.curry(fv.matchNode,e),canApply:V.curry(fv.canApply,e),formatChanged:V.curry(uy,e,i),getCssText:V.curry(py,e)}}var yy=function(a){return function(){for(var e=new Array(arguments.length),t=0;t<e.length;t++)e[t]=arguments[t];if(0===e.length)throw new Error("Can't merge zero objects");for(var n={},r=0;r<e.length;r++){var o=e[r];for(var i in o)o.hasOwnProperty(i)&&(n[i]=a(n[i],o[i]))}return n}},by=yy(function(e,t){return k.isObject(e)&&k.isObject(t)?by(e,t):t}),Cy=yy(function(e,t){return t}),xy={deepMerge:by,merge:Cy},wy={register:function(t,s,c){t.addAttributeFilter("data-mce-tabindex",function(e,t){for(var n,r=e.length;r--;)(n=e[r]).attr("tabindex",n.attributes.map["data-mce-tabindex"]),n.attr(t,null)}),t.addAttributeFilter("src,href,style",function(e,t){for(var n,r,o=e.length,i="data-mce-"+t,a=s.url_converter,u=s.url_converter_scope;o--;)(r=(n=e[o]).attributes.map[i])!==undefined?(n.attr(t,0<r.length?r:null),n.attr(i,null)):(r=n.attributes.map[t],"style"===t?r=c.serializeStyle(c.parseStyle(r),n.name):a&&(r=a.call(u,r,t,n.name)),n.attr(t,0<r.length?r:null))}),t.addAttributeFilter("class",function(e){for(var t,n,r=e.length;r--;)(n=(t=e[r]).attr("class"))&&(n=t.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),t.attr("class",0<n.length?n:null))}),t.addAttributeFilter("data-mce-type",function(e,t,n){for(var r,o=e.length;o--;)"bookmark"!==(r=e[o]).attributes.map["data-mce-type"]||n.cleanup||r.remove()}),t.addNodeFilter("noscript",function(e){for(var t,n=e.length;n--;)(t=e[n].firstChild)&&(t.value=Ko.decode(t.value))}),t.addNodeFilter("script,style",function(e,t){for(var n,r,o,i=e.length,a=function(e){return e.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi,"").replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")};i--;)r=(n=e[i]).firstChild?n.firstChild.value:"","script"===t?((o=n.attr("type"))&&n.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0<r.length&&(n.firstChild.value="// <![CDATA[\n"+a(r)+"\n// ]]>")):"xhtml"===s.element_format&&0<r.length&&(n.firstChild.value="\x3c!--\n"+a(r)+"\n--\x3e")}),t.addNodeFilter("#comment",function(e){for(var t,n=e.length;n--;)0===(t=e[n]).value.indexOf("[CDATA[")?(t.name="#cdata",t.type=4,t.value=t.value.replace(/^\[CDATA\[|\]\]$/g,"")):0===t.value.indexOf("mce:protected ")&&(t.name="#text",t.type=3,t.raw=!0,t.value=unescape(t.value).substr(14))}),t.addNodeFilter("xml:namespace,input",function(e,t){for(var n,r=e.length;r--;)7===(n=e[r]).type?n.remove():1===n.type&&("input"!==t||"type"in n.attributes.map||n.attr("type","text"))}),t.addAttributeFilter("data-mce-type",function(e){H.each(e,function(e){"format-caret"===e.attr("data-mce-type")&&(e.isEmpty(t.schema.getNonEmptyElements())?e.remove():e.unwrap())})}),t.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-type,data-mce-resize",function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)})},trimTrailingBr:function(e){var t,n,r=function(e){return e&&"br"===e.name};r(t=e.lastChild)&&r(n=t.prev)&&(t.remove(),n.remove())}},Ny={process:function(e,t,n){return f=n,(l=e)&&l.hasEventListeners("PreProcess")&&!f.no_events?(o=t,i=n,c=(r=e).dom,o=o.cloneNode(!0),(a=document.implementation).createHTMLDocument&&(u=a.createHTMLDocument(""),It.each("BODY"===o.nodeName?o.childNodes:[o],function(e){u.body.appendChild(u.importNode(e,!0))}),o="BODY"!==o.nodeName?u.body.firstChild:u.body,s=c.doc,c.doc=u),cp(r,xy.merge(i,{node:o})),s&&(c.doc=s),o):t;var r,o,i,a,u,s,c,l,f}},Ey=function(e,u,s){e.addNodeFilter("font",function(e){H.each(e,function(e){var t,n,r=u.parse(e.attr("style")),o=e.attr("color"),i=e.attr("face"),a=e.attr("size");o&&(r.color=o),i&&(r["font-family"]=i),a&&(r["font-size"]=s[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",u.serialize(r)),t=e,n=["color","face","size"],H.each(n,function(e){t.attr(e,null)})})})},Sy=function(e,t){var n,r=ai();t.convert_fonts_to_spans&&Ey(e,r,It.explode(t.font_size_legacy_values)),n=r,e.addNodeFilter("strike",function(e){H.each(e,function(e){var t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))})})},ky={register:function(e,t){t.inline_styles&&Sy(e,t)}},Ty=/^[ \t\r\n]*$/,Ay={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},Ry=function(e,t,n){var r,o,i=n?"lastChild":"firstChild",a=n?"prev":"next";if(e[i])return e[i];if(e!==t){if(r=e[a])return r;for(o=e.parent;o&&o!==t;o=o.parent)if(r=o[a])return r}},_y=function(){function a(e,t){this.name=e,1===(this.type=t)&&(this.attributes=[],this.attributes.map={})}return a.create=function(e,t){var n,r;if(n=new a(e,Ay[e]||1),t)for(r in t)n.attr(r,t[r]);return n},a.prototype.replace=function(e){return e.parent&&e.remove(),this.insert(e,this),this.remove(),this},a.prototype.attr=function(e,t){var n,r;if("string"!=typeof e){for(r in e)this.attr(r,e[r]);return this}if(n=this.attributes){if(t!==undefined){if(null===t){if(e in n.map)for(delete n.map[e],r=n.length;r--;)if(n[r].name===e)return n=n.splice(r,1),this;return this}if(e in n.map){for(r=n.length;r--;)if(n[r].name===e){n[r].value=t;break}}else n.push({name:e,value:t});return n.map[e]=t,this}return n.map[e]}},a.prototype.clone=function(){var e,t,n,r,o,i=new a(this.name,this.type);if(n=this.attributes){for((o=[]).map={},e=0,t=n.length;e<t;e++)"id"!==(r=n[e]).name&&(o[o.length]={name:r.name,value:r.value},o.map[r.name]=r.value);i.attributes=o}return i.value=this.value,i.shortEnded=this.shortEnded,i},a.prototype.wrap=function(e){return this.parent.insert(e,this),e.append(this),this},a.prototype.unwrap=function(){var e,t;for(e=this.firstChild;e;)t=e.next,this.insert(e,this,!0),e=t;this.remove()},a.prototype.remove=function(){var e=this.parent,t=this.next,n=this.prev;return e&&(e.firstChild===this?(e.firstChild=t)&&(t.prev=null):n.next=t,e.lastChild===this?(e.lastChild=n)&&(n.next=null):t.prev=n,this.parent=this.next=this.prev=null),this},a.prototype.append=function(e){var t;return e.parent&&e.remove(),(t=this.lastChild)?((t.next=e).prev=t,this.lastChild=e):this.lastChild=this.firstChild=e,e.parent=this,e},a.prototype.insert=function(e,t,n){var r;return e.parent&&e.remove(),r=t.parent||this,n?(t===r.firstChild?r.firstChild=e:t.prev.next=e,e.prev=t.prev,(e.next=t).prev=e):(t===r.lastChild?r.lastChild=e:t.next.prev=e,e.next=t.next,(e.prev=t).next=e),e.parent=r,e},a.prototype.getAll=function(e){var t,n=[];for(t=this.firstChild;t;t=Ry(t,this))t.name===e&&n.push(t);return n},a.prototype.empty=function(){var e,t,n;if(this.firstChild){for(e=[],n=this.firstChild;n;n=Ry(n,this))e.push(n);for(t=e.length;t--;)(n=e[t]).parent=n.firstChild=n.lastChild=n.next=n.prev=null}return this.firstChild=this.lastChild=null,this},a.prototype.isEmpty=function(e,t,n){var r,o,i=this.firstChild;if(t=t||{},i)do{if(1===i.type){if(i.attributes.map["data-mce-bogus"])continue;if(e[i.name])return!1;for(r=i.attributes.length;r--;)if("name"===(o=i.attributes[r].name)||0===o.indexOf("data-mce-bookmark"))return!1}if(8===i.type)return!1;if(3===i.type&&!Ty.test(i.value))return!1;if(3===i.type&&i.parent&&t[i.parent.name]&&Ty.test(i.value))return!1;if(n&&n(i))return!1}while(i=Ry(i,this));return!0},a.prototype.walk=function(e){return Ry(this,null,e)},a}(),By=function(e,t,n,r){(e.padd_empty_with_br||t.insert)&&n[r.name]?r.empty().append(new _y("br",1)).shortEnded=!0:r.empty().append(new _y("#text",3)).value="\xa0"},Dy=function(e){return Oy(e,"#text")&&"\xa0"===e.firstChild.value},Oy=function(e,t){return e&&e.firstChild&&e.firstChild===e.lastChild&&e.firstChild.name===t},Py=function(r,e,t,n){return n.isEmpty(e,t,function(e){return t=e,(n=r.getElementRule(t.name))&&n.paddEmpty;var t,n})},Ly=function(e,t){return e&&(t[e.name]||"br"===e.name)},Iy=function(e,g){var h=e.schema;g.remove_trailing_brs&&e.addNodeFilter("br",function(e,t,n){var r,o,i,a,u,s,c,l,f=e.length,d=It.extend({},h.getBlockElements()),m=h.getNonEmptyElements(),p=h.getNonEmptyElements();for(d.body=1,r=0;r<f;r++)if(i=(o=e[r]).parent,d[o.parent.name]&&o===i.lastChild){for(u=o.prev;u;){if("span"!==(s=u.name)||"bookmark"!==u.attr("data-mce-type")){if("br"!==s)break;if("br"===s){o=null;break}}u=u.prev}o&&(o.remove(),Py(h,m,p,i)&&(c=h.getElementRule(i.name))&&(c.removeEmpty?i.remove():c.paddEmpty&&By(g,n,d,i)))}else{for(a=o;i&&i.firstChild===a&&i.lastChild===a&&!d[(a=i).name];)i=i.parent;a===i&&!0!==g.padd_empty_with_br&&((l=new _y("#text",3)).value="\xa0",o.replace(l))}}),e.addAttributeFilter("href",function(e){var t,n,r,o=e.length;if(!g.allow_unsafe_link_target)for(;o--;)"a"===(t=e[o]).name&&"_blank"===t.attr("target")&&t.attr("rel",(n=t.attr("rel"),r=n?It.trim(n):"",/\b(noopener)\b/g.test(r)?r:r.split(" ").filter(function(e){return 0<e.length}).concat(["noopener"]).sort().join(" ")))}),g.allow_html_in_named_anchor||e.addAttributeFilter("id,name",function(e){for(var t,n,r,o,i=e.length;i--;)if("a"===(o=e[i]).name&&o.firstChild&&!o.attr("href"))for(r=o.parent,t=o.lastChild;n=t.prev,r.insert(t,o),t=n;);}),g.fix_list_elements&&e.addNodeFilter("ul,ol",function(e){for(var t,n,r=e.length;r--;)if("ul"===(n=(t=e[r]).parent).name||"ol"===n.name)if(t.prev&&"li"===t.prev.name)t.prev.append(t);else{var o=new _y("li",1);o.attr("style","list-style-type: none"),t.wrap(o)}}),g.validate&&h.getValidClasses()&&e.addAttributeFilter("class",function(e){for(var t,n,r,o,i,a,u,s=e.length,c=h.getValidClasses();s--;){for(n=(t=e[s]).attr("class").split(" "),i="",r=0;r<n.length;r++)o=n[r],u=!1,(a=c["*"])&&a[o]&&(u=!0),a=c[t.name],!u&&a&&a[o]&&(u=!0),u&&(i&&(i+=" "),i+=o);i.length||(i=null),t.attr("class",i)}})},My=It.makeMap,Fy=It.each,zy=It.explode,Uy=It.extend;function qy(k,T){void 0===T&&(T=oi());var A={},R=[],_={},B={};(k=k||{}).validate=!("validate"in k)||k.validate,k.root_name=k.root_name||"body";var D=function(e){var t,n,r;n in A&&((r=_[n])?r.push(e):_[n]=[e]),t=R.length;for(;t--;)(n=R[t].name)in e.attributes.map&&((r=B[n])?r.push(e):B[n]=[e]);return e},e={schema:T,addAttributeFilter:function(e,n){Fy(zy(e),function(e){var t;for(t=0;t<R.length;t++)if(R[t].name===e)return void R[t].callbacks.push(n);R.push({name:e,callbacks:[n]})})},getAttributeFilters:function(){return[].concat(R)},addNodeFilter:function(e,n){Fy(zy(e),function(e){var t=A[e];t||(A[e]=t=[]),t.push(n)})},getNodeFilters:function(){var e=[];for(var t in A)A.hasOwnProperty(t)&&e.push({name:t,callbacks:A[t]});return e},filterNode:D,parse:function(e,a){var t,n,r,o,i,u,s,c,l,f,d,m=[];a=a||{},_={},B={},l=Uy(My("script,style,head,html,body,title,meta,param"),T.getBlockElements());var p=T.getNonEmptyElements(),g=T.children,h=k.validate,v="forced_root_block"in a?a.forced_root_block:k.forced_root_block,y=T.getWhiteSpaceElements(),b=/^[ \t\r\n]+/,C=/[ \t\r\n]+$/,x=/[ \t\r\n]+/g,w=/^[ \t\r\n]+$/;f=y.hasOwnProperty(a.context)||y.hasOwnProperty(k.root_name);var N=function(e,t){var n,r=new _y(e,t);return e in A&&((n=_[e])?n.push(r):_[e]=[r]),r},E=function(e){var t,n,r,o,i=T.getBlockElements();for(t=e.prev;t&&3===t.type;){if(0<(r=t.value.replace(C,"")).length)return void(t.value=r);if(n=t.next){if(3===n.type&&n.value.length){t=t.prev;continue}if(!i[n.name]&&"script"!==n.name&&"style"!==n.name){t=t.prev;continue}}o=t.prev,t.remove(),t=o}};t=vh({validate:h,allow_script_urls:k.allow_script_urls,allow_conditional_comments:k.allow_conditional_comments,self_closing_elements:function(e){var t,n={};for(t in e)"li"!==t&&"p"!==t&&(n[t]=e[t]);return n}(T.getSelfClosingElements()),cdata:function(e){d.append(N("#cdata",4)).value=e},text:function(e,t){var n;f||(e=e.replace(x," "),Ly(d.lastChild,l)&&(e=e.replace(b,""))),0!==e.length&&((n=N("#text",3)).raw=!!t,d.append(n).value=e)},comment:function(e){d.append(N("#comment",8)).value=e},pi:function(e,t){d.append(N(e,7)).value=t,E(d)},doctype:function(e){d.append(N("#doctype",10)).value=e,E(d)},start:function(e,t,n){var r,o,i,a,u;if(i=h?T.getElementRule(e):{}){for((r=N(i.outputName||e,1)).attributes=t,r.shortEnded=n,d.append(r),(u=g[d.name])&&g[r.name]&&!u[r.name]&&m.push(r),o=R.length;o--;)(a=R[o].name)in t.map&&((s=B[a])?s.push(r):B[a]=[r]);l[e]&&E(r),n||(d=r),!f&&y[e]&&(f=!0)}},end:function(e){var t,n,r,o,i;if(n=h?T.getElementRule(e):{}){if(l[e]&&!f){if((t=d.firstChild)&&3===t.type)if(0<(r=t.value.replace(b,"")).length)t.value=r,t=t.next;else for(o=t.next,t.remove(),t=o;t&&3===t.type;)r=t.value,o=t.next,(0===r.length||w.test(r))&&(t.remove(),t=o),t=o;if((t=d.lastChild)&&3===t.type)if(0<(r=t.value.replace(C,"")).length)t.value=r,t=t.prev;else for(o=t.prev,t.remove(),t=o;t&&3===t.type;)r=t.value,o=t.prev,(0===r.length||w.test(r))&&(t.remove(),t=o),t=o}if(f&&y[e]&&(f=!1),n.removeEmpty&&Py(T,p,y,d)&&!d.attributes.map.name&&!d.attr("id"))return i=d.parent,l[d.name]?d.empty().remove():d.unwrap(),void(d=i);n.paddEmpty&&(Dy(d)||Py(T,p,y,d))&&By(k,a,l,d),d=d.parent}}},T);var S=d=new _y(a.context||k.root_name,11);if(t.parse(e),h&&m.length&&(a.context?a.invalid=!0:function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,p,g,h;for(d=My("tr,td,th,tbody,thead,tfoot,table"),l=T.getNonEmptyElements(),f=T.getWhiteSpaceElements(),m=T.getTextBlockElements(),p=T.getSpecialElements(),t=0;t<e.length;t++)if((n=e[t]).parent&&!n.fixed)if(m[n.name]&&"li"===n.parent.name){for(g=n.next;g&&m[g.name];)g.name="li",g.fixed=!0,n.parent.insert(g,n.parent),g=g.next;n.unwrap(n)}else{for(o=[n],r=n.parent;r&&!T.isValidChild(r.name,n.name)&&!d[r.name];r=r.parent)o.push(r);if(r&&1<o.length){for(o.reverse(),i=a=D(o[0].clone()),c=0;c<o.length-1;c++){for(T.isValidChild(a.name,o[c].name)?(u=D(o[c].clone()),a.append(u)):u=a,s=o[c].firstChild;s&&s!==o[c+1];)h=s.next,u.append(s),s=h;a=u}Py(T,l,f,i)?r.insert(n,o[0],!0):(r.insert(i,o[0],!0),r.insert(n,i)),r=o[0],(Py(T,l,f,r)||Oy(r,"br"))&&r.empty().remove()}else if(n.parent){if("li"===n.name){if((g=n.prev)&&("ul"===g.name||"ul"===g.name)){g.append(n);continue}if((g=n.next)&&("ul"===g.name||"ul"===g.name)){g.insert(n,g.firstChild,!0);continue}n.wrap(D(new _y("ul",1)));continue}T.isValidChild(n.parent.name,"div")&&T.isValidChild("div",n.name)?n.wrap(D(new _y("div",1))):p[n.name]?n.empty().remove():n.unwrap()}}}(m)),v&&("body"===S.name||a.isRootContent)&&function(){var e,t,n=S.firstChild,r=function(e){e&&((n=e.firstChild)&&3===n.type&&(n.value=n.value.replace(b,"")),(n=e.lastChild)&&3===n.type&&(n.value=n.value.replace(C,"")))};if(T.isValidChild(S.name,v.toLowerCase())){for(;n;)e=n.next,3===n.type||1===n.type&&"p"!==n.name&&!l[n.name]&&!n.attr("data-mce-type")?(t||((t=N(v,1)).attr(k.forced_root_block_attrs),S.insert(t,n)),t.append(n)):(r(t),t=null),n=e;r(t)}}(),!a.invalid){for(c in _){for(s=A[c],i=(n=_[c]).length;i--;)n[i].parent||n.splice(i,1);for(r=0,o=s.length;r<o;r++)s[r](n,c,a)}for(r=0,o=R.length;r<o;r++)if((s=R[r]).name in B){for(i=(n=B[s.name]).length;i--;)n[i].parent||n.splice(i,1);for(i=0,u=s.callbacks.length;i<u;i++)s.callbacks[i](n,s.name,a)}}return S}};return Iy(e,k),ky.register(e,k),e}var Vy=function(e,t,n){-1===It.inArray(t,n)&&(e.addAttributeFilter(n,function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),t.push(n))},Hy=function(e,t,n){var r=_i(n.getInner?t.innerHTML:e.getOuterHTML(t));return n.selection||wo(Vn.fromDom(t))?r:It.trim(r)},jy=function(e,t,n){var r=n.selection?xy.merge({forced_root_block:!1},n):n,o=e.parse(t,r);return wy.trimTrailingBr(o),o},$y=function(e,t,n,r,o){var i,a,u,s,c=(i=r,Jc(t,n).serialize(i));return a=e,s=c,!(u=o).no_events&&a?lp(a,xy.merge(u,{content:s})).content:s};function Wy(e,t){var a,u,s,c,l,n,r=(a=e,n=["data-mce-selected"],s=(u=t)&&u.dom?u.dom:vi.DOM,c=u&&u.schema?u.schema:oi(a),a.entity_encoding=a.entity_encoding||"named",a.remove_trailing_brs=!("remove_trailing_brs"in a)||a.remove_trailing_brs,l=qy(a,c),wy.register(l,a,s),{schema:c,addNodeFilter:l.addNodeFilter,addAttributeFilter:l.addAttributeFilter,serialize:function(e,t){var n=xy.merge({format:"html"},t||{}),r=Ny.process(u,e,n),o=Hy(s,r,n),i=jy(l,o,n);return"tree"===n.format?i:$y(u,a,c,i,n)},addRules:function(e){c.addValidElements(e)},setRules:function(e){c.setValidElements(e)},addTempAttr:V.curry(Vy,l,n),getTempAttrs:function(){return n}});return{schema:r.schema,addNodeFilter:r.addNodeFilter,addAttributeFilter:r.addAttributeFilter,serialize:r.serialize,addRules:r.addRules,setRules:r.setRules,addTempAttr:r.addTempAttr,getTempAttrs:r.getTempAttrs}}function Ky(e){return{getBookmark:V.curry(Lc,e),moveToBookmark:V.curry(Ic,e)}}(Ky||(Ky={})).isBookmarkNode=Mc;var Xy=Ky,Yy=Oo.isContentEditableFalse,Gy=Oo.isContentEditableTrue,Jy=function(r,a){var u,s,c,l,f,d,m,p,g,h,v,y,i,b,C,x,w,N=a.dom,E=It.each,S=a.getDoc(),k=document,T=Math.abs,A=Math.round,R=a.getBody();l={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};var e=".mce-content-body";a.contentStyles.push(e+" div.mce-resizehandle {position: absolute;border: 1px solid black;box-sizing: content-box;background: #FFF;width: 7px;height: 7px;z-index: 10000}"+e+" .mce-resizehandle:hover {background: #000}"+e+" img[data-mce-selected],"+e+" hr[data-mce-selected] {outline: 1px solid black;resize: none}"+e+" .mce-clonedresizable {position: absolute;"+(ve.gecko?"":"outline: 1px dashed black;")+"opacity: .5;filter: alpha(opacity=50);z-index: 10000}"+e+" .mce-resize-helper {background: #555;background: rgba(0,0,0,0.75);border-radius: 3px;border: 1px;color: white;display: none;font-family: sans-serif;font-size: 12px;white-space: nowrap;line-height: 14px;margin: 5px 10px;padding: 5px;position: absolute;z-index: 10001}");var _=function(e){return e&&("IMG"===e.nodeName||a.dom.is(e,"figure.image"))},n=function(e){var t,n,r=e.target;t=e,n=a.selection.getRng(),!_(t.target)||ih(t.clientX,t.clientY,n)||e.isDefaultPrevented()||(e.preventDefault(),a.selection.select(r))},B=function(e){return a.dom.is(e,"figure.image")?e.querySelector("img"):e},D=function(e){var t=a.settings.object_resizing;return!1!==t&&!ve.iOS&&("string"!=typeof t&&(t="table,img,figure.image,div"),"false"!==e.getAttribute("data-mce-resize")&&e!==a.getBody()&&Pr.is(Vn.fromDom(e),t))},O=function(e){var t,n,r,o;t=e.screenX-d,n=e.screenY-m,b=t*f[2]+h,C=n*f[3]+v,b=b<5?5:b,C=C<5?5:C,(_(u)&&!1!==a.settings.resize_img_proportional?!sh.modifierPressed(e):sh.modifierPressed(e)||_(u)&&f[2]*f[3]!=0)&&(T(t)>T(n)?(C=A(b*y),b=A(C/y)):(b=A(C/y),C=A(b*y))),N.setStyles(B(s),{width:b,height:C}),r=0<(r=f.startPos.x+t)?r:0,o=0<(o=f.startPos.y+n)?o:0,N.setStyles(c,{left:r,top:o,display:"block"}),c.innerHTML=b+" × "+C,f[2]<0&&s.clientWidth<=b&&N.setStyle(s,"left",p+(h-b)),f[3]<0&&s.clientHeight<=C&&N.setStyle(s,"top",g+(v-C)),(t=R.scrollWidth-x)+(n=R.scrollHeight-w)!=0&&N.setStyles(c,{left:r-t,top:o-n}),i||(mp(a,u,h,v),i=!0)},P=function(){i=!1;var e=function(e,t){t&&(u.style[e]||!a.schema.isValid(u.nodeName.toLowerCase(),e)?N.setStyle(B(u),e,t):N.setAttrib(B(u),e,t))};e("width",b),e("height",C),N.unbind(S,"mousemove",O),N.unbind(S,"mouseup",P),k!==S&&(N.unbind(k,"mousemove",O),N.unbind(k,"mouseup",P)),N.remove(s),N.remove(c),o(u),pp(a,u,b,C),N.setAttrib(u,"style",N.getAttrib(u,"style")),a.nodeChanged()},o=function(e){var t,r,o,n,i;L(),F(),t=N.getPos(e,R),p=t.x,g=t.y,i=e.getBoundingClientRect(),r=i.width||i.right-i.left,o=i.height||i.bottom-i.top,u!==e&&(u=e,b=C=0),n=a.fire("ObjectSelected",{target:e}),D(e)&&!n.isDefaultPrevented()?E(l,function(n,e){var t;(t=N.get("mceResizeHandle"+e))&&N.remove(t),t=N.add(R,"div",{id:"mceResizeHandle"+e,"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+e+"-resize; margin:0; padding:0"}),11===ve.ie&&(t.contentEditable=!1),N.bind(t,"mousedown",function(e){var t;e.stopImmediatePropagation(),e.preventDefault(),d=(t=e).screenX,m=t.screenY,h=B(u).clientWidth,v=B(u).clientHeight,y=v/h,(f=n).startPos={x:r*n[0]+p,y:o*n[1]+g},x=R.scrollWidth,w=R.scrollHeight,s=u.cloneNode(!0),N.addClass(s,"mce-clonedresizable"),N.setAttrib(s,"data-mce-bogus","all"),s.contentEditable=!1,s.unSelectabe=!0,N.setStyles(s,{left:p,top:g,margin:0}),s.removeAttribute("data-mce-selected"),R.appendChild(s),N.bind(S,"mousemove",O),N.bind(S,"mouseup",P),k!==S&&(N.bind(k,"mousemove",O),N.bind(k,"mouseup",P)),c=N.add(R,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},h+" × "+v)}),n.elm=t,N.setStyles(t,{left:r*n[0]+p-t.offsetWidth/2,top:o*n[1]+g-t.offsetHeight/2})}):L(),u.setAttribute("data-mce-selected","1")},L=function(){var e,t;for(e in F(),u&&u.removeAttribute("data-mce-selected"),l)(t=N.get("mceResizeHandle"+e))&&(N.unbind(t),N.remove(t))},I=function(e){var t,n=function(e,t){if(e)do{if(e===t)return!0}while(e=e.parentNode)};i||a.removed||(E(N.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute("data-mce-selected")}),t="mousedown"===e.type?e.target:r.getNode(),n(t=N.$(t).closest("table,img,figure.image,hr")[0],R)&&(z(),n(r.getStart(!0),t)&&n(r.getEnd(!0),t))?o(t):L())},M=function(e){return Yy(function(e,t){for(;t&&t!==e;){if(Gy(t)||Yy(t))return t;t=t.parentNode}return null}(a.getBody(),e))},F=function(){for(var e in l){var t=l[e];t.elm&&(N.unbind(t.elm),delete t.elm)}},z=function(){try{a.getDoc().execCommand("enableObjectResizing",!1,!1)}catch(e){}};return a.on("init",function(){z(),ve.ie&&11<=ve.ie&&(a.on("mousedown click",function(e){var t=e.target,n=t.nodeName;i||!/^(TABLE|IMG|HR)$/.test(n)||M(t)||(2!==e.button&&a.selection.select(t,"TABLE"===n),"mousedown"===e.type&&a.nodeChanged())}),a.dom.bind(R,"mscontrolselect",function(e){var t=function(e){we.setEditorTimeout(a,function(){a.selection.select(e)})};if(M(e.target))return e.preventDefault(),void t(e.target);/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"===e.target.tagName&&t(e.target))}));var t=we.throttle(function(e){a.composing||I(e)});a.on("nodechange ResizeEditor ResizeWindow drop FullscreenStateChanged",t),a.on("keyup compositionend",function(e){u&&"TABLE"===u.nodeName&&t(e)}),a.on("hide blur",L),a.on("contextmenu",n)}),a.on("remove",F),{isResizable:D,showResizeRect:o,hideResizeRect:L,updateResizeRect:I,destroy:function(){u=s=null}}},Qy=function(e){return Oo.isContentEditableTrue(e)||Oo.isContentEditableFalse(e)},Zy=function(e,t,n){var r,o,i,a,u,s=n;if(s.caretPositionFromPoint)(o=s.caretPositionFromPoint(e,t))&&((r=n.createRange()).setStart(o.offsetNode,o.offset),r.collapse(!0));else if(n.caretRangeFromPoint)r=n.caretRangeFromPoint(e,t);else if(s.body.createTextRange){r=s.body.createTextRange();try{r.moveToPoint(e,t),r.collapse(!0)}catch(c){r=function(e,n,t){var r,o,i;if(r=t.elementFromPoint(e,n),o=t.body.createTextRange(),r&&"HTML"!==r.tagName||(r=t.body),o.moveToElementText(r),0<(i=(i=It.toArray(o.getClientRects())).sort(function(e,t){return(e=Math.abs(Math.max(e.top-n,e.bottom-n)))-(t=Math.abs(Math.max(t.top-n,t.bottom-n)))})).length){n=(i[0].bottom+i[0].top)/2;try{return o.moveToPoint(e,n),o.collapse(!0),o}catch(a){}}return null}(e,t,n)}return i=r,a=n.body,u=i&&i.parentElement?i.parentElement():null,Oo.isContentEditableFalse(function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(u,a,Qy))?null:i}return r},eb=function(n,e){return H.map(e,function(e){var t=n.fire("GetSelectionRange",{range:e});return t.range!==e?t.range:e})},tb=function(e,t){return Vn.fromDom(e.dom().cloneNode(t))},nb=function(e){return tb(e,!0)},rb=function(e){return tb(e,!1)},ob=nb,ib=function(e,t){var n=(t||document).createDocumentFragment();return H.each(e,function(e){n.appendChild(e.dom())}),Vn.fromDom(n)},ab=kr.immutable("element","width","rows"),ub=kr.immutable("element","cells"),sb=kr.immutable("x","y"),cb=function(e,t){var n=parseInt(lr.get(e,t),10);return isNaN(n)?1:n},lb=function(e){return H.foldl(e,function(e,t){return t.cells().length>e?t.cells().length:e},0)},fb=function(e,t){for(var n=e.rows(),r=0;r<n.length;r++)for(var o=n[r].cells(),i=0;i<o.length;i++)if(Mr.eq(o[i],t))return A.some(sb(i,r));return A.none()},db=function(e,t,n,r,o){for(var i=[],a=e.rows(),u=n;u<=o;u++){var s=a[u].cells(),c=t<r?s.slice(t,r+1):s.slice(r,t+1);i.push(ub(a[u].element(),c))}return i},mb=function(e){var o=ab(rb(e),0,[]);return H.each(hu(e,"tr"),function(n,r){H.each(hu(n,"td,th"),function(e,t){!function(e,t,n,r,o){for(var i=cb(o,"rowspan"),a=cb(o,"colspan"),u=e.rows(),s=n;s<n+i;s++){u[s]||(u[s]=ub(ob(r),[]));for(var c=t;c<t+a;c++)u[s].cells()[c]=s===n&&c===t?o:rb(o)}}(o,function(e,t,n){for(;r=t,o=n,i=void 0,((i=e.rows())[o]?i[o].cells():[])[r];)t++;var r,o,i;return t}(o,t,r),r,n,e)})}),ab(o.element(),lb(o.rows()),o.rows())},pb=function(e){return i=t=e,n=H.map(i.rows(),function(e){var t=H.map(e.cells(),function(e){var t=ob(e);return lr.remove(t,"colspan"),lr.remove(t,"rowspan"),t}),n=rb(e.element());return qc(n,t),n}),r=rb(t.element()),o=Vn.fromTag("tbody"),qc(o,n),Hu.append(r,o),r;var t,n,r,o,i},gb=function(l,e,t){return fb(l,e).bind(function(c){return fb(l,t).map(function(e){return t=l,r=e,o=(n=c).x(),i=n.y(),a=r.x(),u=r.y(),s=i<u?db(t,o,i,a,u):db(t,o,u,a,i),ab(t.element(),lb(s),s);var t,n,r,o,i,a,u,s})})},hb=function(n,t){return H.find(n,function(e){return"li"===Zn.name(e)&&Rg(e,t)}).fold(V.constant([]),function(e){return(t=n,H.find(t,function(e){return"ul"===Zn.name(e)||"ol"===Zn.name(e)})).map(function(e){return[Vn.fromTag("li"),Vn.fromTag(Zn.name(e))]}).getOr([]);var t})},vb=function(e,t){var n,r=Vn.fromDom(t.commonAncestorContainer),o=jl(r,e),i=H.filter(o,function(e){return po(e)||fo(e)}),a=hb(o,t),u=i.concat(a.length?a:yo(n=r)?$r.parent(n).filter(vo).fold(V.constant([]),function(e){return[n,e]}):vo(n)?[n]:[]);return H.map(u,rb)},yb=function(){return ib([])},bb=function(e,t){return n=Vn.fromDom(t.cloneContents()),r=vb(e,t),o=H.foldl(r,function(e,t){return Hu.append(t,e),t},n),0<r.length?ib([o]):o;var n,r,o},Cb=function(e,o){return(t=e,n=o[0],kl(n,"table",V.curry(Mr.eq,t))).bind(function(e){var t=o[0],n=o[o.length-1],r=mb(e);return gb(r,t,n).map(function(e){return ib([pb(e)])})}).getOrThunk(yb);var t,n},xb=function(e,t){var n,r,o=Pd(t,e);return 0<o.length?Cb(e,o):(n=e,0<(r=t).length&&r[0].collapsed?yb():bb(n,r[0]))},wb=function(e,t){var n,r=e.selection.getRng(),o=e.dom.create("body"),i=e.selection.getSel(),a=eb(e,Ad(i));if((t=t||{}).get=!0,t.format=t.format||"html",t.selection=!0,(t=e.fire("BeforeGetContent",t)).isDefaultPrevented())return e.fire("GetContent",t),t.content;if("text"===t.format)return e.selection.isCollapsed()?"":_i(r.text||(i.toString?i.toString():""));r.cloneContents?(n=t.contextual?xb(Vn.fromDom(e.getBody()),a).dom():r.cloneContents())&&o.appendChild(n):r.item!==undefined||r.htmlText!==undefined?(o.innerHTML="<br>"+(r.item?r.item(0).outerHTML:r.htmlText),o.removeChild(o.firstChild)):o.innerHTML=r.toString(),t.getInner=!0;var u=e.selection.serializer.serialize(o,t);return"tree"===t.format?u:(t.content=e.selection.isCollapsed()?"":u,e.fire("GetContent",t),t.content)},Nb=function(e,t,n){var r,o,i,a=e.selection.getRng(),u=e.getDoc();if((n=n||{format:"html"}).set=!0,n.selection=!0,n.content=t,n.no_events||!(n=e.fire("BeforeSetContent",n)).isDefaultPrevented()){if(t=n.content,a.insertNode){t+='<span id="__caret">_</span>',a.startContainer===u&&a.endContainer===u?u.body.innerHTML=t:(a.deleteContents(),0===u.body.childNodes.length?u.body.innerHTML=t:a.createContextualFragment?a.insertNode(a.createContextualFragment(t)):(o=u.createDocumentFragment(),i=u.createElement("div"),o.appendChild(i),i.outerHTML=t,a.insertNode(o))),r=e.dom.get("__caret"),(a=u.createRange()).setStartBefore(r),a.setEndBefore(r),e.selection.setRng(a),e.dom.remove("__caret");try{e.selection.setRng(a)}catch(s){}}else a.item&&(u.execCommand("Delete",!1,null),a=e.getRng()),/^\s+/.test(t)?(a.pasteHTML('<span id="__mce_tmp">_</span>'+t),e.dom.remove("__mce_tmp")):a.pasteHTML(t);n.no_events||e.fire("SetContent",n)}else e.fire("SetContent",n)},Eb=function(e,t,n,r,o){var i=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return A.from(i).map(Vn.fromDom).map(function(e){return r&&t.collapsed?e:$r.child(e,o(e,a)).getOr(e)}).bind(function(e){return Zn.isElement(e)?A.some(e):$r.parent(e)}).map(function(e){return e.dom()}).getOr(e)},Sb=function(e,t,n){return Eb(e,t,!0,n,function(e,t){return Math.min($r.childNodesCount(e),t)})},kb=function(e,t,n){return Eb(e,t,!1,n,function(e,t){return 0<t?t-1:t})},Tb=function(e,t){for(var n=e;e&&Oo.isText(e)&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n},Ab=It.each,Rb=function(e){return!!e.select},_b=function(e){return!(!e||!e.ownerDocument)&&Mr.contains(Vn.fromDom(e.ownerDocument),Vn.fromDom(e))},Bb=function(u,s,e,c){var n,t,l,f,a,r=function(e,t){return Nb(c,e,t)},o=function(e){var t=m();t.collapse(!!e),i(t)},d=function(){return s.getSelection?s.getSelection():s.document.selection},m=function(){var e,t,n,r,o=function(e,t,n){try{return t.compareBoundaryPoints(e,n)}catch(r){return-1}};if(!s)return null;if(null==(r=s.document))return null;if(c.bookmark!==undefined&&!1===zp(c)){var i=Mm(c);if(i.isSome())return i.map(function(e){return eb(c,[e])[0]}).getOr(r.createRange())}try{(e=d())&&(t=0<e.rangeCount?e.getRangeAt(0):e.createRange?e.createRange():r.createRange())}catch(a){}return(t=eb(c,[t])[0])||(t=r.createRange?r.createRange():r.body.createTextRange()),t.setStart&&9===t.startContainer.nodeType&&t.collapsed&&(n=u.getRoot(),t.setStart(n,0),t.setEnd(n,0)),l&&f&&(0===o(t.START_TO_START,t,l)&&0===o(t.END_TO_END,t,l)?t=f:f=l=null),t},i=function(e,t){var n,r;if((o=e)&&(Rb(o)||_b(o.startContainer)&&_b(o.endContainer))){var o,i=Rb(e)?e:null;if(i){f=null;try{i.select()}catch(a){}}else{if(n=d(),e=c.fire("SetSelectionRange",{range:e,forward:t}).range,n){f=e;try{n.removeAllRanges(),n.addRange(e)}catch(a){}!1===t&&n.extend&&(n.collapse(e.endContainer,e.endOffset),n.extend(e.startContainer,e.startOffset)),l=0<n.rangeCount?n.getRangeAt(0):null}e.collapsed||e.startContainer!==e.endContainer||!n.setBaseAndExtent||ve.ie||e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(r=e.startContainer.childNodes[e.startOffset])&&"IMG"===r.tagName&&(n.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),n.anchorNode===e.startContainer&&n.focusNode===e.endContainer||n.setBaseAndExtent(r,0,r,1)),c.fire("AfterSetSelectionRange",{range:e,forward:t})}}},p=function(){var e,t,n=d();return!(n&&n.anchorNode&&n.focusNode)||((e=u.createRng()).setStart(n.anchorNode,n.anchorOffset),e.collapse(!0),(t=u.createRng()).setStart(n.focusNode,n.focusOffset),t.collapse(!0),e.compareBoundaryPoints(e.START_TO_START,t)<=0)},g={bookmarkManager:null,controlSelection:null,dom:u,win:s,serializer:e,editor:c,collapse:o,setCursorLocation:function(e,t){var n=u.createRng();e?(n.setStart(e,t),n.setEnd(e,t),i(n),o(!1)):(_g(u,n,c.getBody(),!0),i(n))},getContent:function(e){return wb(c,e)},setContent:r,getBookmark:function(e,t){return n.getBookmark(e,t)},moveToBookmark:function(e){return n.moveToBookmark(e)},select:function(e,t){var r,n,o;return(r=u,n=e,o=t,A.from(n).map(function(e){var t=r.nodeIndex(e),n=r.createRng();return n.setStart(e.parentNode,t),n.setEnd(e.parentNode,t+1),o&&(_g(r,n,e,!0),_g(r,n,e,!1)),n})).each(i),e},isCollapsed:function(){var e=m(),t=d();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isForward:p,setNode:function(e){return r(u.getOuterHTML(e)),e},getNode:function(){return e=c.getBody(),(t=m())?(r=t.startContainer,o=t.endContainer,i=t.startOffset,a=t.endOffset,n=t.commonAncestorContainer,!t.collapsed&&(r===o&&a-i<2&&r.hasChildNodes()&&(n=r.childNodes[i]),3===r.nodeType&&3===o.nodeType&&(r=r.length===i?Tb(r.nextSibling,!0):r.parentNode,o=0===a?Tb(o.previousSibling,!1):o.parentNode,r&&r===o))?r:n&&3===n.nodeType?n.parentNode:n):e;var e,t,n,r,o,i,a},getSel:d,setRng:i,getRng:m,getStart:function(e){return Sb(c.getBody(),m(),e)},getEnd:function(e){return kb(c.getBody(),m(),e)},getSelectedBlocks:function(e,t){return function(e,t,n,r){var o,i,a=[];if(i=e.getRoot(),n=e.getParent(n||Sb(i,t,!1),e.isBlock),r=e.getParent(r||kb(i,t,!1),e.isBlock),n&&n!==i&&a.push(n),n&&r&&n!==r)for(var u=new ao(o=n,i);(o=u.next())&&o!==r;)e.isBlock(o)&&a.push(o);return r&&n!==r&&r!==i&&a.push(r),a}(u,m(),e,t)},normalize:function(){var e=m(),t=d();if(!_d(t)&&Bg(c)){var n=um(u,e);return n.each(function(e){i(e,p())}),n.getOr(e)}return e},selectorChanged:function(e,t){var i;return a||(a={},i={},c.on("NodeChange",function(e){var n=e.element,r=u.getParents(n,null,u.getRoot()),o={};Ab(a,function(e,n){Ab(r,function(t){if(u.is(t,n))return i[n]||(Ab(e,function(e){e(!0,{node:t,selector:n,parents:r})}),i[n]=e),o[n]=e,!1})}),Ab(i,function(e,t){o[t]||(delete i[t],Ab(e,function(e){e(!1,{node:n,selector:t,parents:r})}))})})),a[e]||(a[e]=[]),a[e].push(t),g},getScrollContainer:function(){for(var e,t=u.getRoot();t&&"BODY"!==t.nodeName;){if(t.scrollHeight>t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){return Nu(c,e,t)},placeCaretAt:function(e,t){return i(Zy(e,t,c.getDoc()))},getBoundingClientRect:function(){var e=m();return e.collapsed?La.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){s=l=f=null,t.destroy()}};return n=Xy(g),t=Jy(g,c),g.bookmarkManager=n,g.controlSelection=t,g},Db=Oo.isContentEditableFalse,Ob=aa,Pb=Bs,Lb=_s,Ib=function(e,t){for(;t=e(t);)if(t.isVisible())return t;return t},Mb=function(e,t,n,r){var o,i,a,u,s,c,l=e===iu.Forwards,f=l?Lb:Pb;return!r.collapsed&&(o=Ob(r),Db(o))?tu(e,t,o,e===iu.Backwards,!0):(u=Oi(r.startContainer),f(i=Rs(e,t.getBody(),r))?nu(t,i.getNode(!l)):(i=n(i))?f(i)?tu(e,t,i.getNode(!l),l,!0):f(a=n(i))&&(!(c=bs(s=i,a))&&Oo.isBr(s.getNode())||c)?tu(e,t,a.getNode(!l),l,!0):u?ou(t,i.toRange(),!0):null:u?r:null)},Fb=function(e,t,n,r){var o,i,a,u,s,c,l,f,d;if(d=Ob(r),o=Rs(e,t.getBody(),r),i=n(t.getBody(),Yg(1),o),a=Bt.filter(i,Gg(1)),s=Bt.last(o.getClientRects()),(Lb(o)||Ds(o))&&(d=o.getNode()),(Pb(o)||Os(o))&&(d=o.getNode(!0)),!s)return null;if(c=s.left,(u=nh(a,c))&&Db(u.node))return l=Math.abs(c-u.left),f=Math.abs(c-u.right),tu(e,t,u.node,l<f,!0);if(d){var m=function(e,t,n,r){var o,i,a,u,s,c,l=Ys(t),f=[],d=0,m=function(e){return Bt.last(e.getClientRects())};1===e?(o=l.next,i=ia,a=oa,u=La.after(r)):(o=l.prev,i=oa,a=ia,u=La.before(r)),c=m(u);do{if(u.isVisible()&&!a(s=m(u),c)){if(0<f.length&&i(s,Bt.last(f))&&d++,(s=ta(s)).position=u,s.line=d,n(s))return f;f.push(s)}}while(u=o(u));return f}(e,t.getBody(),Yg(1),d);if(u=nh(Bt.filter(m,Gg(1)),c))return ou(t,u.position.toRange(),!0);if(u=Bt.last(Bt.filter(m,Gg(0))))return ou(t,u.position.toRange(),!0)}},zb=function(e,t,n){var r,o,i,a,u=Ys(e.getBody()),s=da.curry(Ib,u.next),c=da.curry(Ib,u.prev);if(n.collapsed&&e.settings.forced_root_block){if(!(r=e.dom.getParent(n.startContainer,"PRE")))return;(1===t?s(La.fromRangeStart(n)):c(La.fromRangeStart(n)))||(a=(i=e).dom.create(i.settings.forced_root_block),(!ve.ie||11<=ve.ie)&&(a.innerHTML='<br data-mce-bogus="1">'),o=a,1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse())}},Ub=function(l,f){return function(){var e,t,n,r,o,i,a,u,s,c=(t=f,r=Ys((e=l).getBody()),o=da.curry(Ib,r.next),i=da.curry(Ib,r.prev),a=t?iu.Forwards:iu.Backwards,u=t?o:i,s=e.selection.getRng(),(n=Mb(a,e,u,s))?n:(n=zb(e,a,s))||null);return!!c&&(l.selection.setRng(c),!0)}},qb=function(u,s){return function(){var e,t,n,r,o,i,a=(r=(t=s)?1:-1,o=t?Xg:Kg,i=(e=u).selection.getRng(),(n=Fb(r,e,o,i))?n:(n=zb(e,r,i))||null);return!!a&&(u.selection.setRng(a),!0)}},Vb=function(e,r){return H.bind((t=e,H.map(t,function(e){return xy.merge({shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0,action:V.noop},e)})),function(e){return t=e,(n=r).keyCode===t.keyCode&&n.shiftKey===t.shiftKey&&n.altKey===t.altKey&&n.ctrlKey===t.ctrlKey&&n.metaKey===t.metaKey?[e]:[];var t,n});var t},Hb=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,r)}},jb=function(e,t){return H.find(Vb(e,t),function(e){return e.action()})},$b=function(i,a){i.on("keydown",function(e){var t,n,r,o;!1===e.isDefaultPrevented()&&(t=i,n=a,r=e,o=Un.detect().os,jb([{keyCode:sh.RIGHT,action:Ub(t,!0)},{keyCode:sh.LEFT,action:Ub(t,!1)},{keyCode:sh.UP,action:qb(t,!1)},{keyCode:sh.DOWN,action:qb(t,!0)},{keyCode:sh.RIGHT,action:es(t,!0)},{keyCode:sh.LEFT,action:es(t,!1)},{keyCode:sh.UP,action:ts(t,!1)},{keyCode:sh.DOWN,action:ts(t,!0)},{keyCode:sh.RIGHT,action:sd.move(t,n,!0)},{keyCode:sh.LEFT,action:sd.move(t,n,!1)},{keyCode:sh.RIGHT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:sd.moveNextWord(t,n)},{keyCode:sh.LEFT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:sd.movePrevWord(t,n)}],r).each(function(e){r.preventDefault()}))})},Wb=function(e){return 1===$r.children(e).length},Kb=function(e,t,n,r){var o,i,a,u,s=V.curry(Sv,t),c=H.map(H.filter(r,s),function(e){return e.dom()});if(0===c.length)vf(t,e,n);else{var l=(o=n.dom(),i=c,a=yv(!1),u=Nv(i,a.dom()),Hu.before(Vn.fromDom(o),a),Hc.remove(Vn.fromDom(o)),La(u,0));t.selection.setRng(l.toRange())}},Xb=function(n,r){var t,e=Vn.fromDom(n.getBody()),o=Vn.fromDom(n.selection.getStart()),i=H.filter((t=jl(o,e),H.findIndex(t,mo).fold(V.constant(t),function(e){return t.slice(0,e)})),Wb);return H.last(i).map(function(e){var t=La.fromRangeStart(n.selection.getRng());return!!El(r,t,e.dom())&&(Kb(r,n,e,i),!0)}).getOr(!1)},Yb=function(e,t){return!!e.selection.isCollapsed()&&Xb(e,t)},Gb=function(o,i){o.on("keydown",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(t=o,n=i,r=e,jb([{keyCode:sh.BACKSPACE,action:Hb(Cf,t,!1)},{keyCode:sh.DELETE,action:Hb(Cf,t,!0)},{keyCode:sh.BACKSPACE,action:Hb(dd,t,n,!1)},{keyCode:sh.DELETE,action:Hb(dd,t,n,!0)},{keyCode:sh.BACKSPACE,action:Hb(tf,t,!1)},{keyCode:sh.DELETE,action:Hb(tf,t,!0)},{keyCode:sh.BACKSPACE,action:Hb(Jl,t,!1)},{keyCode:sh.DELETE,action:Hb(Jl,t,!0)},{keyCode:sh.BACKSPACE,action:Hb($d,t,!1)},{keyCode:sh.DELETE,action:Hb($d,t,!0)},{keyCode:sh.BACKSPACE,action:Hb(Yb,t,!1)},{keyCode:sh.DELETE,action:Hb(Yb,t,!0)}],r).each(function(e){r.preventDefault()}))}),o.on("keyup",function(e){var t,n;!1===e.isDefaultPrevented()&&(t=o,n=e,jb([{keyCode:sh.BACKSPACE,action:Hb(xf,t)},{keyCode:sh.DELETE,action:Hb(xf,t)}],n))})},Jb=function(e){return A.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock))},Qb=function(e,t){var n,r,o,i=t,a=e.dom,u=e.schema.getMoveCaretBeforeOnEnterElements();if(t){if(/^(LI|DT|DD)$/.test(t.nodeName)){var s=function(e){for(;e;){if(1===e.nodeType||3===e.nodeType&&e.data&&/[\r\n\s]/.test(e.data))return e;e=e.nextSibling}}(t.firstChild);s&&/^(UL|OL|DL)$/.test(s.nodeName)&&t.insertBefore(a.doc.createTextNode("\xa0"),t.firstChild)}if(o=a.createRng(),t.normalize(),t.hasChildNodes()){for(n=new ao(t,t);r=n.current();){if(Oo.isText(r)){o.setStart(r,0),o.setEnd(r,0);break}if(u[r.nodeName.toLowerCase()]){o.setStartBefore(r),o.setEndBefore(r);break}i=r,r=n.next()}r||(o.setStart(i,0),o.setEnd(i,0))}else Oo.isBr(t)?t.nextSibling&&a.isBlock(t.nextSibling)?(o.setStartBefore(t),o.setEndBefore(t)):(o.setStartAfter(t),o.setEndAfter(t)):(o.setStart(t,0),o.setEnd(t,0));e.selection.setRng(o),a.remove(void 0),e.selection.scrollIntoView(t)}},Zb=function(e,t){var n,r,o=e.getRoot();for(n=t;n!==o&&"false"!==e.getContentEditable(n);)"true"===e.getContentEditable(n)&&(r=n),n=n.parentNode;return n!==o?r:o},eC=Jb,tC=function(e){return Jb(e).fold(V.constant(""),function(e){return e.nodeName.toUpperCase()})},nC=function(e){return Jb(e).filter(function(e){return yo(Vn.fromDom(e))}).isSome()},rC=function(e,t){return e&&e.parentNode&&e.parentNode.nodeName===t},oC=function(e){return e&&/^(OL|UL|LI)$/.test(e.nodeName)},iC=function(e){var t=e.parentNode;return/^(LI|DT|DD)$/.test(t.nodeName)?t:e},aC=function(e,t,n){for(var r=e[n?"firstChild":"lastChild"];r&&!Oo.isElement(r);)r=r[n?"nextSibling":"previousSibling"];return r===t},uC=function(e,t,n,r,o){var i=e.dom,a=e.selection.getRng();if(n!==e.getBody()){var u;oC(u=n)&&oC(u.parentNode)&&(o="LI");var s,c,l=o?t(o):i.create("BR");if(aC(n,r,!0)&&aC(n,r,!1))rC(n,"LI")?i.insertAfter(l,iC(n)):i.replace(l,n);else if(aC(n,r,!0))rC(n,"LI")?(i.insertAfter(l,iC(n)),l.appendChild(i.doc.createTextNode(" ")),l.appendChild(n)):n.parentNode.insertBefore(l,n);else if(aC(n,r,!1))i.insertAfter(l,iC(n));else{n=iC(n);var f=a.cloneRange();f.setStartAfter(r),f.setEndAfter(n);var d=f.extractContents();"LI"===o&&(c="LI",(s=d).firstChild&&s.firstChild.nodeName===c)?(l=d.firstChild,i.insertAfter(d,n)):(i.insertAfter(d,n),i.insertAfter(l,n))}i.remove(r),Qb(e,l)}},sC=function(e){e.innerHTML='<br data-mce-bogus="1">'},cC=function(e,t){return e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t},lC=function(e,t){return t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t)},fC=function(e,t,n){return!1===Oo.isText(t)?n:e?1===n&&t.data.charAt(n-1)===Ri?0:n:n===t.data.length-1&&t.data.charAt(n)===Ri?t.data.length:n},dC=function(e,t){var n,r,o=e.getRoot();for(n=t;n!==o&&"false"!==e.getContentEditable(n);)"true"===e.getContentEditable(n)&&(r=n),n=n.parentNode;return n!==o?r:o},mC=function(e,t){var n=Ou(e);n&&n.toLowerCase()===t.tagName.toLowerCase()&&e.dom.setAttribs(t,Pu(e))},pC=function(a,e){var t,u,s,i,c,n,r,o,l,f,d,m,p,g,h,v,y,b,C=a.dom,x=a.schema,w=x.getNonEmptyElements(),N=a.selection.getRng(),E=function(e){var t,n,r,o=s,i=x.getTextInlineElements();if(e||"TABLE"===f||"HR"===f?(t=C.create(e||m),mC(a,t)):t=c.cloneNode(!1),r=t,!1===Mu(a))C.setAttrib(t,"style",null),C.setAttrib(t,"class",null);else do{if(i[o.nodeName]){if(kc(o))continue;n=o.cloneNode(!1),C.setAttrib(n,"id",""),t.hasChildNodes()?n.appendChild(t.firstChild):r=n,t.appendChild(n)}}while((o=o.parentNode)&&o!==u);return sC(r),t},S=function(e){var t,n,r,o;if(o=fC(e,s,i),Oo.isText(s)&&(e?0<o:o<s.nodeValue.length))return!1;if(s.parentNode===c&&p&&!e)return!0;if(e&&Oo.isElement(s)&&s===c.firstChild)return!0;if(cC(s,"TABLE")||cC(s,"HR"))return p&&!e||!p&&e;for(t=new ao(s,c),Oo.isText(s)&&(e&&0===o?t.prev():e||o!==s.nodeValue.length||t.next());n=t.current();){if(Oo.isElement(n)){if(!n.getAttribute("data-mce-bogus")&&(r=n.nodeName.toLowerCase(),w[r]&&"br"!==r))return!1}else if(Oo.isText(n)&&!/^[ \t\r\n]*$/.test(n.nodeValue))return!1;e?t.prev():t.next()}return!0},k=function(){r=/^(H[1-6]|PRE|FIGURE)$/.test(f)&&"HGROUP"!==d?E(m):E(),Fu(a)&&lC(C,l)&&C.isEmpty(c)?r=C.split(l,c):C.insertAfter(r,c),Qb(a,r)};um(C,N).each(function(e){N.setStart(e.startContainer,e.startOffset),N.setEnd(e.endContainer,e.endOffset)}),s=N.startContainer,i=N.startOffset,m=Ou(a),n=e.shiftKey,Oo.isElement(s)&&s.hasChildNodes()&&(p=i>s.childNodes.length-1,s=s.childNodes[Math.min(i,s.childNodes.length-1)]||s,i=p&&Oo.isText(s)?s.nodeValue.length:0),(u=dC(C,s))&&((m&&!n||!m&&n)&&(s=function(e,t,n,r,o){var i,a,u,s,c,l,f,d=t||"P",m=e.dom,p=dC(m,r);if(!(a=m.getParent(r,m.isBlock))||!lC(m,a)){if(l=(a=a||p)===e.getBody()||(f=a)&&/^(TD|TH|CAPTION)$/.test(f.nodeName)?a.nodeName.toLowerCase():a.parentNode.nodeName.toLowerCase(),!a.hasChildNodes())return i=m.create(d),mC(e,i),a.appendChild(i),n.setStart(i,0),n.setEnd(i,0),i;for(s=r;s.parentNode!==a;)s=s.parentNode;for(;s&&!m.isBlock(s);)s=(u=s).previousSibling;if(u&&e.schema.isValidChild(l,d.toLowerCase())){for(i=m.create(d),mC(e,i),u.parentNode.insertBefore(i,u),s=u;s&&!m.isBlock(s);)c=s.nextSibling,i.appendChild(s),s=c;n.setStart(r,o),n.setEnd(r,o)}}return r}(a,m,N,s,i)),c=C.getParent(s,C.isBlock),l=c?C.getParent(c.parentNode,C.isBlock):null,f=c?c.nodeName.toUpperCase():"","LI"!==(d=l?l.nodeName.toUpperCase():"")||e.ctrlKey||(l=(c=l).parentNode,f=d),/^(LI|DT|DD)$/.test(f)&&C.isEmpty(c)?uC(a,E,l,c,m):m&&c===a.getBody()||(m=m||"P",Oi(c)?(r=Vi(c),C.isEmpty(c)&&sC(c),Qb(a,r)):S()?k():S(!0)?(r=c.parentNode.insertBefore(E(),c),Qb(a,cC(c,"HR")?r:c)):((t=(y=N,b=y.cloneRange(),b.setStart(y.startContainer,fC(!0,y.startContainer,y.startOffset)),b.setEnd(y.endContainer,fC(!1,y.endContainer,y.endOffset)),b).cloneRange()).setEndAfter(c),function(e){for(;Oo.isText(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(o=t.extractContents()),r=o.firstChild,C.insertAfter(o,c),function(e,t,n){var r,o=n,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;Oo.isElement(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(r=i.length;r--;)!(o=i[r]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(a=o)&&"A"===a.nodeName&&0===It.trim(_i(a.innerText||a.textContent)).length&&e.remove(o);var a}}(C,w,r),g=C,(h=c).normalize(),(v=h.lastChild)&&!/^(left|right)$/gi.test(g.getStyle(v,"float",!0))||g.add(h,"br"),C.isEmpty(c)&&sC(c),r.normalize(),C.isEmpty(r)?(C.remove(r),k()):Qb(a,r)),C.setAttrib(r,"id",""),a.fire("NewBlock",{newBlock:r})))},gC=function(e,t){return eC(e).filter(function(e){return 0<t.length&&Pr.is(Vn.fromDom(e),t)}).isSome()},hC=function(e){return gC(e,Lu(e))},vC=function(e){return gC(e,Iu(e))},yC=nf([{br:[]},{block:[]},{none:[]}]),bC=function(e,t){return vC(e)},CC=function(n){return function(e,t){return""===Ou(e)===n}},xC=function(n){return function(e,t){return nC(e)===n}},wC=function(n,r){return function(e,t){return tC(e)===n.toUpperCase()===r}},NC=function(e){return wC("pre",e)},EC=function(n){return function(e,t){return Du(e)===n}},SC=function(e,t){return hC(e)},kC=function(e,t){return t},TC=function(e){var t=Ou(e),n=Zb(e.dom,e.selection.getStart());return n&&e.schema.isValidChild(n.nodeName,t||"P")},AC=function(e,t){return function(n,r){return H.foldl(e,function(e,t){return e&&t(n,r)},!0)?A.some(t):A.none()}},RC=function(e,t){return Df([AC([bC],yC.none()),AC([wC("summary",!0)],yC.br()),AC([NC(!0),EC(!1),kC],yC.br()),AC([NC(!0),EC(!1)],yC.block()),AC([NC(!0),EC(!0),kC],yC.block()),AC([NC(!0),EC(!0)],yC.br()),AC([xC(!0),kC],yC.br()),AC([xC(!0)],yC.block()),AC([CC(!0),kC,TC],yC.block()),AC([CC(!0)],yC.br()),AC([SC],yC.br()),AC([CC(!1),kC],yC.br()),AC([TC],yC.block())],[e,t.shiftKey]).getOr(yC.none())},_C=function(e,t){RC(e,t).fold(function(){vm(e,t)},function(){pC(e,t)},V.noop)},BC=function(o){o.on("keydown",function(e){var t,n,r;e.keyCode===sh.ENTER&&(t=o,(n=e).isDefaultPrevented()||(n.preventDefault(),(r=t.undoManager).typing&&(r.typing=!1,r.add()),t.undoManager.transact(function(){!1===t.selection.isCollapsed()&&t.execCommand("Delete"),_C(t,n)})))})},DC=function(e,t,n){return u=t,!(!OC(n)||!Oo.isText(u.container())||(r=e,i=(o=t).container(),a=o.offset(),i.insertData(a,"\xa0"),r.selection.setCursorLocation(i,a+1),0));var r,o,i,a,u},OC=function(e){return e.fold(V.constant(!1),V.constant(!0),V.constant(!0),V.constant(!1))},PC=function(e){return!!e.selection.isCollapsed()&&(t=e,n=V.curry(xl.isInlineTarget,t),r=La.fromRangeStart(t.selection.getRng()),Gf(n,t.getBody(),r).map(V.curry(DC,t,r)).getOr(!1));var t,n,r},LC=function(r){r.on("keydown",function(e){var t,n;!1===e.isDefaultPrevented()&&(t=r,n=e,jb([{keyCode:sh.SPACEBAR,action:Hb(PC,t)}],n).each(function(e){n.preventDefault()}))})},IC=function(e,t){var n;t.hasAttribute("data-mce-caret")&&(Vi(t),(n=e).selection.setRng(n.selection.getRng()),e.selection.scrollIntoView(t))},MC=function(e,t){var n,r=(n=e,Tl(Vn.fromDom(n.getBody()),"*[data-mce-caret]").fold(V.constant(null),function(e){return e.dom()}));if(r)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void IC(e,r)):void(Ii(r)&&(IC(e,r),e.undoManager.add()))},FC=function(e){e.on("keyup compositionstart",V.curry(MC,e))},zC=function(e){var t=sd.setupSelectedState(e);FC(e),$b(e,t),Gb(e,t),BC(e),LC(e)};function UC(u){var s,n,r,o=It.each,c=sh.BACKSPACE,l=sh.DELETE,f=u.dom,d=u.selection,e=u.settings,t=u.parser,i=ve.gecko,a=ve.ie,m=ve.webkit,p="data:text/mce-internal,",g=a?"Text":"URL",h=function(e,t){try{u.getDoc().execCommand(e,!1,t)}catch(n){}},v=function(e){return e.isDefaultPrevented()},y=function(){u.shortcuts.add("meta+a",null,"SelectAll")},b=function(){u.on("keydown",function(e){if(!v(e)&&e.keyCode===c&&d.isCollapsed()&&0===d.getRng().startOffset){var t=d.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})},C=function(){u.inline||(u.contentStyles.push("body {min-height: 150px}"),u.on("click",function(e){var t;if("HTML"===e.target.nodeName){if(11<ve.ie)return void u.getBody().focus();t=u.selection.getRng(),u.getBody().focus(),u.selection.setRng(t),u.selection.normalize(),u.nodeChanged()}}))};return u.on("keydown",function(e){var t,n,r,o,i;if(!v(e)&&e.keyCode===sh.BACKSPACE&&(n=(t=d.getRng()).startContainer,r=t.startOffset,o=f.getRoot(),i=n,t.collapsed&&0===r)){for(;i&&i.parentNode&&i.parentNode.firstChild===i&&i.parentNode!==o;)i=i.parentNode;"BLOCKQUOTE"===i.tagName&&(u.formatter.toggle("blockquote",null,i),(t=f.createRng()).setStart(n,0),t.setEnd(n,0),d.setRng(t))}}),s=function(e){var t=f.create("body"),n=e.cloneContents();return t.appendChild(n),d.serializer.serialize(t,{format:"html"})},u.on("keydown",function(e){var t,n,r,o,i,a=e.keyCode;if(!v(e)&&(a===l||a===c)){if(t=u.selection.isCollapsed(),n=u.getBody(),t&&!f.isEmpty(n))return;if(!t&&(r=u.selection.getRng(),o=s(r),(i=f.createRng()).selectNode(u.getBody()),o!==s(i)))return;e.preventDefault(),u.setContent(""),n.firstChild&&f.isBlock(n.firstChild)?u.selection.setCursorLocation(n.firstChild,0):u.selection.setCursorLocation(n,0),u.nodeChanged()}}),ve.windowsPhone||u.on("keyup focusin mouseup",function(e){sh.modifierPressed(e)||d.normalize()},!0),m&&(u.settings.content_editable||f.bind(u.getDoc(),"mousedown mouseup",function(e){var t;if(e.target===u.getDoc().documentElement)if(t=d.getRng(),u.getBody().focus(),"mousedown"===e.type){if(Li(t.startContainer))return;d.placeCaretAt(e.clientX,e.clientY)}else d.setRng(t)}),u.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==f.getContentEditableParent(t)&&(e.preventDefault(),u.selection.select(t),u.nodeChanged()),"A"===t.nodeName&&f.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),d.select(t))}),e.forced_root_block&&u.on("init",function(){h("DefaultParagraphSeparator",e.forced_root_block)}),u.on("init",function(){u.dom.bind(u.getBody(),"submit",function(e){e.preventDefault()})}),b(),t.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()}),ve.iOS?(u.inline||u.on("keydown",function(){document.activeElement===document.body&&u.getWin().focus()}),C(),u.on("click",function(e){var t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)}),u.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")):y()),11<=ve.ie&&(C(),b()),ve.ie&&(y(),h("AutoUrlDetect",!1),u.on("dragstart",function(e){var t,n,r;(t=e).dataTransfer&&(u.selection.isCollapsed()&&"IMG"===t.target.tagName&&d.select(t.target),0<(n=u.selection.getContent()).length&&(r=p+escape(u.id)+","+escape(n),t.dataTransfer.setData(g,r)))}),u.on("drop",function(e){if(!v(e)){var t=(i=e).dataTransfer&&(a=i.dataTransfer.getData(g))&&0<=a.indexOf(p)?(a=a.substr(p.length).split(","),{id:unescape(a[0]),html:unescape(a[1])}):null;if(t&&t.id!==u.id){e.preventDefault();var n=Zy(e.x,e.y,u.getDoc());d.setRng(n),r=t.html,o=!0,u.queryCommandSupported("mceInsertClipboardContent")?u.execCommand("mceInsertClipboardContent",!1,{content:r,internal:o}):u.execCommand("mceInsertContent",!1,r)}}var r,o,i,a})),i&&(u.on("keydown",function(e){if(!v(e)&&e.keyCode===c){if(!u.getBody().getElementsByTagName("hr").length)return;if(d.isCollapsed()&&0===d.getRng().startOffset){var t=d.getNode(),n=t.previousSibling;if("HR"===t.nodeName)return f.remove(t),void e.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(f.remove(n),e.preventDefault())}}}),Range.prototype.getClientRects||u.on("mousedown",function(e){if(!v(e)&&"HTML"===e.target.nodeName){var t=u.getBody();t.blur(),we.setEditorTimeout(u,function(){t.focus()})}}),n=function(){var e=f.getAttribs(d.getStart().cloneNode(!1));return function(){var t=d.getStart();t!==u.getBody()&&(f.setAttrib(t,"style",null),o(e,function(e){t.setAttributeNode(e.cloneNode(!0))}))}},r=function(){return!d.isCollapsed()&&f.getParent(d.getStart(),f.isBlock)!==f.getParent(d.getEnd(),f.isBlock)},u.on("keypress",function(e){var t;if(!v(e)&&(8===e.keyCode||46===e.keyCode)&&r())return t=n(),u.getDoc().execCommand("delete",!1,null),t(),e.preventDefault(),!1}),f.bind(u.getDoc(),"cut",function(e){var t;!v(e)&&r()&&(t=n(),we.setEditorTimeout(u,function(){t()}))}),e.readonly||u.on("BeforeExecCommand MouseDown",function(){h("StyleWithCSS",!1),h("enableInlineTableEditing",!1),e.object_resizing||h("enableObjectResizing",!1)}),u.on("SetContent ExecCommand",function(e){"setcontent"!==e.type&&"mceInsertLink"!==e.command||o(f.select("a"),function(e){var t=e.parentNode,n=f.getRoot();if(t.lastChild===e){for(;t&&!f.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}f.add(t,"br",{"data-mce-bogus":1})}})}),u.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}"),ve.mac&&u.on("keydown",function(e){!sh.metaKeyPressed(e)||e.shiftKey||37!==e.keyCode&&39!==e.keyCode||(e.preventDefault(),u.selection.getSel().modify("move",37===e.keyCode?"backward":"forward","lineboundary"))}),b()),{refreshContentEditable:function(){},isHidden:function(){var e;return!i||u.removed?0:!(e=u.selection.getSel())||!e.rangeCount||0===e.rangeCount}}}var qC=function(e){return Oo.isElement(e)&&ho(Vn.fromDom(e))},VC=function(t){t.on("click",function(e){3===e.detail&&function(e){var t=e.selection.getRng(),n=Da.fromRangeStart(t),r=Da.fromRangeEnd(t);if(Da.isElementPosition(n)){var o=n.container();qC(o)&&Qa.firstPositionIn(o).each(function(e){return t.setStart(e.container(),e.offset())})}Da.isElementPosition(r)&&(o=n.container(),qC(o)&&Qa.lastPositionIn(o).each(function(e){return t.setEnd(e.container(),e.offset())})),e.selection.setRng(Zc(t))}(t)})},HC=function(e){var t,n;(t=e).on("click",function(e){t.dom.getParent(e.target,"details")&&e.preventDefault()}),(n=e).parser.addNodeFilter("details",function(e){H.each(e,function(e){e.attr("data-mce-open",e.attr("open")),e.attr("open","open")})}),n.serializer.addNodeFilter("details",function(e){H.each(e,function(e){var t=e.attr("data-mce-open");e.attr("open",k.isString(t)?t:null),e.attr("data-mce-open",null)})})},jC=vi.DOM,$C=function(e){var t;e.bindPendingEventDelegates(),e.initialized=!0,e.fire("init"),e.focus(!0),e.nodeChanged({initial:!0}),e.execCallback("init_instance_callback",e),(t=e).settings.auto_focus&&we.setEditorTimeout(t,function(){var e;(e=!0===t.settings.auto_focus?t:t.editorManager.get(t.settings.auto_focus)).destroyed||e.focus()},100)},WC=function(t,e){var n,r,u,o,i,a,s,c,l,f=t.settings,d=t.getElement(),m=t.getDoc();f.inline||(t.getElement().style.visibility=t.orgVisibility),e||f.content_editable||(m.open(),m.write(t.iframeHTML),m.close()),f.content_editable&&(t.on("remove",function(){var e=this.getBody();jC.removeClass(e,"mce-content-body"),jC.removeClass(e,"mce-edit-focus"),jC.setAttrib(e,"contentEditable",null)}),jC.addClass(d,"mce-content-body"),t.contentDocument=m=f.content_document||document,t.contentWindow=f.content_window||window,t.bodyElement=d,f.content_document=f.content_window=null,f.root_name=d.nodeName.toLowerCase()),(n=t.getBody()).disabled=!0,t.readonly=f.readonly,t.readonly||(t.inline&&"static"===jC.getStyle(n,"position",!0)&&(n.style.position="relative"),n.contentEditable=t.getParam("content_editable_state",!0)),n.disabled=!1,t.editorUpload=wg(t),t.schema=oi(f),t.dom=vi(m,{keep_values:!0,url_converter:t.convertURL,url_converter_scope:t,hex_colors:f.force_hex_style_colors,class_filter:f.class_filter,update_styles:!0,root_element:t.inline?t.getBody():null,collect:f.content_editable,schema:t.schema,onSetAttrib:function(e){t.fire("SetAttrib",e)}}),t.parser=((o=qy((u=t).settings,u.schema)).addAttributeFilter("src,href,style,tabindex",function(e,t){for(var n,r,o,i=e.length,a=u.dom;i--;)if(r=(n=e[i]).attr(t),o="data-mce-"+t,!n.attributes.map[o]){if(0===r.indexOf("data:")||0===r.indexOf("blob:"))continue;"style"===t?((r=a.serializeStyle(a.parseStyle(r),n.name)).length||(r=null),n.attr(o,r),n.attr(t,r)):"tabindex"===t?(n.attr(o,r),n.attr(t,null)):n.attr(o,u.convertURL(r,t,n.name))}}),o.addNodeFilter("script",function(e){for(var t,n,r=e.length;r--;)0!==(n=(t=e[r]).attr("type")||"no/type").indexOf("mce-")&&t.attr("type","mce-"+n)}),o.addNodeFilter("#cdata",function(e){for(var t,n=e.length;n--;)(t=e[n]).type=8,t.name="#comment",t.value="[CDATA["+t.value+"]]"}),o.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t,n=e.length,r=u.schema.getNonEmptyElements();n--;)(t=e[n]).isEmpty(r)&&0===t.getAll("br").length&&(t.append(new _y("br",1)).shortEnded=!0)}),o),t.serializer=Wy(f,t),t.selection=Bb(t.dom,t.getWin(),t.serializer,t),t.formatter=vy(t),t.undoManager=Uh(t),t._nodeChangeDispatcher=new Dg(t),t._selectionOverrides=ph(t),HC(t),VC(t),zC(t),kg(t),t.fire("PreInit"),f.browser_spellcheck||f.gecko_spellcheck||(m.body.spellcheck=!1,jC.setAttrib(n,"spellcheck","false")),t.quirks=UC(t),t.fire("PostRender"),f.directionality&&(n.dir=f.directionality),f.nowrap&&(n.style.whiteSpace="nowrap"),f.protect&&t.on("BeforeSetContent",function(t){It.each(f.protect,function(e){t.content=t.content.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})})}),t.on("SetContent",function(){t.addVisual(t.getBody())}),t.load({initial:!0,format:"html"}),t.startContent=t.getContent({format:"raw"}),t.on("compositionstart compositionend",function(e){t.composing="compositionstart"===e.type}),0<t.contentStyles.length&&(r="",It.each(t.contentStyles,function(e){r+=e+"\r\n"}),t.dom.addStyle(r)),(i=t,i.inline?jC.styleSheetLoader:i.dom.styleSheetLoader).loadAll(t.contentCSS,function(e){$C(t)},function(e){$C(t)}),f.content_style&&(a=t,s=f.content_style,c=Vn.fromDom(a.getDoc().head),l=Vn.fromTag("style"),lr.set(l,"type","text/css"),Hu.append(l,Vn.fromText(s)),Hu.append(c,l))},KC=vi.DOM,XC=function(e,t){var n,r,o,i,a,u,s,c=e.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),l=(n=e.id,r=c,o=t.height,i=ku(e),s=Vn.fromTag("iframe"),lr.setAll(s,i),lr.setAll(s,{id:n+"_ifr",frameBorder:"0",allowTransparency:"true",title:r}),yr(s,{width:"100%",height:(a=o,u="number"==typeof a?a+"px":a,u||""),display:"block"}),s).dom();l.onload=function(){l.onload=null,e.fire("load")};var f,d,m,p,g=function(e,t){if(document.domain!==window.location.hostname&&ve.ie&&ve.ie<12){var n=xg.uuid("mce");e[n]=function(){WC(e)};var r='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+e.id+'");document.write(ed.iframeHTML);document.close();ed.'+n+"(true);})()";return KC.setAttrib(t,"src",r),!0}return!1}(e,l);return e.contentAreaContainer=t.iframeContainer,e.iframeElement=l,e.iframeHTML=(p=Tu(f=e)+"<html><head>",Au(f)!==f.documentBaseUrl&&(p+='<base href="'+f.documentBaseURI.getURI()+'" />'),p+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />',d=Ru(f),m=_u(f),Bu(f)&&(p+='<meta http-equiv="Content-Security-Policy" content="'+Bu(f)+'" />'),p+='</head><body id="'+d+'" class="mce-content-body '+m+'" data-id="'+f.id+'"><br></body></html>'),KC.add(t.iframeContainer,l),g},YC=function(e,t){var n=XC(e,t);t.editorContainer&&(KC.get(t.editorContainer).style.display=e.orgDisplay,e.hidden=KC.isHidden(t.editorContainer)),e.getElement().style.display="none",KC.setAttrib(e.id,"aria-hidden","true"),n||WC(e)},GC=vi.DOM,JC=function(t,n,e){var r,o,i=og.get(e);if(r=og.urls[e]||t.documentBaseUrl.replace(/\/$/,""),e=It.trim(e),i&&-1===It.inArray(n,e)){if(It.each(og.dependencies(e),function(e){JC(t,n,e)}),t.plugins[e])return;o=new i(t,r,t.$),(t.plugins[e]=o).init&&(o.init(t,r),n.push(e))}},QC=function(e){return e.replace(/^\-/,"")},ZC=function(e){return{editorContainer:e,iframeContainer:e}},ex=function(e){var t,n,r=e.getElement();return e.inline?ZC(null):(t=r,n=GC.create("div"),GC.insertAfter(n,t),ZC(n))},tx=function(e){var t,n,r,o,i,a,u,s,c,l,f,d=e.settings,m=e.getElement();return e.orgDisplay=m.style.display,k.isString(d.theme)?(l=(o=e).settings,f=o.getElement(),i=l.width||GC.getStyle(f,"width")||"100%",a=l.height||GC.getStyle(f,"height")||f.offsetHeight,u=l.min_height||100,(s=/^[0-9\.]+(|px)$/i).test(""+i)&&(i=Math.max(parseInt(i,10),100)),s.test(""+a)&&(a=Math.max(parseInt(a,10),u)),c=o.theme.renderUI({targetNode:f,width:i,height:a,deltaWidth:l.delta_width,deltaHeight:l.delta_height}),l.content_editable||(a=(c.iframeHeight||a)+("number"==typeof a?c.deltaHeight||0:""))<u&&(a=u),c.height=a,c):k.isFunction(d.theme)?(r=(t=e).getElement(),(n=t.settings.theme(t,r)).editorContainer.nodeType&&(n.editorContainer.id=n.editorContainer.id||t.id+"_parent"),n.iframeContainer&&n.iframeContainer.nodeType&&(n.iframeContainer.id=n.iframeContainer.id||t.id+"_iframecontainer"),n.height=n.iframeHeight?n.iframeHeight:r.offsetHeight,n):ex(e)},nx=function(t){var e,n,r,o,i,a,u=t.settings,s=t.getElement();return t.rtl=u.rtl_ui||t.editorManager.i18n.rtl,t.editorManager.i18n.setCode(u.language),u.aria_label=u.aria_label||GC.getAttrib(s,"aria-label",t.getLang("aria.rich_text_area")),t.fire("ScriptsLoaded"),o=(n=t).settings.theme,k.isString(o)?(n.settings.theme=QC(o),r=ig.get(o),n.theme=new r(n,ig.urls[o]),n.theme.init&&n.theme.init(n,ig.urls[o]||n.documentBaseUrl.replace(/\/$/,""),n.$)):n.theme={},i=t,a=[],It.each(i.settings.plugins.split(/[ ,]/),function(e){JC(i,a,QC(e))}),e=tx(t),t.editorContainer=e.editorContainer?e.editorContainer:null,u.content_css&&It.each(It.explode(u.content_css),function(e){t.contentCSS.push(t.documentBaseURI.toAbsolute(e))}),u.content_editable?WC(t):YC(t,e)},rx=vi.DOM,ox=function(e){return"-"===e.charAt(0)},ix=function(i,a){var u=wi.ScriptLoader;!function(e,t,n,r){var o=t.settings,i=o.theme;if(k.isString(i)){if(!ox(i)&&!ig.urls.hasOwnProperty(i)){var a=o.theme_url;a?ig.load(i,t.documentBaseURI.toAbsolute(a)):ig.load(i,"themes/"+i+"/theme"+n+".js")}e.loadQueue(function(){ig.waitFor(i,r)})}else r()}(u,i,a,function(){var e,t,n,r,o;e=u,(n=(t=i).settings).language&&"en"!==n.language&&!n.language_url&&(n.language_url=t.editorManager.baseURL+"/langs/"+n.language+".js"),n.language_url&&!t.editorManager.i18n.data[n.language]&&e.add(n.language_url),r=i.settings,o=a,It.isArray(r.plugins)&&(r.plugins=r.plugins.join(" ")),It.each(r.external_plugins,function(e,t){og.load(t,e),r.plugins+=" "+t}),It.each(r.plugins.split(/[ ,]/),function(e){if((e=It.trim(e))&&!og.urls[e])if(ox(e)){e=e.substr(1,e.length);var t=og.dependencies(e);It.each(t,function(e){var t={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"};e=og.createUrl(t,e),og.load(e.resource,e)})}else og.load(e,{prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"})}),u.loadQueue(function(){i.removed||nx(i)},i,function(e){eg(i,e[0]),i.removed||nx(i)})})},ax=function(t){var e=t.settings,n=t.id,r=function(){rx.unbind(window,"ready",r),t.render()};if(Be.Event.domLoaded){if(t.getElement()&&ve.contentEditable){e.inline?t.inline=!0:(t.orgVisibility=t.getElement().style.visibility,t.getElement().style.visibility="hidden");var o=t.getElement().form||rx.getParent(n,"form");o&&(t.formElement=o,e.hidden_input&&!/TEXTAREA|INPUT/i.test(t.getElement().nodeName)&&(rx.insertAfter(rx.create("input",{type:"hidden",name:n}),n),t.hasHiddenInput=!0),t.formEventDelegate=function(e){t.fire(e.type,e)},rx.bind(o,"submit reset",t.formEventDelegate),t.on("reset",function(){t.setContent(t.startContent,{format:"raw"})}),!e.submit_patch||o.submit.nodeType||o.submit.length||o._mceOldSubmit||(o._mceOldSubmit=o.submit,o.submit=function(){return t.editorManager.triggerSave(),t.setDirty(!1),o._mceOldSubmit(o)})),t.windowManager=Yp(t),t.notificationManager=Xp(t),"xml"===e.encoding&&t.on("GetContent",function(e){e.save&&(e.content=rx.encode(e.content))}),e.add_form_submit_trigger&&t.on("submit",function(){t.initialized&&t.save()}),e.add_unload_trigger&&(t._beforeUnload=function(){!t.initialized||t.destroyed||t.isHidden()||t.save({format:"raw",no_events:!0,set_dirty:!1})},t.editorManager.on("BeforeUnload",t._beforeUnload)),t.editorManager.add(t),ix(t,t.suffix)}}else rx.bind(window,"ready",r)},ux=function(e,t,n){var r=e.sidebars?e.sidebars:[];r.push({name:t,settings:n}),e.sidebars=r},sx=It.each,cx=It.trim,lx="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),fx={ftp:21,http:80,https:443,mailto:25},dx=function(r,e){var t,n,o=this;if(r=cx(r),t=(e=o.settings=e||{}).base_uri,/^([\w\-]+):([^\/]{2})/i.test(r)||/^\s*#/.test(r))o.source=r;else{var i=0===r.indexOf("//");0!==r.indexOf("/")||i||(r=(t&&t.protocol||"http")+"://mce_host"+r),/^[\w\-]*:?\/\//.test(r)||(n=e.base_uri?e.base_uri.path:new dx(document.location.href).directory,""==e.base_uri.protocol?r="//mce_host"+o.toAbsPath(n,r):(r=/([^#?]*)([#?]?.*)/.exec(r),r=(t&&t.protocol||"http")+"://mce_host"+o.toAbsPath(n,r[1])+r[2])),r=r.replace(/@@/g,"(mce_at)"),r=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(r),sx(lx,function(e,t){var n=r[t];n&&(n=n.replace(/\(mce_at\)/g,"@@")),o[e]=n}),t&&(o.protocol||(o.protocol=t.protocol),o.userInfo||(o.userInfo=t.userInfo),o.port||"mce_host"!==o.host||(o.port=t.port),o.host&&"mce_host"!==o.host||(o.host=t.host),o.source=""),i&&(o.protocol="")}};dx.prototype={setPath:function(e){e=/^(.*?)\/?(\w+)?$/.exec(e),this.path=e[0],this.directory=e[1],this.file=e[2],this.source="",this.getURI()},toRelative:function(e){var t;if("./"===e)return e;if("mce_host"!==(e=new dx(e,{base_uri:this})).host&&this.host!==e.host&&e.host||this.port!==e.port||this.protocol!==e.protocol&&""!==e.protocol)return e.getURI();var n=this.getURI(),r=e.getURI();return n===r||"/"===n.charAt(n.length-1)&&n.substr(0,n.length-1)===r?n:(t=this.toRelPath(this.path,e.path),e.query&&(t+="?"+e.query),e.anchor&&(t+="#"+e.anchor),t)},toAbsolute:function(e,t){return(e=new dx(e,{base_uri:this})).getURI(t&&this.isSameOrigin(e))},isSameOrigin:function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=fx[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},toRelPath:function(e,t){var n,r,o,i=0,a="";if(e=(e=e.substring(0,e.lastIndexOf("/"))).split("/"),n=t.split("/"),e.length>=n.length)for(r=0,o=e.length;r<o;r++)if(r>=n.length||e[r]!==n[r]){i=r+1;break}if(e.length<n.length)for(r=0,o=n.length;r<o;r++)if(r>=e.length||e[r]!==n[r]){i=r+1;break}if(1===i)return t;for(r=0,o=e.length-(i-1);r<o;r++)a+="../";for(r=i-1,o=n.length;r<o;r++)a+=r!==i-1?"/"+n[r]:n[r];return a},toAbsPath:function(e,t){var n,r,o,i=0,a=[];for(r=/\/$/.test(t)?"/":"",e=e.split("/"),t=t.split("/"),sx(e,function(e){e&&a.push(e)}),e=a,n=t.length-1,a=[];0<=n;n--)0!==t[n].length&&"."!==t[n]&&(".."!==t[n]?0<i?i--:a.push(t[n]):i++);return 0!==(o=(n=e.length-i)<=0?a.reverse().join("/"):e.slice(0,n).join("/")+"/"+a.reverse().join("/")).indexOf("/")&&(o="/"+o),r&&o.lastIndexOf("/")!==o.length-1&&(o+=r),o},getURI:function(e){var t,n=this;return n.source&&!e||(t="",e||(n.protocol?t+=n.protocol+"://":t+="//",n.userInfo&&(t+=n.userInfo+"@"),n.host&&(t+=n.host),n.port&&(t+=":"+n.port)),n.path&&(t+=n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),n.source=t),n.source}},dx.parseDataUri=function(e){var t,n;return e=decodeURIComponent(e).split(","),(n=/data:([^;]+)/.exec(e[0]))&&(t=n[1]),{type:t,data:e[1]}},dx.getDocumentBaseUrl=function(e){var t;return t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t};var mx=function(e,t,n){var r,o,i,a,u;if(t.format=t.format?t.format:"html",t.get=!0,t.getInner=!0,t.no_events||e.fire("BeforeGetContent",t),"raw"===t.format)r=It.trim(bh.trimExternal(e.serializer,n.innerHTML));else if("text"===t.format)r=_i(n.innerText||n.textContent);else{if("tree"===t.format)return e.serializer.serialize(n,t);i=(o=e).serializer.serialize(n,t),a=Ou(o),u=new RegExp("^(<"+a+"[^>]*>( | |\\s|\xa0|<br \\/>|)<\\/"+a+">[\r\n]*|<br \\/>[\r\n]*)$"),r=i.replace(u,"")}return"text"===t.format||wo(Vn.fromDom(n))?t.content=r:t.content=It.trim(r),t.no_events||e.fire("GetContent",t),t.content},px=function(e,t){t(e),e.firstChild&&px(e.firstChild,t),e.next&&px(e.next,t)},gx=function(e,t,n){var r=function(e,n,t){var r={},o={},i=[];for(var a in t.firstChild&&px(t.firstChild,function(t){H.each(e,function(e){e.name===t.name&&(r[e.name]?r[e.name].nodes.push(t):r[e.name]={filter:e,nodes:[t]})}),H.each(n,function(e){"string"==typeof t.attr(e.name)&&(o[e.name]?o[e.name].nodes.push(t):o[e.name]={filter:e,nodes:[t]})})}),r)r.hasOwnProperty(a)&&i.push(r[a]);for(var u in o)o.hasOwnProperty(u)&&i.push(o[u]);return i}(e,t,n);H.each(r,function(t){H.each(t.filter.callbacks,function(e){e(t.nodes,t.filter.name,{})})})},hx=function(e){return e instanceof _y},vx=function(e,t){var r;e.dom.setHTML(e.getBody(),t),zp(r=e)&&Qa.firstPositionIn(r.getBody()).each(function(e){var t=e.getNode(),n=Oo.isTable(t)?Qa.firstPositionIn(t).getOr(e):e;r.selection.setRng(n.toRange())})},yx=function(u,s,c){return void 0===c&&(c={}),c.format=c.format?c.format:"html",c.set=!0,c.content=hx(s)?"":s,hx(s)||c.no_events||(u.fire("BeforeSetContent",c),s=c.content),A.from(u.getBody()).fold(V.constant(s),function(e){return hx(s)?function(e,t,n,r){gx(e.parser.getNodeFilters(),e.parser.getAttributeFilters(),n);var o=Jc({validate:e.validate},e.schema).serialize(n);return r.content=wo(Vn.fromDom(t))?o:It.trim(o),vx(e,r.content),r.no_events||e.fire("SetContent",r),n}(u,e,s,c):(t=u,n=e,o=c,0===(r=s).length||/^\s+$/.test(r)?(a='<br data-mce-bogus="1">',"TABLE"===n.nodeName?r="<tr><td>"+a+"</td></tr>":/^(UL|OL)$/.test(n.nodeName)&&(r="<li>"+a+"</li>"),(i=Ou(t))&&t.schema.isValidChild(n.nodeName.toLowerCase(),i.toLowerCase())?(r=a,r=t.dom.createHTML(i,t.settings.forced_root_block_attrs,r)):r||(r='<br data-mce-bogus="1">'),vx(t,r),t.fire("SetContent",o)):("raw"!==o.format&&(r=Jc({validate:t.validate},t.schema).serialize(t.parser.parse(r,{isRootContent:!0,insert:!0}))),o.content=wo(Vn.fromDom(n))?r:It.trim(r),vx(t,o.content),o.no_events||t.fire("SetContent",o)),o.content);var t,n,r,o,i,a})},bx=vi.DOM,Cx=function(e){return A.from(e).each(function(e){return e.destroy()})},xx=function(e){if(!e.removed){var t=e._selectionOverrides,n=e.editorUpload,r=e.getBody(),o=e.getElement();r&&e.save(),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&o&&bx.remove(o.nextSibling),!e.inline&&r&&(i=e,bx.setStyle(i.id,"display",i.orgDisplay)),fp(e),e.editorManager.remove(e),bx.remove(e.getContainer()),Cx(t),Cx(n),e.destroy()}var i},wx=function(e,t){var n,r,o,i=e.selection,a=e.dom;e.destroyed||(t||e.removed?(t||(e.editorManager.off("beforeunload",e._beforeUnload),e.theme&&e.theme.destroy&&e.theme.destroy(),Cx(i),Cx(a)),(r=(n=e).formElement)&&(r._mceOldSubmit&&(r.submit=r._mceOldSubmit,r._mceOldSubmit=null),bx.unbind(r,"submit reset",n.formEventDelegate)),(o=e).contentAreaContainer=o.formElement=o.container=o.editorContainer=null,o.bodyElement=o.contentDocument=o.contentWindow=null,o.iframeElement=o.targetElm=null,o.selection&&(o.selection=o.selection.win=o.selection.dom=o.selection.dom.doc=null),e.destroyed=!0):e.remove())},Nx=vi.DOM,Ex=It.extend,Sx=It.each,kx=It.resolve,Tx=ve.ie,Ax=function(e,t,n){var r,o,i,a,u,s,c,l=this,f=l.documentBaseUrl=n.documentBaseURL,d=n.baseURI;r=l,o=e,i=f,a=n.defaultSettings,u=t,c={id:o,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:i,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"<!DOCTYPE html>",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:(s=r).convertURL,url_converter_scope:s,ie7_compat:!0},t=gl(cl,c,a,u),l.settings=t,Si.language=t.language||"en",Si.languageLoad=t.language_load,Si.baseURL=n.baseURL,l.id=e,l.setDirty(!1),l.plugins={},l.documentBaseURI=new dx(t.document_base_url,{base_uri:d}),l.baseURI=d,l.contentCSS=[],l.contentStyles=[],l.shortcuts=new Ap(l),l.loadedCSS={},l.editorCommands=new Hm(l),l.suffix=n.suffix,l.editorManager=n,l.inline=t.inline,l.buttons={},l.menuItems={},t.cache_suffix&&(ve.cacheSuffix=t.cache_suffix.replace(/^[\?\&]+/,"")),!1===t.override_viewport&&(ve.overrideViewPort=!1),n.fire("SetupEditor",{editor:l}),l.execCallback("setup",l),l.$=tn.overrideDefaults(function(){return{context:l.inline?l.getBody():l.getDoc(),element:l.getBody()}})};Ex(Ax.prototype={render:function(){ax(this)},focus:function(e){Fp(this,e)},hasFocus:function(){return zp(this)},execCallback:function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r,o=this.settings[e];if(o)return this.callbackLookup&&(r=this.callbackLookup[e])&&(o=r.func,r=r.scope),"string"==typeof o&&(r=(r=o.replace(/\.\w+$/,""))?kx(r):0,o=kx(o),this.callbackLookup=this.callbackLookup||{},this.callbackLookup[e]={func:o,scope:r}),o.apply(r||this,Array.prototype.slice.call(arguments,1))},translate:function(e){if(e&&It.is(e,"string")){var n=this.settings.language||"en",r=this.editorManager.i18n;e=r.data[n+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,t){return r.data[n+"."+t]||"{#"+t+"}"})}return this.editorManager.translate(e)},getLang:function(e,t){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(t!==undefined?t:"{#"+e+"}")},getParam:function(e,t,n){return yl(this,e,t,n)},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.stateSelector&&"undefined"==typeof t.active&&(t.active=!1),t.text||t.icon||(t.icon=e),n.buttons=n.buttons,t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addSidebar:function(e,t){return ux(this,e,t)},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems,n.menuItems[e]=t},addContextToolbar:function(e,t){var n,r=this;r.contextToolbars=r.contextToolbars||[],"string"==typeof e&&(n=e,e=function(e){return r.dom.is(e,n)}),r.contextToolbars.push({id:xg.uuid("mcet"),predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){this.hidden&&(this.hidden=!1,this.inline?this.getBody().contentEditable=!0:(Nx.show(this.getContainer()),Nx.hide(this.id)),this.load(),this.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(Tx&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(Nx.hide(e.getContainer()),Nx.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var t,n=this.getElement();return this.removed?"":n?((e=e||{}).load=!0,t=this.setContent(n.value!==undefined?n.value:n.innerHTML,e),e.element=n,e.no_events||this.fire("LoadContent",e),e.element=n=null,t):void 0},save:function(e){var t,n,r=this,o=r.getElement();if(o&&r.initialized&&!r.removed)return(e=e||{}).save=!0,e.element=o,e.content=r.getContent(e),e.no_events||r.fire("SaveContent",e),"raw"===e.format&&r.fire("RawSaveContent",e),t=e.content,/TEXTAREA|INPUT/i.test(o.nodeName)?o.value=t:(r.inline||(o.innerHTML=t),(n=Nx.getParent(r.id,"form"))&&Sx(n.elements,function(e){if(e.name===r.id)return e.value=t,!1})),e.element=o=null,!1!==e.set_dirty&&r.setDirty(!1),t},setContent:function(e,t){return yx(this,e,t)},getContent:function(e){return t=this,void 0===(n=e)&&(n={}),A.from(t.getBody()).fold(V.constant("tree"===n.format?new _y("body",11):""),function(e){return mx(t,n,e)});var t,n},insertContent:function(e,t){t&&(e=Ex({content:e},t)),this.execCommand("mceInsertContent",!1,e)},isDirty:function(){return!this.isNotDirty},setDirty:function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.fire("dirty")},setMode:function(e){var t,n;(n=e)!==vp(t=this)&&(t.initialized?hp(t,"readonly"===n):t.on("init",function(){hp(t,"readonly"===n)}),dp(t,n))},getContainer:function(){return this.container||(this.container=Nx.get(this.editorContainer||this.id+"_parent")),this.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=Nx.get(this.id)),this.targetElm},getWin:function(){var e;return this.contentWindow||(e=this.iframeElement)&&(this.contentWindow=e.contentWindow),this.contentWindow},getDoc:function(){var e;return this.contentDocument||(e=this.getWin())&&(this.contentDocument=e.document),this.contentDocument},getBody:function(){var e=this.getDoc();return this.bodyElement||(e?e.body:null)},convertURL:function(e,t,n){var r=this.settings;return r.urlconverter_callback?this.execCallback("urlconverter_callback",e,n,!0,t):!r.convert_urls||n&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length?e:r.relative_urls?this.documentBaseURI.toRelative(e):e=this.documentBaseURI.toAbsolute(e,r.remove_script_host)},addVisual:function(e){var n,r=this,o=r.settings,i=r.dom;e=e||r.getBody(),r.hasVisual===undefined&&(r.hasVisual=o.visual),Sx(i.select("table,a",e),function(e){var t;switch(e.nodeName){case"TABLE":return n=o.visual_table_class||"mce-item-table",void((t=i.getAttrib(e,"border"))&&"0"!==t||!r.hasVisual?i.removeClass(e,n):i.addClass(e,n));case"A":return void(i.getAttrib(e,"href")||(t=i.getAttrib(e,"name")||e.id,n=o.visual_anchor_class||"mce-item-anchor",t&&r.hasVisual?i.addClass(e,n):i.removeClass(e,n)))}}),r.fire("VisualAid",{element:e,hasVisual:r.hasVisual})},remove:function(){xx(this)},destroy:function(e){wx(this,e)},uploadImages:function(e){return this.editorUpload.uploadImages(e)},_scanForImages:function(){return this.editorUpload.scanForImages()}},Np);var Rx,_x,Bx,Dx={isEditorUIElement:function(e){return-1!==e.className.toString().indexOf("mce-")}},Ox=function(n,e){var t,r;Un.detect().browser.isIE()?(r=n).on("focusout",function(){Lm(r)}):(t=e,n.on("mouseup touchend",function(e){t.throttle()})),n.on("keyup nodechange",function(e){var t;"nodechange"===(t=e).type&&t.selectionChange||Lm(n)})},Px=function(e){var t,n,r,o=ah(function(){Lm(e)},0);e.inline&&(t=e,n=o,r=function(){n.throttle()},vi.DOM.bind(document,"mouseup",r),t.on("remove",function(){vi.DOM.unbind(document,"mouseup",r)})),e.on("init",function(){Ox(e,o)}),e.on("remove",function(){o.cancel()})},Lx=vi.DOM,Ix=function(e){return Dx.isEditorUIElement(e)},Mx=function(t,e){var n=t?t.settings.custom_ui_selector:"";return null!==Lx.getParent(e,function(e){return Ix(e)||!!n&&t.dom.is(e,n)})},Fx=function(r,e){var t=e.editor;Px(t),t.on("focusin",function(){var e=r.focusedEditor;e!==this&&(e&&e.fire("blur",{focusedEditor:this}),r.setActive(this),(r.focusedEditor=this).fire("focus",{blurredEditor:e}),this.focus(!0))}),t.on("focusout",function(){var t=this;we.setEditorTimeout(t,function(){var e=r.focusedEditor;Mx(t,function(){try{return document.activeElement}catch(e){return document.body}}())||e!==t||(t.fire("blur",{focusedEditor:null}),r.focusedEditor=null)})}),Rx||(Rx=function(e){var t,n=r.activeEditor;t=e.target,n&&t.ownerDocument===document&&(t===document.body||Mx(n,t)||r.focusedEditor!==n||(n.fire("blur",{focusedEditor:null}),r.focusedEditor=null))},Lx.bind(document,"focusin",Rx))},zx=function(e,t){e.focusedEditor===t.editor&&(e.focusedEditor=null),e.activeEditor||(Lx.unbind(document,"focusin",Rx),Rx=null)},Ux=function(e){e.on("AddEditor",V.curry(Fx,e)),e.on("RemoveEditor",V.curry(zx,e))},qx={},Vx="en",Hx={setCode:function(e){e&&(Vx=e,this.rtl=!!this.data[e]&&"rtl"===this.data[e]._dir)},getCode:function(){return Vx},rtl:!1,add:function(e,t){var n=qx[e];for(var r in n||(qx[e]=n={}),t)n[r]=t[r];this.setCode(e)},translate:function(e){var t=qx[Vx]||{},n=function(e){return It.is(e,"function")?Object.prototype.toString.call(e):r(e)?"":""+e},r=function(e){return""===e||null===e||It.is(e,"undefined")},o=function(e){return e=n(e),It.hasOwn(t,e)?n(t[e]):e};if(r(e))return"";if(It.is(e,"object")&&It.hasOwn(e,"raw"))return n(e.raw);if(It.is(e,"array")){var i=e.slice(1);e=o(e[0]).replace(/\{([0-9]+)\}/g,function(e,t){return It.hasOwn(i,t)?n(i[t]):e})}return o(e).replace(/{context:\w+}$/,"")},data:qx},jx=vi.DOM,$x=It.explode,Wx=It.each,Kx=It.extend,Xx=0,Yx=!1,Gx=[],Jx=[],Qx=function(t){Wx(Bx.get(),function(e){"scroll"===t.type?e.fire("ScrollWindow",t):e.fire("ResizeWindow",t)})},Zx=function(e){e!==Yx&&(e?tn(window).on("resize scroll",Qx):tn(window).off("resize scroll",Qx),Yx=e)},ew=function(t){var e=Jx;delete Gx[t.id];for(var n=0;n<Gx.length;n++)if(Gx[n]===t){Gx.splice(n,1);break}return Jx=H.filter(Jx,function(e){return t!==e}),Bx.activeEditor===t&&(Bx.activeEditor=0<Jx.length?Jx[0]:null),Bx.focusedEditor===t&&(Bx.focusedEditor=null),e.length!==Jx.length};Kx(Bx={defaultSettings:{},$:tn,majorVersion:"4",minorVersion:"7.13",releaseDate:"2018-05-16",editors:Gx,i18n:Hx,activeEditor:null,settings:{},setup:function(){var e,t,n,r,o="";if(t=dx.getDocumentBaseUrl(document.location),/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),n=window.tinymce||window.tinyMCEPreInit)e=n.base||n.baseURL,o=n.suffix;else{for(var i=document.getElementsByTagName("script"),a=0;a<i.length;a++){var u=(r=i[a].src).substring(r.lastIndexOf("/"));if(/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(r)){-1!==u.indexOf(".min")&&(o=".min"),e=r.substring(0,r.lastIndexOf("/"));break}}!e&&document.currentScript&&(-1!==(r=document.currentScript.src).indexOf(".min")&&(o=".min"),e=r.substring(0,r.lastIndexOf("/")))}this.baseURL=new dx(t).toAbsolute(e),this.documentBaseURL=t,this.baseURI=new dx(this.baseURL),this.suffix=o,Ux(this)},overrideDefaults:function(e){var t,n;(t=e.base_url)&&(this.baseURL=new dx(this.documentBaseURL).toAbsolute(t.replace(/\/+$/,"")),this.baseURI=new dx(this.baseURL)),n=e.suffix,e.suffix&&(this.suffix=n);var r=(this.defaultSettings=e).plugin_base_urls;for(var o in r)Si.PluginManager.urls[o]=r[o]},init:function(r){var n,u,s=this;u=It.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu"," ");var c=function(e){var t=e.id;return t||(t=(t=e.name)&&!jx.get(t)?e.name:jx.uniqueId(),e.setAttribute("id",t)),t},l=function(e,t){return t.constructor===RegExp?t.test(e.className):jx.hasClass(e,t)},f=function(e){n=e},e=function(){var o,i=0,a=[],n=function(e,t,n){var r=new Ax(e,t,s);a.push(r),r.on("init",function(){++i===o.length&&f(a)}),r.targetElm=r.targetElm||n,r.render()};jx.unbind(window,"ready",e),function(e){var t=r[e];t&&t.apply(s,Array.prototype.slice.call(arguments,2))}("onpageload"),o=tn.unique(function(t){var e,n=[];if(ve.ie&&ve.ie<11)return rg("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tinymce.com/docs/get-started/system-requirements/"),[];if(t.types)return Wx(t.types,function(e){n=n.concat(jx.select(e.selector))}),n;if(t.selector)return jx.select(t.selector);if(t.target)return[t.target];switch(t.mode){case"exact":0<(e=t.elements||"").length&&Wx($x(e),function(t){var e;(e=jx.get(t))?n.push(e):Wx(document.forms,function(e){Wx(e.elements,function(e){e.name===t&&(t="mce_editor_"+Xx++,jx.setAttrib(e,"id",t),n.push(e))})})});break;case"textareas":case"specific_textareas":Wx(jx.select("textarea"),function(e){t.editor_deselector&&l(e,t.editor_deselector)||t.editor_selector&&!l(e,t.editor_selector)||n.push(e)})}return n}(r)),r.types?Wx(r.types,function(t){It.each(o,function(e){return!jx.is(e,t.selector)||(n(c(e),Kx({},r,t),e),!1)})}):(It.each(o,function(e){var t;(t=s.get(e.id))&&t.initialized&&!(t.getContainer()||t.getBody()).parentNode&&(ew(t),t.unbindAllNativeEvents(),t.destroy(!0),t.removed=!0,t=null)}),0===(o=It.grep(o,function(e){return!s.get(e.id)})).length?f([]):Wx(o,function(e){var t;t=e,r.inline&&t.tagName.toLowerCase()in u?rg("Could not initialize inline editor on invalid inline target element",e):n(c(e),r,e)}))};return s.settings=r,jx.bind(window,"ready",e),new ye(function(t){n?t(n):f=function(e){t(e)}})},get:function(t){return 0===arguments.length?Jx.slice(0):k.isString(t)?H.find(Jx,function(e){return e.id===t}).getOr(null):k.isNumber(t)&&Jx[t]?Jx[t]:null},add:function(e){var t=this;return Gx[e.id]===e||(null===t.get(e.id)&&("length"!==e.id&&(Gx[e.id]=e),Gx.push(e),Jx.push(e)),Zx(!0),t.activeEditor=e,t.fire("AddEditor",{editor:e}),_x||(_x=function(){t.fire("BeforeUnload")},jx.bind(window,"beforeunload",_x))),e},createEditor:function(e,t){return this.add(new Ax(e,t,this))},remove:function(e){var t,n,r=this;if(e)return k.isString(e)?(e=e.selector||e,void Wx(jx.select(e),function(e){(n=r.get(e.id))&&r.remove(n)})):(n=e,k.isNull(r.get(n.id))?null:(ew(n)&&r.fire("RemoveEditor",{editor:n}),0===Jx.length&&jx.unbind(window,"beforeunload",_x),n.remove(),Zx(0<Jx.length),n));for(t=Jx.length-1;0<=t;t--)r.remove(Jx[t])},execCommand:function(e,t,n){var r=this.get(n);switch(e){case"mceAddEditor":return this.get(n)||new Ax(n,this.settings,this).render(),!0;case"mceRemoveEditor":return r&&r.remove(),!0;case"mceToggleEditor":return r?r.isHidden()?r.show():r.hide():this.execCommand("mceAddEditor",0,n),!0}return!!this.activeEditor&&this.activeEditor.execCommand(e,t,n)},triggerSave:function(){Wx(Jx,function(e){e.save()})},addI18n:function(e,t){Hx.add(e,t)},translate:function(e){return Hx.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!==e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},Xm),Bx.setup();var tw,nw=Bx;function rw(n){return{walk:function(e,t){return Bv(n,e,t)},split:mv,normalize:function(t){return um(n,t).fold(V.constant(!1),function(e){return t.setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),!0})}}}(tw=rw||(rw={})).compareRanges=em,tw.getCaretRangeFromPoint=Zy,tw.getSelectedNode=aa,tw.getNode=ua;var ow,iw,aw=rw,uw=Math.min,sw=Math.max,cw=Math.round,lw=function(e,t,n){var r,o,i,a,u,s;return r=t.x,o=t.y,i=e.w,a=e.h,u=t.w,s=t.h,"b"===(n=(n||"").split(""))[0]&&(o+=s),"r"===n[1]&&(r+=u),"c"===n[0]&&(o+=cw(s/2)),"c"===n[1]&&(r+=cw(u/2)),"b"===n[3]&&(o-=a),"r"===n[4]&&(r-=i),"c"===n[3]&&(o-=cw(a/2)),"c"===n[4]&&(r-=cw(i/2)),fw(r,o,i,a)},fw=function(e,t,n,r){return{x:e,y:t,w:n,h:r}},dw={inflate:function(e,t,n){return fw(e.x-t,e.y-n,e.w+2*t,e.h+2*n)},relativePosition:lw,findBestRelativePosition:function(e,t,n,r){var o,i;for(i=0;i<r.length;i++)if((o=lw(e,t,r[i])).x>=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n,r,o,i;return n=sw(e.x,t.x),r=sw(e.y,t.y),o=uw(e.x+e.w,t.x+t.w),i=uw(e.y+e.h,t.y+t.h),o-n<0||i-r<0?null:fw(n,r,o-n,i-r)},clamp:function(e,t,n){var r,o,i,a,u,s,c,l,f,d;return u=e.x,s=e.y,c=e.x+e.w,l=e.y+e.h,f=t.x+t.w,d=t.y+t.h,r=sw(0,t.x-u),o=sw(0,t.y-s),i=sw(0,c-f),a=sw(0,l-d),u+=r,s+=o,n&&(c+=r,l+=o,u-=i,s-=a),fw(u,s,(c-=i)-u,(l-=a)-s)},create:fw,fromClientRect:function(e){return fw(e.left,e.top,e.width,e.height)}},mw={},pw={add:function(e,t){mw[e.toLowerCase()]=t},has:function(e){return!!mw[e.toLowerCase()]},get:function(e){var t=e.toLowerCase(),n=mw.hasOwnProperty(t)?mw[t]:null;if(null===n)throw new Error("Could not find module for type: "+e);return n},create:function(e,t){var n;if("string"==typeof e?(t=t||{}).type=e:e=(t=e).type,e=e.toLowerCase(),!(n=mw[e]))throw new Error("Could not find control by type: "+e);return(n=new n(t)).type=e,n}},gw=It.each,hw=It.extend,vw=function(){};vw.extend=ow=function(n){var e,t,r,o=this.prototype,i=function(){var e,t,n;if(!iw&&(this.init&&this.init.apply(this,arguments),t=this.Mixins))for(e=t.length;e--;)(n=t[e]).init&&n.init.apply(this,arguments)},a=function(){return this},u=function(n,r){return function(){var e,t=this._super;return this._super=o[n],e=r.apply(this,arguments),this._super=t,e}};for(t in iw=!0,e=new this,iw=!1,n.Mixins&&(gw(n.Mixins,function(e){for(var t in e)"init"!==t&&(n[t]=e[t])}),o.Mixins&&(n.Mixins=o.Mixins.concat(n.Mixins))),n.Methods&&gw(n.Methods.split(","),function(e){n[e]=a}),n.Properties&&gw(n.Properties.split(","),function(e){var t="_"+e;n[e]=function(e){return e!==undefined?(this[t]=e,this):this[t]}}),n.Statics&&gw(n.Statics,function(e,t){i[t]=e}),n.Defaults&&o.Defaults&&(n.Defaults=hw({},o.Defaults,n.Defaults)),n)"function"==typeof(r=n[t])&&o[t]?e[t]=u(t,r):e[t]=r;return i.prototype=e,(i.constructor=i).extend=ow,i};var yw=Math.min,bw=Math.max,Cw=Math.round,xw=function(e,n){var r,o,t,i;if(n=n||'"',null===e)return"null";if("string"==(t=typeof e))return o="\bb\tt\nn\ff\rr\"\"''\\\\",n+e.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=o.indexOf(t))+1?"\\"+o.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e)})+n;if("object"===t){if(e.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(e)){for(r=0,o="[";r<e.length;r++)o+=(0<r?",":"")+xw(e[r],n);return o+"]"}for(i in o="{",e)e.hasOwnProperty(i)&&(o+="function"!=typeof e[i]?(1<o.length?","+n:n)+i+n+":"+xw(e[i],n):"");return o+"}"}return""+e},ww={serialize:xw,parse:function(e){try{return JSON.parse(e)}catch(t){}}},Nw={callbacks:{},count:0,send:function(t){var n=this,r=vi.DOM,o=t.count!==undefined?t.count:n.count,i="tinymce_jsonp_"+o;n.callbacks[o]=function(e){r.remove(i),delete n.callbacks[o],t.callback(e)},r.add(r.doc.body,"script",{id:i,src:t.url,type:"text/javascript"}),n.count++}},Ew={send:function(e){var t,n=0,r=function(){!e.async||4===t.readyState||1e4<n++?(e.success&&n<1e4&&200===t.status?e.success.call(e.success_scope,""+t.responseText,t,e):e.error&&e.error.call(e.error_scope,1e4<n?"TIMED_OUT":"GENERAL",t,e),t=null):setTimeout(r,10)};if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=!1!==e.async,e.data=e.data||"",Ew.fire("beforeInitialize",{settings:e}),t=new ag){if(t.overrideMimeType&&t.overrideMimeType(e.content_type),t.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(t.withCredentials=!0),e.content_type&&t.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&It.each(e.requestheaders,function(e){t.setRequestHeader(e.key,e.value)}),t.setRequestHeader("X-Requested-With","XMLHttpRequest"),(t=Ew.fire("beforeSend",{xhr:t,settings:e}).xhr).send(e.data),!e.async)return r();setTimeout(r,10)}}};It.extend(Ew,Xm);var Sw=It.extend,kw=function(e){this.settings=Sw({},e),this.count=0};kw.sendRPC=function(e){return(new kw).send(e)},kw.prototype={send:function(n){var r=n.error,o=n.success;(n=Sw(this.settings,n)).success=function(e,t){void 0===(e=ww.parse(e))&&(e={error:"JSON Parse error."}),e.error?r.call(n.error_scope||n.scope,e.error,t):o.call(n.success_scope||n.scope,e.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,t)},n.data=ww.serialize({id:n.id||"c"+this.count++,method:n.method,params:n.params}),n.content_type="application/json",Ew.send(n)}};var Tw,Aw=window.localStorage,Rw=nw,_w={geom:{Rect:dw},util:{Promise:ye,Delay:we,Tools:It,VK:sh,URI:dx,Class:vw,EventDispatcher:$m,Observable:Xm,I18n:Hx,XHR:Ew,JSON:ww,JSONRequest:kw,JSONP:Nw,LocalStorage:Aw,Color:function(e){var n={},u=0,s=0,c=0,t=function(e){var t;return"object"==typeof e?"r"in e?(u=e.r,s=e.g,c=e.b):"v"in e&&function(e,t,n){var r,o,i,a;if(e=(parseInt(e,10)||0)%360,t=parseInt(t,10)/100,n=parseInt(n,10)/100,t=bw(0,yw(t,1)),n=bw(0,yw(n,1)),0!==t){switch(r=e/60,i=(o=n*t)*(1-Math.abs(r%2-1)),a=n-o,Math.floor(r)){case 0:u=o,s=i,c=0;break;case 1:u=i,s=o,c=0;break;case 2:u=0,s=o,c=i;break;case 3:u=0,s=i,c=o;break;case 4:u=i,s=0,c=o;break;case 5:u=o,s=0,c=i;break;default:u=s=c=0}u=Cw(255*(u+a)),s=Cw(255*(s+a)),c=Cw(255*(c+a))}else u=s=c=Cw(255*n)}(e.h,e.s,e.v):(t=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(u=parseInt(t[1],10),s=parseInt(t[2],10),c=parseInt(t[3],10)):(t=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(u=parseInt(t[1],16),s=parseInt(t[2],16),c=parseInt(t[3],16)):(t=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(u=parseInt(t[1]+t[1],16),s=parseInt(t[2]+t[2],16),c=parseInt(t[3]+t[3],16)),u=u<0?0:255<u?255:u,s=s<0?0:255<s?255:s,c=c<0?0:255<c?255:c,n};return e&&t(e),n.toRgb=function(){return{r:u,g:s,b:c}},n.toHsv=function(){return e=u,t=s,n=c,o=0,(i=yw(e/=255,yw(t/=255,n/=255)))===(a=bw(e,bw(t,n)))?{h:0,s:0,v:100*(o=i)}:(r=(a-i)/a,{h:Cw(60*((e===i?3:n===i?1:5)-(e===i?t-n:n===i?e-t:n-e)/((o=a)-i))),s:Cw(100*r),v:Cw(100*o)});var e,t,n,r,o,i,a},n.toHex=function(){var e=function(e){return 1<(e=parseInt(e,10).toString(16)).length?e:"0"+e};return"#"+e(u)+e(s)+e(c)},n.parse=t,n}},dom:{EventUtils:Be,Sizzle:mt,DomQuery:tn,TreeWalker:ao,DOMUtils:vi,ScriptLoader:wi,RangeUtils:aw,Serializer:Wy,ControlSelection:Jy,BookmarkManager:Xy,Selection:Bb,Event:Be.Event},html:{Styles:ai,Entities:Ko,Node:_y,Schema:oi,SaxParser:vh,DomParser:qy,Writer:Gc,Serializer:Jc},ui:{Factory:pw},Env:ve,AddOnManager:Si,Formatter:vy,UndoManager:Uh,EditorCommands:Hm,WindowManager:Yp,NotificationManager:Xp,EditorObservable:Np,Shortcuts:Ap,Editor:Ax,FocusManager:Dx,EditorManager:nw,DOM:vi.DOM,ScriptLoader:wi.ScriptLoader,PluginManager:Si.PluginManager,ThemeManager:Si.ThemeManager,trim:It.trim,isArray:It.isArray,is:It.is,toArray:It.toArray,makeMap:It.makeMap,each:It.each,map:It.map,grep:It.grep,inArray:It.inArray,extend:It.extend,create:It.create,walk:It.walk,createNS:It.createNS,resolve:It.resolve,explode:It.explode,_addCacheSuffix:It._addCacheSuffix,isOpera:ve.opera,isWebKit:ve.webkit,isIE:ve.ie,isGecko:ve.gecko,isMac:ve.mac},Bw=Rw=It.extend(Rw,_w);Tw=Bw,window.tinymce=Tw,window.tinyMCE=Tw,function(e){if("object"==typeof module)try{module.exports=e}catch(t){}}(Bw)}(); \ No newline at end of file diff --git a/groups.io/tinymce-5.10.9/tinymce.min.js b/groups.io/tinymce-5.10.9/tinymce.min.js new file mode 100644 index 00000000..b251deb0 --- /dev/null +++ b/groups.io/tinymce-5.10.9/tinymce.min.js @@ -0,0 +1,9 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.10.9 (2023-11-15) + */ +!function(){"use strict";function r(e){if(null===e)return"null";if(void 0===e)return"undefined";var t=typeof e;return"object"==t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t}function f(o){return m(function(e,t){if(e.length!==t.length)return!1;for(var n=e.length,r=0;r<n;r++)if(!o.eq(e[r],t[r]))return!1;return!0})}function d(l){return m(function(e,t){var n,r,o,i=Object.keys(e),a=Object.keys(t);if(r=f(g),o=function(e){return t=n,Array.prototype.slice.call(e).sort(t);var t},!m(function(e,t){return r.eq(o(e),o(t))}).eq(i,a))return!1;for(var u=i.length,s=0;s<u;s++){var c=i[s];if(!l.eq(e[c],t[c]))return!1}return!0})}function e(r){return function(e){return n=typeof(t=e),(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n)===r;var t,n}}function t(t){return function(e){return typeof e===t}}function n(t){return function(e){return t===e}}function K(e){return null==e}function V(e){return!K(e)}function te(){}function i(n,r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return n(r.apply(null,e))}}function a(t,n){return function(e){return t(n(e))}}function J(e){return function(){return e}}function u(e){return e}function o(e,t){return e===t}var m=function(e){return{eq:e}},g=m(function(e,t){return e===t}),p=m(function(e,t){if(e===t)return!0;var n=r(e);return n===r(t)&&(-1!==["undefined","boolean","number","string","function","xml","null"].indexOf(n)?e===t:"array"===n?f(p).eq(e,t):"object"===n&&d(p).eq(e,t))}),X=e("string"),h=e("object"),S=e("array"),l=n(null),v=t("boolean"),b=n(void 0),y=t("function"),N=t("number");function R(r){for(var o=[],e=1;e<arguments.length;e++)o[e-1]=arguments[e];return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=o.concat(e);return r.apply(null,n)}}function s(t){return function(e){return!t(e)}}function C(e){return e()}function x(e){e()}function c(){return E}var D=J(!1),w=J(!0),E={fold:function(e,t){return e()},isSome:D,isNone:w,getOr:u,getOrThunk:k,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:J(null),getOrUndefined:J(void 0),or:u,orThunk:k,map:c,each:te,bind:c,exists:D,forall:w,filter:function(){return E},toArray:function(){return[]},toString:J("none()")};function k(e){return e()}function _(e,t){return ye.call(e,t)}function T(e,t){return-1<_(e,t)}function F(e,t){for(var n=0,r=e.length;n<r;n++)if(t(e[n],n))return!0;return!1}function A(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++){var i=e[o];r[o]=t(i,o)}return r}function Y(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n)}function O(e,t){for(var n=e.length-1;0<=n;n--)t(e[n],n)}function B(e,t){for(var n=[],r=[],o=0,i=e.length;o<i;o++){var a=e[o];(t(a,o)?n:r).push(a)}return{pass:n,fail:r}}function U(e,t){for(var n=[],r=0,o=e.length;r<o;r++){var i=e[r];t(i,r)&&n.push(i)}return n}function P(e,n,r){return O(e,function(e,t){r=n(r,e,t)}),r}function L(e,n,r){return Y(e,function(e,t){r=n(r,e,t)}),r}function I(e,t,n){for(var r=0,o=e.length;r<o;r++){var i=e[r];if(t(i,r))return ve.some(i);if(n(i,r))break}return ve.none()}function M(e,t){return I(e,t,D)}function z(e,t){for(var n=0,r=e.length;n<r;n++)if(t(e[n],n))return ve.some(n);return ve.none()}function H(e,t){return function(e){for(var t=[],n=0,r=e.length;n<r;++n){if(!S(e[n]))throw new Error("Arr.flatten item "+n+" was not an array, input: "+e);Ce.apply(t,e[n])}return t}(A(e,t))}function j(e,t){for(var n=0,r=e.length;n<r;++n)if(!0!==t(e[n],n))return!1;return!0}function q(e){var t=be.call(e,0);return t.reverse(),t}function $(e,t){return U(e,function(e){return!T(t,e)})}function W(e,t){var n=be.call(e,0);return n.sort(t),n}function G(e,t){return 0<=t&&t<e.length?ve.some(e[t]):ve.none()}function Q(e){return G(e,0)}function Z(e){return G(e,e.length-1)}function ee(e,t){for(var n=0;n<e.length;n++){var r=t(e[n],n);if(r.isSome())return r}return ve.none()}function ne(e,t){for(var n=we(e),r=0,o=n.length;r<o;r++){var i=n[r];t(e[i],i)}}function re(e,n){return Ne(e,function(e,t){return{k:t,v:n(e,t)}})}function oe(n){return function(e,t){n[t]=e}}function ie(e,n,r,o){return ne(e,function(e,t){(n(e,t)?r:o)(e,t)}),1}function ae(e,t){var n={};return ie(e,t,oe(n),te),n}function ue(e,t){return Ee(e,t)?ve.from(e[t]):ve.none()}function se(e,t){return Ee(e,t)&&void 0!==e[t]&&null!==e[t]}function ce(e,t,n){var r,o;if(!e)return!1;if(n=n||e,void 0!==e.length){for(r=0,o=e.length;r<o;r++)if(!1===t.call(n,e[r],r,e))return!1}else for(r in e)if(Ee(e,r)&&!1===t.call(n,e[r],r,e))return!1;return!0}function le(n,r){var o=[];return ce(n,function(e,t){o.push(r(e,t,n))}),o}function fe(n,r){var o=[];return ce(n,function(e,t){r&&!r(e,t,n)||o.push(e)}),o}function de(e,t){if(e)for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function me(e,t,n,r){for(var o=b(n)?e[0]:n,i=0;i<e.length;i++)o=t.call(r,o,e[i],i);return o}function ge(e,t,n){for(var r=0,o=e.length;r<o;r++)if(t.call(n,e[r],r,e))return r;return-1}function pe(e){return e[e.length-1]}var he=function(n){function e(){return o}function t(e){return e(n)}var r=J(n),o={fold:function(e,t){return t(n)},isSome:w,isNone:D,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return he(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:E},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},ve={some:he,none:c,from:function(e){return null==e?E:he(e)}},be=Array.prototype.slice,ye=Array.prototype.indexOf,Ce=Array.prototype.push,xe=y(Array.from)?Array.from:function(e){return be.call(e)},we=Object.keys,Se=Object.hasOwnProperty,Ne=function(e,r){var o={};return ne(e,function(e,t){var n=r(e,t);o[n.k]=n.v}),o},Ee=function(e,t){return Se.call(e,t)},ke=Array.isArray,_e=function(){return(_e=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function Ae(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||((r=r||Array.prototype.slice.call(t,0,o))[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}function Re(n){var r,o=!1;return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return o||(o=!0,r=n.apply(null,e)),r}}function De(e,t){var n=String(t).toLowerCase();return M(e,function(e){return e.search(n)})}function Te(e,t){return-1!==e.indexOf(t)}function Oe(t){return function(e){return e.replace(t,"")}}function Be(e){return 0<e.length}function Pe(e){return!Be(e)}function Le(t){return function(e){return Te(e,t)}}function Ie(e){return window.matchMedia(e).matches}function Me(e){return null==e?"":(""+e).replace(wt,"")}function Fe(e,t){return t?!("array"!==t||!ke(e))||typeof e===t:void 0!==e}function Ue(e,t){for(var n=[],r=function(e){return n.push(e),t(e)},o=t(e);(o=o.bind(r)).isSome(););return n}function ze(e,t){var n=e.dom;if(1!==n.nodeType)return!1;var r=n;if(void 0!==r.matches)return r.matches(t);if(void 0!==r.msMatchesSelector)return r.msMatchesSelector(t);if(void 0!==r.webkitMatchesSelector)return r.webkitMatchesSelector(t);if(void 0!==r.mozMatchesSelector)return r.mozMatchesSelector(t);throw new Error("Browser lacks native selectors")}function He(e){return 1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType||0===e.childElementCount}function je(e,t){return e.dom===t.dom}function Ve(e,t){return dt().browser.isIE()?(n=e.dom,r=t.dom,o=Node.DOCUMENT_POSITION_CONTAINED_BY,0!=(n.compareDocumentPosition(r)&o)):(i=e.dom)!==(a=t.dom)&&i.contains(a);var n,r,o,i,a}function qe(){return Xe(0,0)}function $e(e){function t(e){return function(){return n===e}}var n=e.current,r=e.version;return{current:n,version:r,isEdge:t("Edge"),isChrome:t("Chrome"),isIE:t("IE"),isOpera:t("Opera"),isFirefox:t(nt),isSafari:t("Safari")}}function We(e){function t(e){return function(){return n===e}}var n=e.current,r=e.version;return{current:n,version:r,isWindows:t(it),isiOS:t("iOS"),isAndroid:t(at),isOSX:t("OSX"),isLinux:t("Linux"),isSolaris:t(ut),isFreeBSD:t(st),isChromeOS:t(ct)}}function Ke(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var Xe=function(e,t){return{major:e,minor:t}},Ye={nu:Xe,detect:function(e,t){var n,r,o=String(t).toLowerCase();return 0===e.length?qe():(r=function(e,t){for(var n=0;n<e.length;n++){var r=e[n];if(r.test(t))return r}}(e,n=o))?Xe(i(1),i(2)):{major:0,minor:0};function i(e){return Number(n.replace(r,"$"+e))}},unknown:qe},Ge=function(e,t){return""===(n=t)||e.length>=n.length&&e.substr(0,0+n.length)===n;var n},Je=Oe(/^\s+|\s+$/g),Qe=Oe(/^\s+/g),Ze=Oe(/\s+$/g),et=/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,tt={browsers:J([{name:"Edge",versionRegexes:[/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],search:function(e){return Te(e,"edge/")&&Te(e,"chrome")&&Te(e,"safari")&&Te(e,"applewebkit")}},{name:"Chrome",brand:"Chromium",versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/,et],search:function(e){return Te(e,"chrome")&&!Te(e,"chromeframe")}},{name:"IE",versionRegexes:[/.*?msie\ ?([0-9]+)\.([0-9]+).*/,/.*?rv:([0-9]+)\.([0-9]+).*/],search:function(e){return Te(e,"msie")||Te(e,"trident")}},{name:"Opera",versionRegexes:[et,/.*?opera\/([0-9]+)\.([0-9]+).*/],search:Le("opera")},{name:"Firefox",versionRegexes:[/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],search:Le("firefox")},{name:"Safari",versionRegexes:[et,/.*?cpu os ([0-9]+)_([0-9]+).*/],search:function(e){return(Te(e,"safari")||Te(e,"mobile/"))&&Te(e,"applewebkit")}}]),oses:J([{name:"Windows",search:Le("win"),versionRegexes:[/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]},{name:"iOS",search:function(e){return Te(e,"iphone")||Te(e,"ipad")},versionRegexes:[/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,/.*cpu os ([0-9]+)_([0-9]+).*/,/.*cpu iphone os ([0-9]+)_([0-9]+).*/]},{name:"Android",search:Le("android"),versionRegexes:[/.*?android\ ?([0-9]+)\.([0-9]+).*/]},{name:"OSX",search:Le("mac os x"),versionRegexes:[/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]},{name:"Linux",search:Le("linux"),versionRegexes:[]},{name:"Solaris",search:Le("sunos"),versionRegexes:[]},{name:"FreeBSD",search:Le("freebsd"),versionRegexes:[]},{name:"ChromeOS",search:Le("cros"),versionRegexes:[/.*?chrome\/([0-9]+)\.([0-9]+).*/]}])},nt="Firefox",rt=function(){return $e({current:void 0,version:Ye.unknown()})},ot=$e,it=(J("Edge"),J("Chrome"),J("IE"),J("Opera"),J(nt),J("Safari"),"Windows"),at="Android",ut="Solaris",st="FreeBSD",ct="ChromeOS",lt=function(){return We({current:void 0,version:Ye.unknown()})},ft=We,dt=(J(it),J("iOS"),J(at),J("Linux"),J("OSX"),J(ut),J(st),J(ct),Re(function(){return e=navigator.userAgent,t=ve.from(navigator.userAgentData),n=Ie,p=tt.browsers(),h=tt.oses(),v=t.bind(function(e){return r=p,ee(e.brands,function(t){var n=t.brand.toLowerCase();return M(r,function(e){var t;return n===(null===(t=e.brand)||void 0===t?void 0:t.toLowerCase())}).map(function(e){return{current:e.name,version:Ye.nu(parseInt(t.version,10),0)}})});var r}).orThunk(function(){return De(p,n=e).map(function(e){var t=Ye.detect(e.versionRegexes,n);return{current:e.name,version:t}});var n}).fold(rt,ot),b=De(h,r=e).map(function(e){var t=Ye.detect(e.versionRegexes,r);return{current:e.name,version:t}}).fold(lt,ft),{browser:v,os:b,deviceType:(i=v,a=e,u=n,s=(o=b).isiOS()&&!0===/ipad/i.test(a),c=o.isiOS()&&!s,f=(l=o.isiOS()||o.isAndroid())||u("(pointer:coarse)"),d=s||!c&&l&&u("(min-device-width:768px)"),m=c||l&&!d,g=i.isSafari()&&o.isiOS()&&!1===/safari/i.test(a),{isiPad:J(s),isiPhone:J(c),isTablet:J(d),isPhone:J(m),isTouch:J(f),isAndroid:o.isAndroid,isiOS:o.isiOS,isWebView:J(g),isDesktop:J(!m&&!d&&!g)})};var e,t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b})),mt=navigator.userAgent,gt=dt(),pt=gt.browser,ht=gt.os,vt=gt.deviceType,bt=/WebKit/.test(mt)&&!pt.isEdge(),yt="FormData"in window&&"FileReader"in window&&"URL"in window&&!!URL.createObjectURL,Ct=-1!==mt.indexOf("Windows Phone"),xt={opera:pt.isOpera(),webkit:bt,ie:!(!pt.isIE()&&!pt.isEdge())&&pt.version.major,gecko:pt.isFirefox(),mac:ht.isOSX()||ht.isiOS(),iOS:vt.isiPad()||vt.isiPhone(),android:ht.isAndroid(),contentEditable:!0,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:!0,range:window.getSelection&&"Range"in window,documentMode:pt.isIE()?document.documentMode||7:10,fileApi:yt,ceFalse:!0,cacheSuffix:null,container:null,experimentalShadowDom:!1,canHaveCSP:!pt.isIE(),desktop:vt.isDesktop(),windowsPhone:Ct,browser:{current:pt.current,version:pt.version,isChrome:pt.isChrome,isEdge:pt.isEdge,isFirefox:pt.isFirefox,isIE:pt.isIE,isOpera:pt.isOpera,isSafari:pt.isSafari},os:{current:ht.current,version:ht.version,isAndroid:ht.isAndroid,isChromeOS:ht.isChromeOS,isFreeBSD:ht.isFreeBSD,isiOS:ht.isiOS,isLinux:ht.isLinux,isOSX:ht.isOSX,isSolaris:ht.isSolaris,isWindows:ht.isWindows},deviceType:{isDesktop:vt.isDesktop,isiPad:vt.isiPad,isiPhone:vt.isiPhone,isPhone:vt.isPhone,isTablet:vt.isTablet,isTouch:vt.isTouch,isWebView:vt.isWebView}},wt=/^\s*|\s*$/g,St=function(e,n,r,o){o=o||this,e&&ce(e=r?e[r]:e,function(e,t){return!1!==n.call(o,e,t,r)&&void St(e,n,r,o)})},Nt={trim:Me,isArray:ke,is:Fe,toArray:function(e){if(ke(e))return e;for(var t=[],n=0,r=e.length;n<r;n++)t[n]=e[n];return t},makeMap:function(e,t,n){var r;for(t=t||",",n=n||{},r=(e="string"==typeof(e=e||[])?e.split(t):e).length;r--;)n[e[r]]={};return n},each:ce,map:le,grep:fe,inArray:de,hasOwn:Ee,extend:function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var r=0;r<t.length;r++){var o,i,a=t[r];for(o in a)!Ee(a,o)||void 0!==(i=a[o])&&(e[o]=i)}return e},create:function(e,t,n){var r,o,i,a=this,u=0,s=(e=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(e))[3].match(/(^|\.)(\w+)$/i)[2],c=a.createNS(e[3].replace(/\.\w+$/,""),n);if(!c[s]){if("static"===e[2])return c[s]=t,void(this.onCreate&&this.onCreate(e[2],e[3],c[s]));t[s]||(t[s]=function(){},u=1),c[s]=t[s],a.extend(c[s].prototype,t),e[5]&&(r=a.resolve(e[5]).prototype,o=e[5].match(/\.(\w+)$/i)[1],i=c[s],c[s]=u?function(){return r[o].apply(this,arguments)}:function(){return this.parent=r[o],i.apply(this,arguments)},c[s].prototype[s]=c[s],a.each(r,function(e,t){c[s].prototype[t]=r[t]}),a.each(t,function(e,t){r[t]?c[s].prototype[t]=function(){return this.parent=r[t],e.apply(this,arguments)}:t!==s&&(c[s].prototype[t]=e)})),a.each(t.static,function(e,t){c[s][t]=e})}},walk:St,createNS:function(e,t){var n,r;for(t=t||window,e=e.split("."),n=0;n<e.length;n++)t[r=e[n]]||(t[r]={}),t=t[r];return t},resolve:function(e,t){var n,r;for(t=t||window,n=0,r=(e=e.split(".")).length;n<r&&(t=t[e[n]]);n++);return t},explode:function(e,t){return!e||Fe(e,"array")?e:le(e.split(t||","),Me)},_addCacheSuffix:function(e){var t=xt.cacheSuffix;return t&&(e+=(-1===e.indexOf("?")?"?":"&")+t),e}},Et={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return Ke(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return Ke(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return Ke(n)},fromDom:Ke,fromPoint:function(e,t,n){return ve.from(e.dom.elementFromPoint(t,n)).map(Ke)}};function kt(e){return e.dom.nodeName.toLowerCase()}function _t(e){return e.dom.nodeType}function At(t){return function(e){return _t(e)===t}}function Rt(e){return Et.fromDom(e.dom.ownerDocument)}function Dt(e){return Rn(e)?e:Rt(e)}function Tt(e){return Et.fromDom(Dt(e).dom.defaultView)}function Ot(e){return ve.from(e.dom.parentNode).map(Et.fromDom)}function Bt(e){return ve.from(e.dom.previousSibling).map(Et.fromDom)}function Pt(e){return ve.from(e.dom.nextSibling).map(Et.fromDom)}function Lt(e){return q(Ue(e,Bt))}function It(e){return Ue(e,Pt)}function Mt(e,t){var n=e.dom.childNodes;return ve.from(n[t]).map(Et.fromDom)}function Ft(e){return Mt(e,0)}function Ut(e){return Mt(e,e.dom.childNodes.length-1)}function zt(e){return e.dom.childNodes.length}function Ht(e){return Dn(e)&&V(e.dom.host)}function jt(t){return Ht(t)?t:function(){var e=Dt(t).dom.head;if(null==e)throw new Error("Head is not available yet");return Et.fromDom(e)}()}function Vt(e){return Et.fromDom(e.dom.host)}function qt(t,n){Ot(t).each(function(e){e.dom.insertBefore(n.dom,t.dom)})}function $t(e,t){Pt(e).fold(function(){Ot(e).each(function(e){Ln(e,t)})},function(e){qt(e,t)})}function Wt(t,n){Ft(t).fold(function(){Ln(t,n)},function(e){t.dom.insertBefore(n.dom,e.dom)})}function Kt(t,e){Y(e,function(e){Ln(t,e)})}function Xt(e){e.dom.textContent="",Y(Tn(e),function(e){In(e)})}function Yt(e){var t,n=Tn(e);0<n.length&&(t=e,Y(n,function(e){qt(t,e)})),In(e)}function Gt(e,t){return void 0!==e?e:void 0!==t?t:0}function Jt(e){var t=void 0!==e?e.dom:document,n=t.body.scrollLeft||t.documentElement.scrollLeft,r=t.body.scrollTop||t.documentElement.scrollTop;return Un(n,r)}function Qt(e,t,n){var r=(void 0!==n?n.dom:document).defaultView;r&&r.scrollTo(e,t)}function Zt(e,t){dt().browser.isSafari()&&y(e.dom.scrollIntoViewIfNeeded)?e.dom.scrollIntoViewIfNeeded(!1):e.dom.scrollIntoView(t)}function en(e,t,n,r){return{x:e,y:t,width:n,height:r,right:e+n,bottom:t+r}}function tn(e){var r=void 0===e?window:e,t=r.document,o=Jt(Et.fromDom(t)),n=void 0===r?window:r;return(dt().browser.isFirefox()?ve.none():ve.from(n.visualViewport)).fold(function(){var e=r.document.documentElement,t=e.clientWidth,n=e.clientHeight;return en(o.left,o.top,t,n)},function(e){return en(Math.max(e.pageLeft,o.left),Math.max(e.pageTop,o.top),e.width,e.height)})}function nn(t){return function(e){return!!e&&e.nodeType===t}}function rn(e){return e&&!Object.getPrototypeOf(e)}function on(e){var n=e.map(function(e){return e.toLowerCase()});return function(e){if(e&&e.nodeName){var t=e.nodeName.toLowerCase();return T(n,t)}return!1}}function an(r,e){var o=e.toLowerCase().split(" ");return function(e){if(Hn(e))for(var t=0;t<o.length;t++){var n=e.ownerDocument.defaultView.getComputedStyle(e,null);if((n?n.getPropertyValue(r):null)===o[t])return!0}return!1}}function un(t){return function(e){return Hn(e)&&e.hasAttribute(t)}}function sn(e){return Hn(e)&&e.hasAttribute("data-mce-bogus")}function cn(e){return Hn(e)&&"TABLE"===e.tagName}function ln(t){return function(e){if(Hn(e)){if(e.contentEditable===t)return!0;if(e.getAttribute("data-mce-contenteditable")===t)return!0}return!1}}function fn(e,t,n){return void 0===n&&(n=o),e.exists(function(e){return n(e,t)})}function dn(e,t,n){return e.isSome()&&t.isSome()?ve.some(n(e.getOrDie(),t.getOrDie())):ve.none()}function mn(e){return void 0!==e.style&&y(e.style.getPropertyValue)}function gn(e,t,n){if(!(X(n)||v(n)||N(n)))throw console.error("Invalid call to Attribute.set. Key ",t,":: Value ",n,":: Element ",e),new Error("Attribute value was not simple");e.setAttribute(t,n+"")}function pn(e,t,n){gn(e.dom,t,n)}function hn(e,t){var n=e.dom;ne(t,function(e,t){gn(n,t,e)})}function vn(e,t){var n=e.dom.getAttribute(t);return null===n?void 0:n}function bn(e,t){return ve.from(vn(e,t))}function yn(e,t){var n=e.dom;return n&&n.hasAttribute&&n.hasAttribute(t)}function Cn(e,t){e.dom.removeAttribute(t)}function xn(e,t){var n=e.dom;ne(t,function(e,t){!function(e,t,n){if(!X(n))throw console.error("Invalid call to CSS.set. Property ",t,":: Value ",n,":: Element ",e),new Error("CSS value must be a string: "+n);mn(e)&&e.style.setProperty(t,n)}(n,t,e)})}function wn(e,t){var n=e.dom,r=window.getComputedStyle(n).getPropertyValue(t);return""!==r||Mn(e)?r:Zn(n,t)}function Sn(e,t){var n=e.dom,r=Zn(n,t);return ve.from(r).filter(function(e){return 0<e.length})}function Nn(e){var t={},n=e.dom;if(mn(n))for(var r=0;r<n.style.length;r++){var o=n.style.item(r);t[o]=n.style[o]}return t}function En(e){return M(e,_n)}function kn(e,t){return e.children&&T(e.children,t)}"undefined"!=typeof window||Function("return this;")();var _n=At(1),An=At(3),Rn=At(9),Dn=At(11),Tn=function(e){return A(e.dom.childNodes,Et.fromDom)},On=y(Element.prototype.attachShadow)&&y(Node.prototype.getRootNode),Bn=J(On),Pn=On?function(e){return Et.fromDom(e.dom.getRootNode())}:Dt,Ln=function(e,t){e.dom.appendChild(t.dom)},In=function(e){var t=e.dom;null!==t.parentNode&&t.parentNode.removeChild(t)},Mn=function(e){var t=An(e)?e.dom.parentNode:e.dom;if(null==t||null===t.ownerDocument)return!1;var n=t.ownerDocument,r=Et.fromDom(t),o=Pn(r);return(Ht(o)?ve.some(o):ve.none()).fold(function(){return n.body.contains(t)},a(Mn,Vt))},Fn=function(n,r){return{left:n,top:r,translate:function(e,t){return Fn(n+e,r+t)}}},Un=Fn,zn=function(e){var t,n=e.dom,r=n.ownerDocument.body;return r===n?Un(r.offsetLeft,r.offsetTop):Mn(e)?(t=n.getBoundingClientRect(),Un(t.left,t.top)):Un(0,0)},Hn=nn(1),jn=on(["textarea","input"]),Vn=nn(3),qn=nn(8),$n=nn(9),Wn=nn(11),Kn=on(["br"]),Xn=on(["img"]),Yn=ln("true"),Gn=ln("false"),Jn=on(["td","th"]),Qn=on(["video","audio","object","embed"]),Zn=function(e,t){return mn(e)?e.style.getPropertyValue(t):""},er=dt().browser,tr={},nr={exports:tr};function rr(e){setTimeout(function(){throw e},0)}!function(){var e=this,t=function(){var e,t,n,r={exports:{}};function o(){}function i(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(e,this)}function a(n,r){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,i._immediateFn(function(){var e,t=1===n._state?r.onFulfilled:r.onRejected;if(null!==t){try{e=t(n._value)}catch(e){return void s(r.promise,e)}u(r.promise,e)}else(1===n._state?u:s)(r.promise,n._value)})):n._deferreds.push(r)}function u(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof i)return t._state=3,t._value=e,void c(t);if("function"==typeof n)return void f((r=n,o=e,function(){r.apply(o,arguments)}),t)}t._state=1,t._value=e,c(t)}catch(e){s(t,e)}var r,o}function s(e,t){e._state=2,e._value=t,c(e)}function c(e){2===e._state&&0===e._deferreds.length&&i._immediateFn(function(){e._handled||i._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t<n;t++)a(e,e._deferreds[t]);e._deferreds=null}function l(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}function f(e,t){var n=!1;try{e(function(e){n||(n=!0,u(t,e))},function(e){n||(n=!0,s(t,e))})}catch(e){if(n)return;n=!0,s(t,e)}}e=r,t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=setTimeout,i.prototype.catch=function(e){return this.then(null,e)},i.prototype.then=function(e,t){var n=new this.constructor(o);return a(this,new l(e,t,n)),n},i.all=function(e){var u=Array.prototype.slice.call(e);return new i(function(o,i){if(0===u.length)return o([]);for(var a=u.length,e=0;e<u.length;e++)!function t(n,e){try{if(e&&("object"==typeof e||"function"==typeof e)){var r=e.then;if("function"==typeof r)return r.call(e,function(e){t(n,e)},i),0}u[n]=e,0==--a&&o(u)}catch(e){i(e)}}(e,u[e])})},i.resolve=function(t){return t&&"object"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(n){return new i(function(e,t){t(n)})},i.race=function(o){return new i(function(e,t){for(var n=0,r=o.length;n<r;n++)o[n].then(e,t)})},i._immediateFn="function"==typeof setImmediate?function(e){setImmediate(e)}:function(e){n(e,0)},i._unhandledRejectionFn=function(e){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)},i._setImmediateFn=function(e){i._immediateFn=e},i._setUnhandledRejectionFn=function(e){i._unhandledRejectionFn=e},e.exports?e.exports=i:t.Promise||(t.Promise=i);var d=r.exports;return{boltExport:("undefined"!=typeof window?window:Function("return this;")()).Promise||d}};"object"==typeof tr&&void 0!==nr?nr.exports=t():(e="undefined"!=typeof globalThis?globalThis:e||self).EphoxContactWrapper=t()}();function or(e){return cr(function(){return new ar(e)})}function ir(a){if(!S(a))throw new Error("cases must be an array");if(0===a.length)throw new Error("there must be at least one case");var u=[],n={};return Y(a,function(e,r){var t=we(e);if(1!==t.length)throw new Error("one and only one name per case");var o=t[0],i=e[o];if(void 0!==n[o])throw new Error("duplicate key detected:"+o);if("cata"===o)throw new Error("cannot have a case named cata (sorry)");if(!S(i))throw new Error("case arguments must be an array");u.push(o),n[o]=function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];var t=n.length;if(t!==i.length)throw new Error("Wrong number of arguments to case "+o+". Expected "+i.length+" ("+i+"), got "+t);return{fold:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(e.length!==a.length)throw new Error("Wrong number of arguments to fold. Expected "+a.length+", got "+e.length);return e[r].apply(null,n)},match:function(e){var t=we(e);if(u.length!==t.length)throw new Error("Wrong number of arguments to match. Expected: "+u.join(",")+"\nActual: "+t.join(","));if(!j(u,function(e){return T(t,e)}))throw new Error("Not all branches were specified when using match. Specified: "+t.join(", ")+"\nRequired: "+u.join(", "));return e[o].apply(null,n)},log:function(e){console.log(e,{constructors:u,constructor:o,params:n})}}}}),n}var ar=nr.exports.boltExport,ur=function(e){function r(e){o()?i(e):t.push(e)}var n=ve.none(),t=[],o=function(){return n.isSome()},i=function(t){n.each(function(e){setTimeout(function(){t(e)},0)})};return e(function(e){o()||(n=ve.some(e),Y(t,i),t=[])}),{get:r,map:function(n){return ur(function(t){r(function(e){t(n(e))})})},isReady:o}},sr={nu:ur,pure:function(t){return ur(function(e){e(t)})}},cr=function(n){function e(e){n().then(e,rr)}return{map:function(e){return cr(function(){return n().then(e)})},bind:function(t){return cr(function(){return n().then(function(e){return t(e).toPromise()})})},anonBind:function(e){return cr(function(){return n().then(function(){return e.toPromise()})})},toLazy:function(){return sr.nu(e)},toCached:function(){var e=null;return cr(function(){return e=null===e?n():e})},toPromise:n,get:e}},lr=function(n){return{isValue:w,isError:D,getOr:J(n),getOrThunk:J(n),getOrDie:J(n),or:function(e){return lr(n)},orThunk:function(e){return lr(n)},fold:function(e,t){return t(n)},map:function(e){return lr(e(n))},mapError:function(e){return lr(n)},each:function(e){e(n)},bind:function(e){return e(n)},exists:function(e){return e(n)},forall:function(e){return e(n)},toOptional:function(){return ve.some(n)}}},fr=function(n){return{isValue:D,isError:w,getOr:u,getOrThunk:function(e){return e()},getOrDie:function(){return e=String(n),function(){throw new Error(e)}();var e},or:u,orThunk:function(e){return e()},fold:function(e,t){return e(n)},map:function(e){return fr(n)},mapError:function(e){return fr(e(n))},each:te,bind:function(e){return fr(n)},exists:D,forall:w,toOptional:ve.none}},dr={value:lr,error:fr,fromOption:function(e,t){return e.fold(function(){return fr(t)},lr)}};function mr(e){return e.fold(u,u)}function gr(e,t,n,r,o){return e(n,r)?ve.some(n):y(o)&&o(n)?ve.none():t(n,r,o)}function pr(e,t,n){for(var r=e.dom,o=y(n)?n:D;r.parentNode;){var r=r.parentNode,i=Et.fromDom(r);if(t(i))return ve.some(i);if(o(i))break}return ve.none()}function hr(e,t,n){return gr(function(e,t){return t(e)},pr,e,t,n)}function vr(e,t,n){return pr(e,function(e){return ze(e,t)},n)}function br(e,t){return n=t,He(r=void 0===e?document:e.dom)?ve.none():ve.from(r.querySelector(n)).map(Et.fromDom);var n,r}function yr(e,t,n){return gr(ze,vr,e,t,n)}function Cr(e,t){return"number"!=typeof t&&(t=0),setTimeout(e,t)}function xr(e,t){return"number"!=typeof t&&(t=1),setInterval(e,t)}function wr(n,r){function e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];clearTimeout(o),o=Cr(function(){n.apply(this,e)},r)}var o;return e.stop=function(){clearTimeout(o)},e}function Sr(m,g){function n(e,t,n){var r,o=Nt._addCacheSuffix(e),i=ue(h,o).getOrThunk(function(){return{id:"mce-u"+p++,passed:[],failed:[],count:0}});function a(e,t){for(var n=e.length;n--;)e[n]();i.status=t,i.passed=[],i.failed=[],r&&(r.onload=null,r.onerror=null,r=null)}function u(){return a(i.passed,2),0}function s(){return a(i.failed,3)}(h[o]=i).count++;var c,l,f,d=function(){var e=d;!function(){for(var e=m.styleSheets,t=e.length;t--;){var n=e[t].ownerNode;if(n&&n.id===r.id)return u(),1}}()&&(Date.now()-l<y?Ar.setTimeout(e):s())};t&&i.passed.push(t),n&&i.failed.push(n),1!==i.status&&(2!==i.status?3!==i.status?(i.status=1,hn(c=Et.fromTag("link",b.dom),{rel:"stylesheet",type:"text/css",id:i.id}),l=Date.now(),g.contentCssCors&&pn(c,"crossOrigin","anonymous"),g.referrerPolicy&&pn(c,"referrerpolicy",g.referrerPolicy),(r=c.dom).onload=d,r.onerror=s,f=c,Ln(jt(v),f),pn(c,"href",o)):s():u())}function o(t){return or(function(e){n(t,i(e,J(dr.value(t))),i(e,J(dr.error(t))))})}function t(e){var n=Nt._addCacheSuffix(e);ue(h,n).each(function(e){var t;0==--e.count&&(delete h[n],t=e.id,br(jt(v),"#"+t).each(In))})}void 0===g&&(g={});var p=0,h={},v=Et.fromDom(m),b=Dt(v),y=g.maxLoadTime||5e3;return{load:n,loadAll:function(e,n,r){var a,t=A(e,o);a=t,or(function(r){var o=[],i=0;0===a.length?r([]):Y(a,function(e,t){var n;e.get((n=t,function(e){o[n]=e,++i>=a.length&&r(o)}))})}).get(function(e){var t=B(e,function(e){return e.isValue()});0<t.fail.length?r(t.fail.map(mr)):n(t.pass.map(mr))})},unload:t,unloadAll:function(e){Y(e,function(e){t(e)})},_setReferrerPolicy:function(e){g.referrerPolicy=e}}}ir([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);var Nr,Er,kr=function(e,t){return M(e.dom.childNodes,function(e){return t(Et.fromDom(e))}).map(Et.fromDom)},_r=window.Promise||ar,Ar={requestAnimationFrame:function(e,t){Nr?Nr.then(e):Nr=new _r(function(e){(function(e,t){for(var n=window.requestAnimationFrame,r=["ms","moz","webkit"],o=0;o<r.length&&!n;o++)n=window[r[o]+"RequestAnimationFrame"];(n=n||function(e){window.setTimeout(e,0)})(e,t)})(e,t=t||document.body)}).then(e)},setTimeout:Cr,setInterval:xr,setEditorTimeout:function(e,t,n){return Cr(function(){e.removed||t()},n)},setEditorInterval:function(e,t,n){var r=xr(function(){e.removed?clearInterval(r):t()},n);return r},debounce:wr,throttle:wr,clearInterval:function(e){return clearInterval(e)},clearTimeout:function(e){return clearTimeout(e)}},Rr=(Er=new WeakMap,{forElement:function(e,t){var n=Pn(e).dom;return ve.from(Er.get(n)).getOrThunk(function(){var e=Sr(n,t);return Er.set(n,e),e})}}),Dr=(Tr.prototype.current=function(){return this.node},Tr.prototype.next=function(e){return this.node=this.findSibling(this.node,"firstChild","nextSibling",e),this.node},Tr.prototype.prev=function(e){return this.node=this.findSibling(this.node,"lastChild","previousSibling",e),this.node},Tr.prototype.prev2=function(e){return this.node=this.findPreviousNode(this.node,"lastChild","previousSibling",e),this.node},Tr.prototype.findSibling=function(e,t,n,r){var o,i;if(e){if(!r&&e[t])return e[t];if(e!==this.rootNode){if(o=e[n])return o;for(i=e.parentNode;i&&i!==this.rootNode;i=i.parentNode)if(o=i[n])return o}}},Tr.prototype.findPreviousNode=function(e,t,n,r){var o,i,a;if(e&&(o=e[n],!this.rootNode||o!==this.rootNode)){if(o){if(!r)for(a=o[t];a;a=a[t])if(!a[t])return a;return o}return(i=e.parentNode)&&i!==this.rootNode?i:void 0}},Tr);function Tr(e,t){this.node=e,this.rootNode=t,this.current=this.current.bind(this),this.next=this.next.bind(this),this.prev=this.prev.bind(this),this.prev2=this.prev2.bind(this)}function Or(t){var n;return function(e){return n=n||function(e,t){for(var n={},r=0,o=e.length;r<o;r++){var i=e[r];n[String(i)]=t(i,r)}return n}(t,w),Ee(n,kt(e))}}function Br(e){return _n(e)&&!go(e)}function Pr(e){return _n(e)&&"br"===kt(e)}function Lr(e){return _o(e)&&(e=e.parentNode),ko(e)&&e.hasAttribute("data-mce-caret")}function Ir(e){return _o(e)&&No(e.data)}function Mr(e){return Lr(e)||Ir(e)}function Fr(e){return e.firstChild!==e.lastChild||!Kn(e.firstChild)}function Ur(e){var t=e.container();return!!Vn(t)&&(t.data.charAt(e.offset())===So||e.isAtStart()&&Ir(t.previousSibling))}function zr(e){var t=e.container();return!!Vn(t)&&(t.data.charAt(e.offset()-1)===So||e.isAtEnd()&&Ir(t.nextSibling))}function Hr(e){return e&&e.hasAttribute("data-mce-caret")?(sn(n=(t=e.getElementsByTagName("br"))[t.length-1])&&n.parentNode.removeChild(n),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("_moz_abspos"),e):null;var t,n}function jr(e){return Lr(e.startContainer)}function Vr(e){return!Mo(e)&&(Bo(e)?!Po(e.parentNode):Lo(e)||Oo(e)||Io(e)||Fo(e))}function qr(e,t){return Vr(e)&&function(e,t){for(e=e.parentNode;e&&e!==t;e=e.parentNode){if(Fo(e))return!1;if(Do(e))return!0}return!0}(e,t)}function $r(e){return Uo.test(e)}function Wr(e,t){return Vr(e)&&!1===(a=t,Vn(i=e)&&$r(i.data)&&!1===(n=i,r=Et.fromDom(a),vr(Et.fromDom(n),"pre,code",R(je,r)).isSome()))||Hn(o=e)&&"A"===o.nodeName&&!o.hasAttribute("href")&&(o.hasAttribute("name")||o.hasAttribute("id"))||zo(e);var n,r,o,i,a}function Kr(e,t){return function(e,t){var n=0;if(Wr(e,e))return!1;var r=e.firstChild;if(!r)return!0;var o=new Dr(r,e);do{if(t){if(jo(r)){r=o.next(!0);continue}if(Ho(r)){r=o.next();continue}}if(Kn(r))n++,r=o.next();else{if(Wr(r,e))return!1;r=o.next()}}while(r);return n<=1}(e.dom,t=void 0===t||t)}function Xr(e,t){return V(e)&&(Wr(e,t)||Br(Et.fromDom(e)))}function Yr(e){return"span"===e.nodeName.toLowerCase()&&"bookmark"===e.getAttribute("data-mce-type")}function Gr(e,t){var n,r,o,i={};if(e){for(e=e.split(","),t=t||10,n=0;n<e.length;n+=2)r=String.fromCharCode(parseInt(e[n],t)),Go[r]||(o="&"+e[n+1]+";",i[r]=o,i[o]=r);return i}}function Jr(e,t){return e.replace(t?$o:Wo,function(e){return Go[e]||e})}function Qr(e,t){return e.replace(t?$o:Wo,function(e){return 1<e.length?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":Go[e]||"&#"+e.charCodeAt(0)+";"})}function Zr(e,t,n){return n=n||Qo,e.replace(t?$o:Wo,function(e){return Go[e]||n[e]||e})}function eo(e,t){return(e=Nt.trim(e))?e.split(t||" "):[]}function to(e,t){var n=ni(e," ",ni(e.toUpperCase()," "));return oi(n,t)}function no(e){return to("td th li dt dd figcaption caption details summary",e.getTextBlockElements())}function ro(e,n){var r;return e&&(r={},ri(e="string"==typeof e?{"*":e}:e,function(e,t){r[t]=r[t.toUpperCase()]=("map"===n?ni:ii)(e,/[, ]/)})),r}function oo(i){function e(e,t,n){var r=i[e];return r?r=ni(r,/[, ]/,ni(r.toUpperCase(),/[, ]/)):(r=ei[e])||(r=to(t,n),ei[e]=r),r}var t,s,n,r,o,a,u,c,S={},l={},N=[],f={},d={},m=(t=(i=i||{}).schema,c={},ei[t]||(s="id accesskey class dir lang style tabindex title role",n="address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul",r="a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd label map noscript object q s samp script select small span strong sub sup textarea u var #text #comment","html4"!==t&&(s+=" contenteditable contextmenu draggable dropzone hidden spellcheck translate",n+=" article aside details dialog figure main header footer hgroup section nav",r+=" audio canvas command datalist mark meter output picture progress time wbr video ruby bdi keygen"),"html5-strict"!==t&&(s+=" xml:lang",r=[r,u="acronym applet basefont big font strike tt"].join(" "),ri(eo(u),function(e){g(e,"",r)}),n=[n,a="center dir isindex noframes"].join(" "),o=[n,r].join(" "),ri(eo(a),function(e){g(e,"",o)})),o=o||[n,r].join(" "),g("html","manifest","head body"),g("head","","base command link meta noscript script style title"),g("title hr noscript br"),g("base","href target"),g("link","href rel media hreflang type sizes hreflang"),g("meta","name http-equiv content charset"),g("style","media type scoped"),g("script","src async defer type charset"),g("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",o),g("address dt dd div caption","",o),g("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn","",r),g("blockquote","cite",o),g("ol","reversed start type","li"),g("ul","","li"),g("li","value",o),g("dl","","dt dd"),g("a","href target rel media hreflang type",r),g("q","cite",r),g("ins del","cite datetime",o),g("img","src sizes srcset alt usemap ismap width height"),g("iframe","src name width height",o),g("embed","src type width height"),g("object","data type typemustmatch name usemap form width height",[o,"param"].join(" ")),g("param","name value"),g("map","name",[o,"area"].join(" ")),g("area","alt coords shape href target rel media hreflang type"),g("table","border","caption colgroup thead tfoot tbody tr"+("html4"===t?" col":"")),g("colgroup","span","col"),g("col","span"),g("tbody thead tfoot","","tr"),g("tr","","td th"),g("td","colspan rowspan headers",o),g("th","colspan rowspan headers scope abbr",o),g("form","accept-charset action autocomplete enctype method name novalidate target",o),g("fieldset","disabled form name",[o,"legend"].join(" ")),g("label","form for",r),g("input","accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"),g("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"===t?o:r),g("select","disabled form multiple name required size","option optgroup"),g("optgroup","disabled label","option"),g("option","disabled label selected value"),g("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),g("menu","type label",[o,"li"].join(" ")),g("noscript","",o),"html4"!==t&&(g("wbr"),g("ruby","",[r,"rt rp"].join(" ")),g("figcaption","",o),g("mark rt rp summary bdi","",r),g("canvas","width height",o),g("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",[o,"track source"].join(" ")),g("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[o,"track source"].join(" ")),g("picture","","img source"),g("source","src srcset type media sizes"),g("track","kind src srclang label default"),g("datalist","",[r,"option"].join(" ")),g("article section nav aside main header footer","",o),g("hgroup","","h1 h2 h3 h4 h5 h6"),g("figure","",[o,"figcaption"].join(" ")),g("time","datetime",r),g("dialog","open",o),g("command","type label icon disabled checked radiogroup command"),g("output","for form name",r),g("progress","value max",r),g("meter","value min max low high optimum",r),g("details","open",[o,"summary"].join(" ")),g("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!==t&&(p("script","language xml:space"),p("style","xml:space"),p("object","declare classid code codebase codetype archive standby align border hspace vspace"),p("embed","align name hspace vspace"),p("param","valuetype type"),p("a","charset name rev shape coords"),p("br","clear"),p("applet","codebase archive code object alt name width height align hspace vspace"),p("img","name longdesc align border hspace vspace"),p("iframe","longdesc frameborder marginwidth marginheight scrolling align"),p("font basefont","size color face"),p("input","usemap align"),p("select"),p("textarea"),p("h1 h2 h3 h4 h5 h6 div p legend caption","align"),p("ul","type compact"),p("li","type"),p("ol dl menu dir","compact"),p("pre","width xml:space"),p("hr","align noshade size width"),p("isindex","prompt"),p("table","summary width frame rules cellspacing cellpadding align bgcolor"),p("col","width align char charoff valign"),p("colgroup","width align char charoff valign"),p("thead","align char charoff valign"),p("tr","align char charoff valign bgcolor"),p("th","axis align char charoff valign nowrap bgcolor width height"),p("form","accept"),p("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),p("tfoot","align char charoff valign"),p("tbody","align char charoff valign"),p("area","nohref"),p("body","background bgcolor text link vlink alink")),"html4"!==t&&(p("input button select textarea","autofocus"),p("input textarea","placeholder"),p("a","download"),p("link script img","crossorigin"),p("img","loading"),p("iframe","sandbox seamless allowfullscreen loading")),ri(eo("a form meter progress dfn"),function(e){c[e]&&delete c[e].children[e]}),delete c.caption.children.table,delete c.script,ei[t]=c));function g(e,t,n){function r(e,t){for(var n={},r=0,o=e.length;r<o;r++)n[e[r]]=t||{};return n}var o,i;t=t||"","string"==typeof(n=n||[])&&(n=eo(n));for(var a=eo(e),u=a.length;u--;)i={attributes:r(o=eo([s,t].join(" "))),attributesOrder:o,children:r(n,ti)},c[a[u]]=i}function p(e,t){for(var n,r,o,i=eo(e),a=i.length,u=eo(t);a--;)for(n=c[i[a]],r=0,o=u.length;r<o;r++)n.attributes[u[r]]={},n.attributesOrder.push(u[r])}!1===i.verify_html&&(i.valid_elements="*[*]");var h=ro(i.valid_styles),v=ro(i.invalid_styles,"map"),b=ro(i.valid_classes,"map"),y=e("whitespace_elements","pre script noscript style textarea video audio iframe object code"),C=e("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),x=e("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),w=e("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls"),E="td th iframe video audio object script code",k=e("non_empty_elements",E+" pre",x),_=e("move_caret_before_on_enter_elements",E+" table",x),A=e("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside main nav figure"),R=e("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex option datalist select optgroup figcaption details summary",A),D=e("text_inline_elements","span strong b em i font s strike u var cite dfn code mark q sup sub samp");function T(e){return new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$")}function O(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/,C=/^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/,x=/[*?+]/;if(e){var w=eo(e,",");for(S["@"]&&(h=S["@"].attributes,v=S["@"].attributesOrder),t=0,n=w.length;t<n;t++)if(i=y.exec(w[t])){if(g=i[1],c=i[2],p=i[3],s=i[5],a={attributes:d={},attributesOrder:m=[]},"#"===g&&(a.paddEmpty=!0),"-"===g&&(a.removeEmpty=!0),"!"===i[4]&&(a.removeEmptyAttrs=!0),h&&(ne(h,function(e,t){d[t]=e}),m.push.apply(m,v)),s)for(r=0,o=(s=eo(s,"|")).length;r<o;r++)(i=C.exec(s[r]))&&(u={},f=i[1],l=i[2].replace(/[\\:]:/g,":"),g=i[3],b=i[4],"!"===f&&(a.attributesRequired=a.attributesRequired||[],a.attributesRequired.push(l),u.required=!0),"-"!==f?(g&&("="===g&&(a.attributesDefault=a.attributesDefault||[],a.attributesDefault.push({name:l,value:b}),u.defaultValue=b),":"===g&&(a.attributesForced=a.attributesForced||[],a.attributesForced.push({name:l,value:b}),u.forcedValue=b),"<"===g&&(u.validValues=ni(b,"?"))),x.test(l)?(a.attributePatterns=a.attributePatterns||[],u.pattern=T(l),a.attributePatterns.push(u)):(d[l]||m.push(l),d[l]=u)):(delete d[l],m.splice(ai(m,l),1)));h||"@"!==c||(h=d,v=m),p&&(a.outputName=c,S[p]=a),x.test(c)?(a.pattern=T(c),N.push(a)):S[c]=a}}}function B(e){S={},N=[],O(e),ri(m,function(e,t){l[t]=e.children})}function P(e){var a=/^(~)?(.+)$/;e&&(ei.text_block_elements=ei.block_elements=null,ri(eo(e,","),function(e){var t,n=a.exec(e),r="~"===n[1],o=r?"span":"div",i=n[2];l[i]=l[o],f[i]=o,r||(R[i.toUpperCase()]={},R[i]={}),S[i]||(t=S[o],delete(t=oi({},t)).removeEmptyAttrs,delete t.removeEmpty,S[i]=t),ri(l,function(e,t){e[o]&&(l[t]=e=oi({},l[t]),e[i]=e[o])})}))}function L(e){var o=/^([+\-]?)([A-Za-z0-9_\-.\u00b7\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u037d\u037f-\u1fff\u200c-\u200d\u203f-\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]+)\[([^\]]+)]$/;ei[i.schema]=null,e&&ri(eo(e,","),function(e){var t,n,r=o.exec(e);r&&(n=r[1],t=n?l[r[2]]:l[r[2]]={"#comment":{}},t=l[r[2]],ri(eo(r[3],"|"),function(e){"-"===n?delete t[e]:t[e]={}}))})}function I(e){var t,n=S[e];if(n)return n;for(t=N.length;t--;)if((n=N[t]).pattern.test(e))return n}ri((i.special||"script noscript iframe noframes noembed title style textarea xmp").split(" "),function(e){d[e]=new RegExp("</"+e+"[^>]*>","gi")}),i.valid_elements?B(i.valid_elements):(ri(m,function(e,t){S[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},l[t]=e.children}),"html5"!==i.schema&&ri(eo("strong/b em/i"),function(e){var t=eo(e,"/");S[t[1]].outputName=t[0]}),ri(D,function(e,t){S[t]&&(i.padd_empty_block_inline_children&&(S[t].paddInEmptyBlock=!0),S[t].removeEmpty=!0)}),ri(eo("ol ul blockquote a table tbody"),function(e){S[e]&&(S[e].removeEmpty=!0)}),ri(eo("p h1 h2 h3 h4 h5 h6 th td pre div address caption li"),function(e){S[e].paddEmpty=!0}),ri(eo("span"),function(e){S[e].removeEmptyAttrs=!0})),P(i.custom_elements),L(i.valid_children),O(i.extended_valid_elements),L("+ol[ul|ol],+ul[ul|ol]"),ri({dd:"dl",dt:"dl",li:"ul ol",td:"tr",th:"tr",tr:"tbody thead tfoot",tbody:"table",thead:"table",tfoot:"table",legend:"fieldset",area:"map",param:"video audio object"},function(e,t){S[t]&&(S[t].parentsRequired=eo(e))}),i.invalid_elements&&ri(ii(i.invalid_elements),function(e){S[e]&&delete S[e]}),I("span")||O("span[!data-mce-type|*]");var M=J(h),F=J(v),U=J(b),z=J(w),H=J(R),j=J(A),V=J(D),q=J(x),$=J(C),W=J(k),K=J(_),X=J(y),Y=J(d),G=J(f);return{children:l,elements:S,getValidStyles:M,getValidClasses:U,getBlockElements:H,getInvalidStyles:F,getShortEndedElements:q,getTextBlockElements:j,getTextInlineElements:V,getBoolAttrs:z,getElementRule:I,getSelfClosingElements:$,getNonEmptyElements:W,getMoveCaretBeforeOnEnterElements:K,getWhiteSpaceElements:X,getSpecialElements:Y,isValidChild:function(e,t){var n=l[e.toLowerCase()];return!(!n||!n[t.toLowerCase()])},isValid:function(e,t){var n,r,o=I(e);if(o){if(!t)return!0;if(o.attributes[t])return!0;if(n=o.attributePatterns)for(r=n.length;r--;)if(n[r].pattern.test(e))return!0}return!1},getCustomElements:G,addValidElements:O,setValidElements:B,addCustomElements:P,addValidChildren:L}}function io(e,t,n,r){function o(e){return 1<(e=parseInt(e,10).toString(16)).length?e:"0"+e}return"#"+o(t)+o(n)+o(r)}function ao(b,e){var u,o,y=this,C=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,x=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,w=/\s*([^:]+):\s*([^;]+);?/g,S=/\s+$/,N={},E=xo;b=b||{},e&&(u=e.getValidStyles(),o=e.getInvalidStyles());for(var t=("\\\" \\' \\; \\: ; : "+E).split(" "),k=0;k<t.length;k++)N[t[k]]=E+k,N[E+k]=t[k];return{toHex:function(e){return e.replace(C,io)},parse:function(e){function t(e,t,n){var r=p[e+"-top"+t];if(r){var o=p[e+"-right"+t];if(o){var i=p[e+"-bottom"+t];if(i){var a=p[e+"-left"+t];if(a){var u=[r,o,i,a];for(k=u.length-1;k--&&u[k]===u[k+1];);-1<k&&n||(p[e+t]=-1===k?u[0]:u.join(" "),delete p[e+"-top"+t],delete p[e+"-right"+t],delete p[e+"-bottom"+t],delete p[e+"-left"+t])}}}}}function n(e){var t,n=p[e];if(n){for(t=(n=n.split(" ")).length;t--;)if(n[t]!==n[0])return;return p[e]=n[0],1}}function r(e){return f=!0,N[e]}function u(e,t){return f&&(e=e.replace(/\uFEFF[0-9]/g,function(e){return N[e]})),t?e:e.replace(/\\([\'\";:])/g,"$1")}function o(e){return String.fromCharCode(parseInt(e.slice(1),16))}function i(e){return e.replace(/\\[0-9a-f]+/gi,o)}function a(e,t,n,r,o,i){if(o=o||i)return"'"+(o=u(o)).replace(/\'/g,"\\'")+"'";if(t=u(t||n||r),!b.allow_script_urls){var a=t.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(a))return"";if(!b.allow_svg_data_urls&&/^data:image\/svg/i.test(a))return""}return"url('"+(t=h?h.call(v,t,"style"):t).replace(/\'/g,"\\'")+"')"}var s,c,l,f,d,m,g,p={},h=b.url_converter,v=b.url_converter_scope||y;if(e){for(e=(e=e.replace(/[\u0000-\u001F]/g,"")).replace(/\\[\"\';:\uFEFF]/g,r).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(e){return e.replace(/[;:]/g,r)});s=w.exec(e);)w.lastIndex=s.index+s[0].length,c=s[1].replace(S,"").toLowerCase(),l=s[2].replace(S,""),c&&l&&(c=i(c),l=i(l),-1===c.indexOf(E)&&-1===c.indexOf('"')&&(b.allow_script_urls||"behavior"!==c&&!/expression\s*\(|\/\*|\*\//.test(l))&&("font-weight"===c&&"700"===l?l="bold":"color"!==c&&"background-color"!==c||(l=l.toLowerCase()),l=(l=l.replace(C,io)).replace(x,a),p[c]=f?u(l,!0):l));t("border","",!0),t("border","-width"),t("border","-color"),t("border","-style"),t("padding",""),t("margin",""),m="border-style",g="border-color",n(d="border-width")&&n(m)&&n(g)&&(p.border=p[d]+" "+p[m]+" "+p[g],delete p[d],delete p[m],delete p[g]),"medium none"===p.border&&delete p.border,"none"===p["border-image"]&&delete p["border-image"]}return p},serialize:function(i,r){function e(e){var t,n=u[e];if(n)for(var r=0,o=n.length;r<o;r++)e=n[r],(t=i[e])&&(a+=(0<a.length?" ":"")+e+": "+t+";")}var a="";return r&&u?(e("*"),e(r)):ne(i,function(e,t){var n;!e||o&&((n=o["*"])&&n[t]||(n=o[r])&&n[t])||(a+=(0<a.length?" ":"")+t+": "+e+";")}),a}}}function uo(e){return e instanceof Event||y(e.initEvent)}function so(e,t,n,r){var o,i,a=function(e){var t,n=null!=r?r:{};for(t in e)Ee(ui,t)||(n[t]=e[t]);return V(n.composedPath)&&(n.composedPath=function(){return e.composedPath()}),n}(t);return a.type=e,K(a.target)&&(a.target=null!==(o=a.srcElement)&&void 0!==o?o:n),(K((i=t).preventDefault)||uo(i))&&(a.preventDefault=function(){a.defaultPrevented=!0,a.isDefaultPrevented=w,y(t.preventDefault)?t.preventDefault():uo(t)&&(t.returnValue=!1)},a.stopPropagation=function(){a.cancelBubble=!0,a.isPropagationStopped=w,y(t.stopPropagation)?t.stopPropagation():uo(t)&&(t.cancelBubble=!0)},a.stopImmediatePropagation=function(){a.isImmediatePropagationStopped=w,a.stopPropagation()},a.isDefaultPrevented!==w&&a.isDefaultPrevented!==D&&(a.isDefaultPrevented=!0===a.defaultPrevented?w:D,a.isPropagationStopped=!0===a.cancelBubble?w:D,a.isImmediatePropagationStopped=D)),a}function co(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r||!1):e.attachEvent&&e.attachEvent("on"+t,n)}function lo(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r||!1):e.detachEvent&&e.detachEvent("on"+t,n)}function fo(e,t){var n,r,o,i,a=so(e.type,e,document,t);return V(i=e)&&si.test(i.type)&&b(e.pageX)&&!b(e.clientX)&&(r=(n=a.target.ownerDocument||document).documentElement,o=n.body,a.pageX=e.clientX+(r&&r.scrollLeft||o&&o.scrollLeft||0)-(r&&r.clientLeft||o&&o.clientLeft||0),a.pageY=e.clientY+(r&&r.scrollTop||o&&o.scrollTop||0)-(r&&r.clientTop||o&&o.clientTop||0)),b(a.metaKey)&&(a.metaKey=!1),a}var mo=Or(["h1","h2","h3","h4","h5","h6"]),go=Or(["article","aside","details","div","dt","figcaption","footer","form","fieldset","header","hgroup","html","main","nav","section","summary","body","p","dl","multicol","dd","figure","address","center","blockquote","h1","h2","h3","h4","h5","h6","listing","xmp","pre","plaintext","menu","dir","ul","ol","li","hr","table","tbody","thead","tfoot","th","tr","td","caption"]),po=Or(["h1","h2","h3","h4","h5","h6","p","div","address","pre","form","blockquote","center","dir","fieldset","header","footer","article","section","hgroup","aside","nav","figure"]),ho=Or(["ul","ol","dl"]),vo=Or(["li","dd","dt"]),bo=Or(["thead","tbody","tfoot"]),yo=Or(["td","th"]),Co=Or(["pre","script","textarea","style"]),xo="\ufeff",wo="\xa0",So=xo,No=function(e){return e===xo},Eo=function(e){return e.replace(/\uFEFF/g,"")},ko=Hn,_o=Vn,Ao=function(e){return _o(e)&&e.data[0]===So},Ro=function(e){return _o(e)&&e.data[e.data.length-1]===So},Do=Yn,To=Gn,Oo=Kn,Bo=Vn,Po=on(["script","style","textarea"]),Lo=on(["img","input","textarea","hr","iframe","video","audio","object","embed"]),Io=on(["table"]),Mo=Mr,Fo=function(e){return!1===(Hn(t=e)&&"true"===t.getAttribute("unselectable"))&&To(e);var t},Uo=/^[ \t\r\n]*$/,zo=un("data-mce-bookmark"),Ho=un("data-mce-bogus"),jo=function(e){return Hn(e)&&"all"===e.getAttribute("data-mce-bogus")},Vo=function(e,t,n){var r=n||t;if(Hn(t)&&Yr(t))return t;for(var o,i,a,u,s,c,l,f,d,m,g,p=t.childNodes,h=p.length-1;0<=h;h--)Vo(e,p[h],r);return!Hn(t)||1===(o=t.childNodes).length&&Yr(o[0])&&t.parentNode.insertBefore(o[0],t),Wn(a=t)||$n(a)||Wr(t,r)||Hn(i=t)&&0<i.childNodes.length||(s=r,Vn(u=t)&&0<u.data.length&&(f=new Dr(c=u,l=s).prev(!1),d=new Dr(c,l).next(!1),m=b(f)||Xr(f,l),g=b(d)||Xr(d,l),m&&g))||e.remove(t),t},qo=Nt.makeMap,$o=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Wo=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Ko=/[<>&\"\']/g,Xo=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,Yo={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"},Go={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},Jo={"<":"<",">":">","&":"&",""":'"',"'":"'"},Qo=Gr("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32),Zo={encodeRaw:Jr,encodeAllRaw:function(e){return(""+e).replace(Ko,function(e){return Go[e]||e})},encodeNumeric:Qr,encodeNamed:Zr,getEncodeFunc:function(e,t){var n=Gr(t)||Qo,r=qo(e.replace(/\+/g,","));return r.named&&r.numeric?function(e,t){return e.replace(t?$o:Wo,function(e){return void 0!==Go[e]?Go[e]:void 0!==n[e]?n[e]:1<e.length?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":"&#"+e.charCodeAt(0)+";"})}:r.named?t?function(e,t){return Zr(e,t,n)}:Zr:r.numeric?Qr:Jr},decode:function(e){return e.replace(Xo,function(e,t){return t?65535<(t="x"===t.charAt(0).toLowerCase()?parseInt(t.substr(1),16):parseInt(t,10))?(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t))):Yo[t]||String.fromCharCode(t):Jo[e]||Qo[e]||(n=e,(r=Et.fromTag("div").dom).innerHTML=n,r.textContent||r.innerText||n);var n,r})}},ei={},ti={},ni=Nt.makeMap,ri=Nt.each,oi=Nt.extend,ii=Nt.explode,ai=Nt.inArray,ui={keyLocation:!0,layerX:!0,layerY:!0,returnValue:!0,webkitMovementX:!0,webkitMovementY:!0,keyIdentifier:!0,mozPressure:!0},si=/^(?:mouse|contextmenu)|click/,ci=(li.prototype.bind=function(e,t,n,r){function o(e){f.executeHandlers(fo(e||d.event),i)}var i,a,u,s,c,l,f=this,d=window;if(e&&3!==e.nodeType&&8!==e.nodeType){e[f.expando]?i=e[f.expando]:(i=f.count++,e[f.expando]=i,f.events[i]={}),r=r||e;for(var m=t.split(" "),g=m.length;g--;)c=o,s=l=!1,"DOMContentLoaded"===(u=m[g])&&(u="ready"),f.domLoaded&&"ready"===u&&"complete"===e.readyState?n.call(r,fo({type:u})):(f.hasMouseEnterLeave||(s=f.mouseEnterLeave[u])&&(c=function(e){var t=e.currentTarget,n=e.relatedTarget;if(n&&t.contains)n=t.contains(n);else for(;n&&n!==t;)n=n.parentNode;n||((e=fo(e||d.event)).type="mouseout"===e.type?"mouseleave":"mouseenter",e.target=t,f.executeHandlers(e,i))}),f.hasFocusIn||"focusin"!==u&&"focusout"!==u||(l=!0,s="focusin"===u?"focus":"blur",c=function(e){(e=fo(e||d.event)).type="focus"===e.type?"focusin":"focusout",f.executeHandlers(e,i)}),(a=f.events[i][u])?"ready"===u&&f.domLoaded?n(fo({type:u})):a.push({func:n,scope:r}):(f.events[i][u]=a=[{func:n,scope:r}],a.fakeName=s,a.capture=l,a.nativeHandler=c,"ready"===u?function(e,t,n){var r,o=e.document,i={type:"ready"};n.domLoaded?t(i):(r=function(){lo(e,"DOMContentLoaded",r),lo(e,"load",r),n.domLoaded||(n.domLoaded=!0,t(i)),e=null},"complete"===o.readyState||"interactive"===o.readyState&&o.body?r():co(e,"DOMContentLoaded",r),n.domLoaded||co(e,"load",r))}(e,c,f):co(e,s||u,c,l)));return e=a=null,n}},li.prototype.unbind=function(n,e,t){var r,o,i;if(!n||3===n.nodeType||8===n.nodeType)return this;var a=n[this.expando];if(a){if(i=this.events[a],e){for(var u,s,c,l,f=e.split(" "),d=f.length;d--;)if(l=i[o=f[d]]){if(t)for(r=l.length;r--;)l[r].func===t&&(u=l.nativeHandler,s=l.fakeName,c=l.capture,(l=l.slice(0,r).concat(l.slice(r+1))).nativeHandler=u,l.fakeName=s,l.capture=c,i[o]=l);t&&0!==l.length||(delete i[o],lo(n,l.fakeName||o,l.nativeHandler,l.capture))}}else ne(i,function(e,t){lo(n,e.fakeName||t,e.nativeHandler,e.capture)}),i={};for(o in i)if(Ee(i,o))return this;delete this.events[a];try{delete n[this.expando]}catch(e){n[this.expando]=null}}return this},li.prototype.fire=function(e,t,n){var r;if(!e||3===e.nodeType||8===e.nodeType)return this;for(var o=fo({type:t,target:e},n);(r=e[this.expando])&&this.executeHandlers(o,r),(e=e.parentNode||e.ownerDocument||e.defaultView||e.parentWindow)&&!o.isPropagationStopped(););return this},li.prototype.clean=function(e){var t,n;if(!e||3===e.nodeType||8===e.nodeType)return this;if(e[this.expando]&&this.unbind(e),(e=e.getElementsByTagName?e:e.document)&&e.getElementsByTagName)for(this.unbind(e),t=(n=e.getElementsByTagName("*")).length;t--;)(e=n[t])[this.expando]&&this.unbind(e);return this},li.prototype.destroy=function(){this.events={}},li.prototype.cancel=function(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1},li.prototype.executeHandlers=function(e,t){var n=this.events[t],r=n&&n[e.type];if(r)for(var o=0,i=r.length;o<i;o++){var a=r[o];if(a&&!1===a.func.call(a.scope,e)&&e.preventDefault(),e.isImmediatePropagationStopped())return}},li.Event=new li,li);function li(){this.domLoaded=!1,this.events={},this.count=1,this.expando="mce-data-"+(+new Date).toString(32),this.hasMouseEnterLeave="onmouseenter"in document.documentElement,this.hasFocusIn="onfocusin"in document.documentElement,this.count=1}function fi(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(65536+r):String.fromCharCode(r>>10|55296,1023&r|56320)}var di,mi,gi,pi,hi,vi,bi,yi,Ci,xi,wi,Si,Ni,Ei,ki,_i,Ai,Ri="sizzle"+-new Date,Di=window.document,Ti=0,Oi=0,Bi=la(),Pi=la(),Li=la(),Ii=function(e,t){return e===t&&(xi=!0),0},Mi="undefined",Fi={}.hasOwnProperty,Ui=[],zi=Ui.pop,Hi=Ui.push,ji=Ui.push,Vi=Ui.slice,qi=Ui.indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(this[t]===e)return t;return-1},$i="[\\x20\\t\\r\\n\\f]",Wi="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",Ki="\\["+$i+"*("+Wi+")(?:"+$i+"*([*^$|!~]?=)"+$i+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+Wi+"))|)"+$i+"*\\]",Xi=":("+Wi+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+Ki+")*)|.*)\\)|)",Yi=new RegExp("^"+$i+"+|((?:^|[^\\\\])(?:\\\\.)*)"+$i+"+$","g"),Gi=new RegExp("^"+$i+"*,"+$i+"*"),Ji=new RegExp("^"+$i+"*([>+~]|"+$i+")"+$i+"*"),Qi=new RegExp("="+$i+"*([^\\]'\"]*?)"+$i+"*\\]","g"),Zi=new RegExp(Xi),ea=new RegExp("^"+Wi+"$"),ta={ID:new RegExp("^#("+Wi+")"),CLASS:new RegExp("^\\.("+Wi+")"),TAG:new RegExp("^("+Wi+"|[*])"),ATTR:new RegExp("^"+Ki),PSEUDO:new RegExp("^"+Xi),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+$i+"*(even|odd|(([+-]|)(\\d*)n|)"+$i+"*(?:([+-]|)"+$i+"*(\\d+)|))"+$i+"*\\)|)","i"),bool:new RegExp("^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$","i"),needsContext:new RegExp("^"+$i+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+$i+"*((?:-\\d)?\\d*)"+$i+"*\\)|)(?=[^-]|$)","i")},na=/^(?:input|select|textarea|button)$/i,ra=/^h\d$/i,oa=/^[^{]+\{\s*\[native \w/,ia=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ua=/'|\\/g,sa=new RegExp("\\\\([\\da-f]{1,6}"+$i+"?|("+$i+")|.)","ig");try{ji.apply(Ui=Vi.call(Di.childNodes),Di.childNodes),Ui[Di.childNodes.length].nodeType}catch(e){ji={apply:Ui.length?function(e,t){Hi.apply(e,Vi.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}var ca=function(e,t,n,r){var o,i,a,u,s,c,l,f,d,m;if((t?t.ownerDocument||t:Di)!==Si&&wi(t),n=n||[],!e||"string"!=typeof e)return n;if(1!==(u=(t=t||Si).nodeType)&&9!==u)return[];if(Ei&&!r){if(o=ia.exec(e))if(a=o[1]){if(9===u){if(!(i=t.getElementById(a))||!i.parentNode)return n;if(i.id===a)return n.push(i),n}else if(t.ownerDocument&&(i=t.ownerDocument.getElementById(a))&&Ai(t,i)&&i.id===a)return n.push(i),n}else{if(o[2])return ji.apply(n,t.getElementsByTagName(e)),n;if((a=o[3])&&di.getElementsByClassName)return ji.apply(n,t.getElementsByClassName(a)),n}if(di.qsa&&(!ki||!ki.test(e))){if(f=l=Ri,d=t,m=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){for(c=hi(e),(l=t.getAttribute("id"))?f=l.replace(ua,"\\$&"):t.setAttribute("id",f),f="[id='"+f+"'] ",s=c.length;s--;)c[s]=f+ha(c[s]);d=aa.test(e)&&ga(t.parentNode)||t,m=c.join(",")}if(m)try{return ji.apply(n,d.querySelectorAll(m)),n}catch(e){}finally{l||t.removeAttribute("id")}}}return bi(e.replace(Yi,"$1"),t,n,r)};function la(){var n=[];function r(e,t){return n.push(e+" ")>mi.cacheLength&&delete r[n.shift()],r[e+" "]=t}return r}function fa(e){return e[Ri]=!0,e}function da(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||1<<31)-(~e.sourceIndex||1<<31);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function ma(a){return fa(function(i){return i=+i,fa(function(e,t){for(var n,r=a([],e.length,i),o=r.length;o--;)e[n=r[o]]&&(e[n]=!(t[n]=e[n]))})})}function ga(e){return e&&typeof e.getElementsByTagName!=Mi&&e}function pa(){}function ha(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function va(a,e,t){var u=e.dir,s=t&&"parentNode"===u,c=Oi++;return e.first?function(e,t,n){for(;e=e[u];)if(1===e.nodeType||s)return a(e,t,n)}:function(e,t,n){var r,o,i=[Ti,c];if(n){for(;e=e[u];)if((1===e.nodeType||s)&&a(e,t,n))return!0}else for(;e=e[u];)if(1===e.nodeType||s){if((r=(o=e[Ri]||(e[Ri]={}))[u])&&r[0]===Ti&&r[1]===c)return i[2]=r[2];if((o[u]=i)[2]=a(e,t,n))return!0}}}function ba(o){return 1<o.length?function(e,t,n){for(var r=o.length;r--;)if(!o[r](e,t,n))return!1;return!0}:o[0]}function ya(e,t,n,r,o){for(var i,a=[],u=0,s=e.length,c=null!=t;u<s;u++)(i=e[u])&&(n&&!n(i,r,o)||(a.push(i),c&&t.push(u)));return a}function Ca(e){return void 0!==e}function xa(e){return"string"==typeof e}function wa(e,t){var n,r=(t=t||Ra).createElement("div"),o=t.createDocumentFragment();for(r.innerHTML=e;n=r.firstChild;)o.appendChild(n);return o}function Sa(e,t){return e&&t&&-1!==(" "+e.className+" ").indexOf(" "+t+" ")}function Na(e,t,n){var r,o;return t=Ya(t)[0],e.each(function(){n&&r===this.parentNode||(r=this.parentNode,o=t.cloneNode(!1),this.parentNode.insertBefore(o,this)),o.appendChild(this)}),e}function Ea(e,t){return new Ya.fn.init(e,t)}function ka(e){return null==e?"":(""+e).replace(ja,"")}function _a(e,t){var n,r,o,i;if(e)if(void 0===(n=e.length)){for(r in e)if(e.hasOwnProperty(r)&&(i=e[r],!1===t.call(i,r,i)))break}else for(o=0;o<n&&(i=e[o],!1!==t.call(i,o,i));o++);return e}function Aa(e,n){var r=[];return _a(e,function(e,t){n(t,e)&&r.push(t)}),r}di=ca.support={},pi=ca.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},wi=ca.setDocument=function(e){var t,s=e?e.ownerDocument||e:Di,n=s.defaultView;return s!==Si&&9===s.nodeType&&s.documentElement?(Ni=(Si=s).documentElement,Ei=!pi(s),n&&n!==function(e){try{return e.top}catch(e){}return null}(n)&&(n.addEventListener?n.addEventListener("unload",function(){wi()},!1):n.attachEvent&&n.attachEvent("onunload",function(){wi()})),di.attributes=!0,di.getElementsByTagName=!0,di.getElementsByClassName=oa.test(s.getElementsByClassName),di.getById=!0,mi.find.ID=function(e,t){if(typeof t.getElementById!=Mi&&Ei){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},mi.filter.ID=function(e){var t=e.replace(sa,fi);return function(e){return e.getAttribute("id")===t}},mi.find.TAG=di.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!=Mi)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],o=0,i=t.getElementsByTagName(e);if("*"!==e)return i;for(;n=i[o++];)1===n.nodeType&&r.push(n);return r},mi.find.CLASS=di.getElementsByClassName&&function(e,t){if(Ei)return t.getElementsByClassName(e)},_i=[],ki=[],di.disconnectedMatch=!0,ki=ki.length&&new RegExp(ki.join("|")),_i=_i.length&&new RegExp(_i.join("|")),t=oa.test(Ni.compareDocumentPosition),Ai=t||oa.test(Ni.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},Ii=t?function(e,t){return e===t?(xi=!0,0):(n=!e.compareDocumentPosition-!t.compareDocumentPosition)||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!di.sortDetached&&t.compareDocumentPosition(e)===n?e===s||e.ownerDocument===Di&&Ai(Di,e)?-1:t===s||t.ownerDocument===Di&&Ai(Di,t)?1:Ci?qi.call(Ci,e)-qi.call(Ci,t):0:4&n?-1:1);var n}:function(e,t){if(e===t)return xi=!0,0;var n,r=0,o=e.parentNode,i=t.parentNode,a=[e],u=[t];if(!o||!i)return e===s?-1:t===s?1:o?-1:i?1:Ci?qi.call(Ci,e)-qi.call(Ci,t):0;if(o===i)return da(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?da(a[r],u[r]):a[r]===Di?-1:u[r]===Di?1:0},s):Si},ca.matches=function(e,t){return ca(e,null,null,t)},ca.matchesSelector=function(e,t){if((e.ownerDocument||e)!==Si&&wi(e),t=t.replace(Qi,"='$1']"),di.matchesSelector&&Ei&&(!_i||!_i.test(t))&&(!ki||!ki.test(t)))try{var n=(void 0).call(e,t);if(n||di.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){}return 0<ca(t,Si,null,[e]).length},ca.contains=function(e,t){return(e.ownerDocument||e)!==Si&&wi(e),Ai(e,t)},ca.attr=function(e,t){(e.ownerDocument||e)!==Si&&wi(e);var n=mi.attrHandle[t.toLowerCase()],r=n&&Fi.call(mi.attrHandle,t.toLowerCase())?n(e,t,!Ei):void 0;return void 0!==r?r:di.attributes||!Ei?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},ca.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},ca.uniqueSort=function(e){var t,n=[],r=0,o=0;if(xi=!di.detectDuplicates,Ci=!di.sortStable&&e.slice(0),e.sort(Ii),xi){for(;t=e[o++];)t===e[o]&&(r=n.push(o));for(;r--;)e.splice(n[r],1)}return Ci=null,e},gi=ca.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=gi(e)}else if(3===o||4===o)return e.nodeValue}else for(;t=e[r++];)n+=gi(t);return n},(mi=ca.selectors={cacheLength:50,createPseudo:fa,match:ta,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(sa,fi),e[3]=(e[3]||e[4]||e[5]||"").replace(sa,fi),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ca.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ca.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return ta.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Zi.test(n)&&(t=hi(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(sa,fi).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=Bi[e+" "];return t||(t=new RegExp("(^|"+$i+")"+e+"("+$i+"|$)"))&&Bi(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!=Mi&&e.getAttribute("class")||"")})},ATTR:function(n,r,o){return function(e){var t=ca.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===o:"!="===r?t!==o:"^="===r?o&&0===t.indexOf(o):"*="===r?o&&-1<t.indexOf(o):"$="===r?o&&t.slice(-o.length)===o:"~="===r?-1<(" "+t+" ").indexOf(o):"|="===r&&(t===o||t.slice(0,o.length+1)===o+"-"))}},CHILD:function(m,e,t,g,p){var h="nth"!==m.slice(0,3),v="last"!==m.slice(-4),b="of-type"===e;return 1===g&&0===p?function(e){return!!e.parentNode}:function(e,t,n){var r,o,i,a,u,s,c=h!=v?"nextSibling":"previousSibling",l=e.parentNode,f=b&&e.nodeName.toLowerCase(),d=!n&&!b;if(l){if(h){for(;c;){for(i=e;i=i[c];)if(b?i.nodeName.toLowerCase()===f:1===i.nodeType)return!1;s=c="only"===m&&!s&&"nextSibling"}return!0}if(s=[v?l.firstChild:l.lastChild],v&&d){for(u=(r=(o=l[Ri]||(l[Ri]={}))[m]||[])[0]===Ti&&r[1],a=r[0]===Ti&&r[2],i=u&&l.childNodes[u];i=++u&&i&&i[c]||(a=u=0)||s.pop();)if(1===i.nodeType&&++a&&i===e){o[m]=[Ti,u,a];break}}else if(d&&(r=(e[Ri]||(e[Ri]={}))[m])&&r[0]===Ti)a=r[1];else for(;(i=++u&&i&&i[c]||(a=u=0)||s.pop())&&((b?i.nodeName.toLowerCase()!==f:1!==i.nodeType)||!++a||(d&&((i[Ri]||(i[Ri]={}))[m]=[Ti,a]),i!==e)););return(a-=p)===g||a%g==0&&0<=a/g}}},PSEUDO:function(e,i){var t,a=mi.pseudos[e]||mi.setFilters[e.toLowerCase()]||ca.error("unsupported pseudo: "+e);return a[Ri]?a(i):1<a.length?(t=[e,e,"",i],mi.setFilters.hasOwnProperty(e.toLowerCase())?fa(function(e,t){for(var n,r=a(e,i),o=r.length;o--;)e[n=qi.call(e,r[o])]=!(t[n]=r[o])}):function(e){return a(e,0,t)}):a}},pseudos:{not:fa(function(e){var r=[],o=[],u=vi(e.replace(Yi,"$1"));return u[Ri]?fa(function(e,t,n,r){for(var o,i=u(e,null,r,[]),a=e.length;a--;)(o=i[a])&&(e[a]=!(t[a]=o))}):function(e,t,n){return r[0]=e,u(r,null,n,o),r[0]=null,!o.pop()}}),has:fa(function(t){return function(e){return 0<ca(t,e).length}}),contains:fa(function(t){return t=t.replace(sa,fi),function(e){return-1<(e.textContent||e.innerText||gi(e)).indexOf(t)}}),lang:fa(function(n){return ea.test(n||"")||ca.error("unsupported lang: "+n),n=n.replace(sa,fi).toLowerCase(),function(e){var t;do{if(t=Ei?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=window.location&&window.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===Ni},focus:function(e){return e===Si.activeElement&&(!Si.hasFocus||Si.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!mi.pseudos.empty(e)},header:function(e){return ra.test(e.nodeName)},input:function(e){return na.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ma(function(){return[0]}),last:ma(function(e,t){return[t-1]}),eq:ma(function(e,t,n){return[n<0?n+t:n]}),even:ma(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ma(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ma(function(e,t,n){for(var r=n<0?n+t:n;0<=--r;)e.push(r);return e}),gt:ma(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=mi.pseudos.eq,Y(["radio","checkbox","file","password","image"],function(e){var t;mi.pseudos[e]=(t=e,function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t})}),Y(["submit","reset"],function(e){var n;mi.pseudos[e]=(n=e,function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n})}),pa.prototype=mi.filters=mi.pseudos,mi.setFilters=new pa,hi=ca.tokenize=function(e,t){var n,r,o,i,a,u,s,c=Pi[e+" "];if(c)return t?0:c.slice(0);for(a=e,u=[],s=mi.preFilter;a;){for(i in n&&!(r=Gi.exec(a))||(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=Ji.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(Yi," ")}),a=a.slice(n.length)),mi.filter)mi.filter.hasOwnProperty(i)&&(!(r=ta[i].exec(a))||s[i]&&!(r=s[i](r))||(n=r.shift(),o.push({value:n,type:i,matches:r}),a=a.slice(n.length)));if(!n)break}return t?a.length:a?ca.error(e):Pi(e,u).slice(0)},vi=ca.compile=function(e,t){var n,h,v,b,y,r=[],o=[],i=Li[e+" "];if(!i){for(n=(t=t||hi(e)).length;n--;)((i=function e(t){for(var o,n,r,i=t.length,a=mi.relative[t[0].type],u=a||mi.relative[" "],s=a?1:0,c=va(function(e){return e===o},u,!0),l=va(function(e){return-1<qi.call(o,e)},u,!0),f=[function(e,t,n){var r=!a&&(n||t!==yi)||((o=t).nodeType?c:l)(e,t,n);return o=null,r}];s<i;s++)if(n=mi.relative[t[s].type])f=[va(ba(f),n)];else{if((n=mi.filter[t[s].type].apply(null,t[s].matches))[Ri]){for(r=++s;r<i&&!mi.relative[t[r].type];r++);return function e(m,g,p,h,v,t){return h&&!h[Ri]&&(h=e(h)),v&&!v[Ri]&&(v=e(v,t)),fa(function(e,t,n,r){var o,i,a,u=[],s=[],c=t.length,l=e||function(e,t,n){for(var r=0,o=t.length;r<o;r++)ca(e,t[r],n);return n}(g||"*",n.nodeType?[n]:n,[]),f=!m||!e&&g?l:ya(l,u,m,n,r),d=p?v||(e?m:c||h)?[]:t:f;if(p&&p(f,d,n,r),h)for(o=ya(d,s),h(o,[],n,r),i=o.length;i--;)(a=o[i])&&(d[s[i]]=!(f[s[i]]=a));if(e){if(v||m){if(v){for(o=[],i=d.length;i--;)(a=d[i])&&o.push(f[i]=a);v(null,d=[],o,r)}for(i=d.length;i--;)(a=d[i])&&-1<(o=v?qi.call(e,a):u[i])&&(e[o]=!(t[o]=a))}}else d=ya(d===t?d.splice(c,d.length):d),v?v(null,t,d,r):ji.apply(t,d)})}(1<s&&ba(f),1<s&&ha(t.slice(0,s-1).concat({value:" "===t[s-2].type?"*":""})).replace(Yi,"$1"),n,s<r&&e(t.slice(s,r)),r<i&&e(t=t.slice(r)),r<i&&ha(t))}f.push(n)}return ba(f)}(t[n]))[Ri]?r:o).push(i);(i=Li(e,(h=o,b=0<(v=r).length,y=0<h.length,b?fa(a):a))).selector=e}function a(e,t,n,r,o){var i,a,u,s=0,c="0",l=e&&[],f=[],d=yi,m=e||y&&mi.find.TAG("*",o),g=Ti+=null==d?1:Math.random()||.1,p=m.length;for(o&&(yi=t!==Si&&t);c!==p&&null!=(i=m[c]);c++){if(y&&i){for(a=0;u=h[a++];)if(u(i,t,n)){r.push(i);break}o&&(Ti=g)}b&&((i=!u&&i)&&s--,e&&l.push(i))}if(s+=c,b&&c!==s){for(a=0;u=v[a++];)u(l,f,t,n);if(e){if(0<s)for(;c--;)l[c]||f[c]||(f[c]=zi.call(r));f=ya(f)}ji.apply(r,f),o&&!e&&0<f.length&&1<s+v.length&&ca.uniqueSort(r)}return o&&(Ti=g,yi=d),l}return i},bi=ca.select=function(e,t,n,r){var o,i,a,u,s,c="function"==typeof e&&e,l=!r&&hi(e=c.selector||e);if(n=n||[],1===l.length){if(2<(i=l[0]=l[0].slice(0)).length&&"ID"===(a=i[0]).type&&di.getById&&9===t.nodeType&&Ei&&mi.relative[i[1].type]){if(!(t=(mi.find.ID(a.matches[0].replace(sa,fi),t)||[])[0]))return n;c&&(t=t.parentNode),e=e.slice(i.shift().value.length)}for(o=ta.needsContext.test(e)?0:i.length;o--&&(a=i[o],!mi.relative[u=a.type]);)if((s=mi.find[u])&&(r=s(a.matches[0].replace(sa,fi),aa.test(i[0].type)&&ga(t.parentNode)||t))){if(i.splice(o,1),!(e=r.length&&ha(i)))return ji.apply(n,r),n;break}}return(c||vi(e,l))(r,t,!Ei,n,aa.test(e)&&ga(t.parentNode)||t),n},di.sortStable=Ri.split("").sort(Ii).join("")===Ri,di.detectDuplicates=!!xi,wi(),di.sortDetached=!0;var Ra=document,Da=Array.prototype.push,Ta=Array.prototype.slice,Oa=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,Ba=ci.Event,Pa=Nt.makeMap("children,contents,next,prev"),La=function(e,t,n,r){var o;if(xa(t))t=wa(t,Va(e[0]));else if(t.length&&!t.nodeType){if(t=Ya.makeArray(t),r)for(o=t.length-1;0<=o;o--)La(e,t[o],n,r);else for(o=0;o<t.length;o++)La(e,t[o],n,r);return e}if(t.nodeType)for(o=e.length;o--;)n.call(e[o],t);return e},Ia=Nt.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),Ma=Nt.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),Fa={for:"htmlFor",class:"className",readonly:"readOnly"},Ua={float:"cssFloat"},za={},Ha={},ja=/^\s*|\s*$/g,Va=function(e){return e?9===e.nodeType?e:e.ownerDocument:Ra};function qa(e,t,n){var r=[],o=e[t];for("string"!=typeof n&&n instanceof Ya&&(n=n[0]);o&&9!==o.nodeType;){if(void 0!==n){if(o===n)break;if("string"==typeof n&&Ya(o).is(n))break}1===o.nodeType&&r.push(o),o=o[t]}return r}function $a(e,t,n,r){var o=[];for(r instanceof Ya&&(r=r[0]);e;e=e[t])if(!n||e.nodeType===n){if(void 0!==r){if(e===r)break;if("string"==typeof r&&Ya(e).is(r))break}o.push(e)}return o}function Wa(e,t,n){for(e=e[t];e;e=e[t])if(e.nodeType===n)return e;return null}function Ka(e,t){var n=t.attr("style"),r=e.serialize(e.parse(n),t[0].nodeName)||null;t.attr("data-mce-style",r)}function Xa(e,t){var n,r,o=0;if(e)for(n=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)r=e.nodeType,(!t||3!==r||r!==n&&e.nodeValue.length)&&(o++,n=r);return o}Ea.fn=Ea.prototype={constructor:Ea,selector:"",context:null,length:0,init:function(e,t){var n,r,o=this;if(!e)return o;if(e.nodeType)return o.context=o[0]=e,o.length=1,o;if(t&&t.nodeType)o.context=t;else{if(t)return Ya(e).attr(t);o.context=t=document}if(xa(e)){if(!(n="<"===(o.selector=e).charAt(0)&&">"===e.charAt(e.length-1)&&3<=e.length?[null,e,null]:Oa.exec(e)))return Ya(t).find(e);if(n[1])for(r=wa(e,Va(t)).firstChild;r;)Da.call(o,r),r=r.nextSibling;else{if(!(r=Va(t).getElementById(n[2])))return o;if(r.id!==n[2])return o.find(e);o.length=1,o[0]=r}}else this.add(e,!1);return o},toArray:function(){return Nt.toArray(this)},add:function(e,t){var n,r;if(xa(e))return this.add(Ya(e));if(!1!==t)for(n=Ya.unique(this.toArray().concat(Ya.makeArray(e))),this.length=n.length,r=0;r<n.length;r++)this[r]=n[r];else Da.apply(this,Ya.makeArray(e));return this},attr:function(t,n){var e,r=this;if("object"==typeof t)_a(t,function(e,t){r.attr(e,t)});else{if(!Ca(n)){if(r[0]&&1===r[0].nodeType){if((e=za[t])&&e.get)return e.get(r[0],t);if(Ma[t])return r.prop(t)?t:void 0;null===(n=r[0].getAttribute(t,2))&&(n=void 0)}return n}this.each(function(){var e;1===this.nodeType&&((e=za[t])&&e.set?e.set(this,n):null===n?this.removeAttribute(t,2):this.setAttribute(t,n,2))})}return r},removeAttr:function(e){return this.attr(e,null)},prop:function(e,t){var n=this;if("object"==typeof(e=Fa[e]||e))_a(e,function(e,t){n.prop(e,t)});else{if(!Ca(t))return n[0]&&n[0].nodeType&&e in n[0]?n[0][e]:t;this.each(function(){1===this.nodeType&&(this[e]=t)})}return n},css:function(t,n){function e(e){return e.replace(/-(\D)/g,function(e,t){return t.toUpperCase()})}function r(e){return e.replace(/[A-Z]/g,function(e){return"-"+e})}var o,i,a=this;if("object"==typeof t)_a(t,function(e,t){a.css(e,t)});else if(Ca(n))t=e(t),"number"!=typeof n||Ia[t]||(n=n.toString()+"px"),a.each(function(){var e=this.style;if((i=Ha[t])&&i.set)i.set(this,n);else{try{this.style[Ua[t]||t]=n}catch(e){}null!==n&&""!==n||(e.removeProperty?e.removeProperty(r(t)):e.removeAttribute(t))}});else{if(o=a[0],(i=Ha[t])&&i.get)return i.get(o);if(!o.ownerDocument.defaultView)return o.currentStyle?o.currentStyle[e(t)]:"";try{return o.ownerDocument.defaultView.getComputedStyle(o,null).getPropertyValue(r(t))}catch(e){return}}return a},remove:function(){for(var e,t=this.length;t--;)e=this[t],Ba.clean(e),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var e,t=this.length;t--;)for(e=this[t];e.firstChild;)e.removeChild(e.firstChild);return this},html:function(t){var n;if(Ca(t)){n=this.length;try{for(;n--;)this[n].innerHTML=t}catch(e){Ya(this[n]).empty().append(t)}return this}return this[0]?this[0].innerHTML:""},text:function(e){var t;if(Ca(e)){for(t=this.length;t--;)"innerText"in this[t]?this[t].innerText=e:this[0].textContent=e;return this}return this[0]?this[0].innerText||this[0].textContent:""},append:function(){return La(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.appendChild(e)})},prepend:function(){return La(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.insertBefore(e,this.firstChild)},!0)},before:function(){return this[0]&&this[0].parentNode?La(this,arguments,function(e){this.parentNode.insertBefore(e,this)}):this},after:function(){return this[0]&&this[0].parentNode?La(this,arguments,function(e){this.parentNode.insertBefore(e,this.nextSibling)},!0):this},appendTo:function(e){return Ya(e).append(this),this},prependTo:function(e){return Ya(e).prepend(this),this},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){return Na(this,e)},wrapAll:function(e){return Na(this,e,!0)},wrapInner:function(e){return this.each(function(){Ya(this).contents().wrapAll(e)}),this},unwrap:function(){return this.parent().each(function(){Ya(this).replaceWith(this.childNodes)})},clone:function(){var e=[];return this.each(function(){e.push(this.cloneNode(!0))}),Ya(e)},addClass:function(e){return this.toggleClass(e,!0)},removeClass:function(e){return this.toggleClass(e,!1)},toggleClass:function(o,i){var e=this;return"string"!=typeof o||(-1!==o.indexOf(" ")?_a(o.split(" "),function(){e.toggleClass(this,i)}):e.each(function(e,t){var n,r=Sa(t,o);r!==i&&(n=t.className,r?t.className=ka((" "+n+" ").replace(" "+o+" "," ")):t.className+=n?" "+o:o)})),e},hasClass:function(e){return Sa(this[0],e)},each:function(e){return _a(this,e)},on:function(e,t){return this.each(function(){Ba.bind(this,e,t)})},off:function(e,t){return this.each(function(){Ba.unbind(this,e,t)})},trigger:function(e){return this.each(function(){"object"==typeof e?Ba.fire(this,e.type,e):Ba.fire(this,e)})},show:function(){return this.css("display","")},hide:function(){return this.css("display","none")},slice:function(){return Ya(Ta.apply(this,arguments))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},find:function(e){for(var t=[],n=0,r=this.length;n<r;n++)Ya.find(e,this[n],t);return Ya(t)},filter:function(n){return Ya("function"==typeof n?Aa(this.toArray(),function(e,t){return n(t,e)}):Ya.filter(n,this.toArray()))},closest:function(n){var r=[];return n instanceof Ya&&(n=n[0]),this.each(function(e,t){for(;t;){if("string"==typeof n&&Ya(t).is(n)){r.push(t);break}if(t===n){r.push(t);break}t=t.parentNode}}),Ya(r)},offset:function(e){var t,n,r,o,i=0,a=0;return e?this.css(e):((t=this[0])&&(r=(n=t.ownerDocument).documentElement,t.getBoundingClientRect&&(i=(o=t.getBoundingClientRect()).left+(r.scrollLeft||n.body.scrollLeft)-r.clientLeft,a=o.top+(r.scrollTop||n.body.scrollTop)-r.clientTop)),{left:i,top:a})},push:Da,sort:Array.prototype.sort,splice:Array.prototype.splice},Nt.extend(Ea,{extend:Nt.extend,makeArray:function(e){return e&&e===e.window||e.nodeType?[e]:Nt.toArray(e)},inArray:function(e,t){var n;if(t.indexOf)return t.indexOf(e);for(n=t.length;n--;)if(t[n]===e)return n;return-1},isArray:Nt.isArray,each:_a,trim:ka,grep:Aa,find:ca,expr:ca.selectors,unique:ca.uniqueSort,text:ca.getText,contains:ca.contains,filter:function(e,t,n){var r=t.length;for(n&&(e=":not("+e+")");r--;)1!==t[r].nodeType&&t.splice(r,1);return 1===t.length?Ya.find.matchesSelector(t[0],e)?[t[0]]:[]:Ya.find.matches(e,t)}}),_a({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return qa(e,"parentNode")},next:function(e){return Wa(e,"nextSibling",1)},prev:function(e){return Wa(e,"previousSibling",1)},children:function(e){return $a(e.firstChild,"nextSibling",1)},contents:function(e){return Nt.toArray(("iframe"===e.nodeName?e.contentDocument||e.contentWindow.document:e).childNodes)}},function(r,o){Ea.fn[r]=function(t){var n=[];this.each(function(){var e=o.call(n,this,t,n);e&&(Ya.isArray(e)?n.push.apply(n,e):n.push(e))}),1<this.length&&(Pa[r]||(n=Ya.unique(n)),0===r.indexOf("parents")&&(n=n.reverse()));var e=Ya(n);return t?e.filter(t):e}}),_a({parentsUntil:function(e,t){return qa(e,"parentNode",t)},nextUntil:function(e,t){return $a(e,"nextSibling",1,t).slice(1)},prevUntil:function(e,t){return $a(e,"previousSibling",1,t).slice(1)}},function(o,i){Ea.fn[o]=function(t,e){var n=[];this.each(function(){var e=i.call(n,this,t,n);e&&(Ya.isArray(e)?n.push.apply(n,e):n.push(e))}),1<this.length&&(n=Ya.unique(n),0!==o.indexOf("parents")&&"prevUntil"!==o||(n=n.reverse()));var r=Ya(n);return e?r.filter(e):r}}),Ea.fn.is=function(e){return!!e&&0<this.filter(e).length},Ea.fn.init.prototype=Ea.fn,Ea.overrideDefaults=function(n){var r,o=function(e,t){return r=r||n(),0===arguments.length&&(e=r.element),t=t||r.context,new o.fn.init(e,t)};return Ya.extend(o,this),o},Ea.attrHooks=za,Ea.cssHooks=Ha;var Ya=Ea,Ga=Nt.each,Ja=Nt.grep,Qa=xt.ie,Za=/^([a-z0-9],?)+$/i,eu=function(a,u){function s(e){return e&&a&&X(e)?a.getElementById(e):e}function c(e){return H("string"==typeof e?s(e):e)}function r(e,t,n){var r,o,i=c(e);return void 0===(o=i.length?(r=W[t])&&r.get?r.get(i,t):i.attr(t):o)?n||"":o}function o(e){var t=s(e);return t?t.attributes:[]}function i(e,t,n){""===n&&(n=null);var r,o=c(e),i=o.attr(t);o.length&&((r=W[t])&&r.set?r.set(o,n,t):o.attr(t,n),i!==n&&u.onSetAttrib&&u.onSetAttrib({attrElm:o,attrName:t,attrValue:n}))}function l(){return u.root_element||a.body}function f(e,t){return function(e,t,n){var r,o=0,i=0,a=e.ownerDocument;if(n=n||e,t){if(n===e&&t.getBoundingClientRect&&"static"===wn(Et.fromDom(e),"position")){var u=t.getBoundingClientRect();return{x:o=u.left+(a.documentElement.scrollLeft||e.scrollLeft)-a.documentElement.clientLeft,y:i=u.top+(a.documentElement.scrollTop||e.scrollTop)-a.documentElement.clientTop}}for(var s=t;s&&s!==n&&s.nodeType&&!kn(s,n);){var c=s;o+=c.offsetLeft||0,i+=c.offsetTop||0,s=c.offsetParent}for(s=t.parentNode;s&&s!==n&&s.nodeType&&!kn(s,n);)o-=s.scrollLeft||0,i-=s.scrollTop||0,s=s.parentNode;i+=(r=Et.fromDom(t),er.isFirefox()&&"table"===kt(r)?En(Tn(r)).filter(function(e){return"caption"===kt(e)}).bind(function(o){return En(It(o)).map(function(e){var t=e.dom.offsetTop,n=o.dom.offsetTop,r=o.dom.offsetHeight;return t<=n?-r:0})}).getOr(0):0)}return{x:o,y:i}}(a.body,s(e),t)}function d(e,t,n){var r=c(e);return n?r.css(t):("float"===(t=t.replace(/-(\D)/g,function(e,t){return t.toUpperCase()}))&&(t=xt.browser.isIE()?"styleFloat":"cssFloat"),r[0]&&r[0].style?r[0].style[t]:void 0)}function m(e){var t=d(e=s(e),"width"),n=d(e,"height");return-1===t.indexOf("px")&&(t=0),-1===n.indexOf("px")&&(n=0),{w:parseInt(t,10)||e.offsetWidth||e.clientWidth,h:parseInt(n,10)||e.offsetHeight||e.clientHeight}}function g(e,t){if(!e)return!1;if(!Array.isArray(e)){if("*"===t)return 1===e.nodeType;if(Za.test(t)){for(var n=t.toLowerCase().split(/,/),r=e.nodeName.toLowerCase(),o=n.length-1;0<=o;o--)if(n[o]===r)return!0;return!1}if(e.nodeType&&1!==e.nodeType)return!1}var i=Array.isArray(e)?e:[e];return 0<ca(t,i[0].ownerDocument||i[0],null,i).length}function p(e,t,n,r){var o,i=[],a=s(e);for(r=void 0===r,n=n||("BODY"!==l().nodeName?l().parentNode:null),Nt.is(t,"string")&&(t="*"===(o=t)?function(e){return 1===e.nodeType}:function(e){return g(e,o)});a&&!(a===n||K(a.nodeType)||$n(a)||Wn(a));){if(!t||"function"==typeof t&&t(a)){if(!r)return[a];i.push(a)}a=a.parentNode}return r?i:null}function n(e,t,n){var r=t;if(e)for("string"==typeof t&&(r=function(e){return g(e,t)}),e=e[n];e;e=e[n])if("function"==typeof r&&r(e))return e;return null}function h(e,n,r){var o,t="string"==typeof e?s(e):e;return!!t&&(Nt.isArray(t)&&(t.length||0===t.length)?(o=[],Ga(t,function(e,t){e&&o.push(n.call(r,"string"==typeof e?s(e):e,t))}),o):n.call(r||this,t))}function v(e,t){c(e).each(function(e,n){Ga(t,function(e,t){i(n,t,e)})})}function b(e,n){var t=c(e);Qa?t.each(function(e,t){if(!1!==t.canHaveHTML){for(;t.firstChild;)t.removeChild(t.firstChild);try{t.innerHTML="<br>"+n,t.removeChild(t.firstChild)}catch(e){Ya("<div></div>").html("<br>"+n).contents().slice(1).appendTo(t)}return n}}):t.html(n)}function y(e,n,r,o,i){return h(e,function(e){var t="string"==typeof n?a.createElement(n):n;return v(t,r),o&&("string"!=typeof o&&o.nodeType?t.appendChild(o):"string"==typeof o&&b(t,o)),i?t:e.appendChild(t)})}function C(e,t,n){return y(a.createElement(e),e,t,n,!0)}function x(e,t){var n=c(e);return(t?n.each(function(){for(var e;e=this.firstChild;)3===e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}):n).remove(),1<n.length?n.toArray():n[0]}function w(e,t,n){c(e).toggleClass(t,n).each(function(){""===this.className&&Ya(this).attr("class",null)})}function S(t,e,n){return h(e,function(e){return Nt.is(e,"array")&&(t=t.cloneNode(!0)),n&&Ga(Ja(e.childNodes),function(e){t.appendChild(e)}),e.parentNode.replaceChild(t,e)})}function N(e){if(Hn(e)){var t="a"===e.nodeName.toLowerCase()&&!r(e,"href")&&r(e,"id");return r(e,"name")||r(e,"data-mce-bookmark")||t?1:void 0}}function E(){return a.createRange()}function k(e){if(e&&Hn(e)){var t=e.getAttribute("data-mce-contenteditable");return t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null}return null}void 0===u&&(u={});var _,A,R,D,e,t,T={},O=window,B={},P=0,L=Rr.forElement(Et.fromDom(a),{contentCssCors:u.contentCssCors,referrerPolicy:u.referrerPolicy}),I=[],M=u.schema||oo({}),F=ao({url_converter:u.url_converter,url_converter_scope:u.url_converter_scope},u.schema),U=u.ownEvents?new ci:ci.Event,z=M.getBlockElements(),H=Ya.overrideDefaults(function(){return{context:a,element:$.getRoot()}}),j=Zo.encodeAllRaw,V=function(e,t,n,r){if(Nt.isArray(e)){for(var o=e.length,i=[];o--;)i[o]=V(e[o],t,n,r);return i}return!u.collect||e!==a&&e!==O||I.push([e,t,n,r]),U.bind(e,t,n,r||$)},q=function(e,t,n){if(Nt.isArray(e)){for(var r=e.length,o=[];r--;)o[r]=q(e[r],t,n);return o}if(0<I.length&&(e===a||e===O))for(r=I.length;r--;){var i=I[r];e!==i[0]||t&&t!==i[1]||n&&n!==i[2]||U.unbind(i[0],i[1],i[2])}return U.unbind(e,t,n)},$={doc:a,settings:u,win:O,files:B,stdMode:!0,boxModel:!0,styleSheetLoader:L,boundEvents:I,styles:F,schema:M,events:U,isBlock:function(e){if("string"==typeof e)return!!z[e];if(e){var t=e.nodeType;if(t)return!(1!==t||!z[e.nodeName])}return!1},$:H,$$:c,root:null,clone:function(t,e){if(!Qa||1!==t.nodeType||e)return t.cloneNode(e);var n=a.createElement(t.nodeName);return Ga(o(t),function(e){i(n,e.nodeName,r(t,e.nodeName))}),n},getRoot:l,getViewPort:function(e){var t=tn(e);return{x:t.x,y:t.y,w:t.width,h:t.height}},getRect:function(e){var t=f(e=s(e)),n=m(e);return{x:t.x,y:t.y,w:n.w,h:n.h}},getSize:m,getParent:function(e,t,n){var r=p(e,t,n,!1);return r&&0<r.length?r[0]:null},getParents:p,get:s,getNext:function(e,t){return n(e,t,"nextSibling")},getPrev:function(e,t){return n(e,t,"previousSibling")},select:function(e,t){return ca(e,s(t)||u.root_element||a,[])},is:g,add:y,create:C,createHTML:function(e,t,n){var r,o="";for(r in o+="<"+e,t)se(t,r)&&(o+=" "+r+'="'+j(t[r])+'"');return void 0!==n?o+">"+n+"</"+e+">":o+" />"},createFragment:function(e){var t,n=a.createElement("div"),r=a.createDocumentFragment();for(r.appendChild(n),e&&(n.innerHTML=e);t=n.firstChild;)r.appendChild(t);return r.removeChild(n),r},remove:x,setStyle:function(e,t,n){var r=X(t)?c(e).css(t,n):c(e).css(t);u.update_styles&&Ka(F,r)},getStyle:d,setStyles:function(e,t){var n=c(e).css(t);u.update_styles&&Ka(F,n)},removeAllAttribs:function(e){return h(e,function(e){for(var t=e.attributes,n=t.length-1;0<=n;n--)e.removeAttributeNode(t.item(n))})},setAttrib:i,setAttribs:v,getAttrib:r,getPos:f,parseStyle:function(e){return F.parse(e)},serializeStyle:function(e,t){return F.serialize(e,t)},addStyle:function(e){var t,n;if($!==eu.DOM&&a===document){if(T[e])return;T[e]=!0}(n=a.getElementById("mceDefaultStyles"))||((n=a.createElement("style")).id="mceDefaultStyles",n.type="text/css",(t=a.getElementsByTagName("head")[0]).firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n)),n.styleSheet?n.styleSheet.cssText+=e:n.appendChild(a.createTextNode(e))},loadCSS:function(e){Y((e=e||"").split(","),function(e){B[e]=!0,L.load(e,te)})},addClass:function(e,t){c(e).addClass(t)},removeClass:function(e,t){w(e,t,!1)},hasClass:function(e,t){return c(e).hasClass(t)},toggleClass:w,show:function(e){c(e).show()},hide:function(e){c(e).hide()},isHidden:function(e){return"none"===c(e).css("display")},uniqueId:function(e){return(e||"mce_")+P++},setHTML:b,getOuterHTML:function(e){var t="string"==typeof e?s(e):e;return Hn(t)?t.outerHTML:Ya("<div></div>").append(Ya(t).clone()).html()},setOuterHTML:function(e,t){c(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}x(Ya(this).html(t),!0)})},decode:Zo.decode,encode:j,insertAfter:function(e,t){var r=s(t);return h(e,function(e){var t=r.parentNode,n=r.nextSibling;return n?t.insertBefore(e,n):t.appendChild(e),e})},replace:S,rename:function(t,e){var n;return t.nodeName!==e.toUpperCase()&&(n=C(e),Ga(o(t),function(e){i(n,e.nodeName,r(t,e.nodeName))}),S(n,t,!0)),n||t},findCommonAncestor:function(e,t){for(var n,r=e;r;){for(n=t;n&&r!==n;)n=n.parentNode;if(r===n)break;r=r.parentNode}return!r&&e.ownerDocument?e.ownerDocument.documentElement:r},toHex:function(e){return F.toHex(Nt.trim(e))},run:h,getAttribs:o,isEmpty:function(e,t){var n,r,o=0;if(N(e))return!1;if(e=e.firstChild){var i=new Dr(e,e.parentNode),a=M?M.getWhiteSpaceElements():{};t=t||(M?M.getNonEmptyElements():null);do{if(n=e.nodeType,Hn(e)){var u=e.getAttribute("data-mce-bogus");if(u){e=i.next("all"===u);continue}if(r=e.nodeName.toLowerCase(),t&&t[r]){if("br"!==r)return!1;o++,e=i.next();continue}if(N(e))return!1}if(8===n)return!1;if(3===n&&!$r(e.nodeValue))return!1;if(3===n&&e.parentNode&&a[e.parentNode.nodeName]&&$r(e.nodeValue))return!1;e=i.next()}while(e)}return o<=1},createRng:E,nodeIndex:Xa,split:function(e,t,n){var r,o,i,a=E();if(e&&t)return a.setStart(e.parentNode,Xa(e)),a.setEnd(t.parentNode,Xa(t)),r=a.extractContents(),(a=E()).setStart(t.parentNode,Xa(t)+1),a.setEnd(e.parentNode,Xa(e)+1),o=a.extractContents(),(i=e.parentNode).insertBefore(Vo($,r),e),n?i.insertBefore(n,e):i.insertBefore(t,e),i.insertBefore(Vo($,o),e),x(e),n||t},bind:V,unbind:q,fire:function(e,t,n){return U.fire(e,t,n)},getContentEditable:k,getContentEditableParent:function(e){for(var t=l(),n=null;e&&e!==t&&null===(n=k(e));e=e.parentNode);return n},destroy:function(){if(0<I.length)for(var e=I.length;e--;){var t=I[e];U.unbind(t[0],t[1],t[2])}ne(B,function(e,t){L.unload(t),delete B[t]}),ca.setDocument&&ca.setDocument()},isChildOf:function(e,t){if(Qa){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}return e===t||t.contains(e)},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset}},W=(_=F,R=J($),e={set:function(e,t,n){A.url_converter&&null!==t&&(t=A.url_converter.call(A.url_converter_scope||R(),t,n,e[0])),e.attr("data-mce-"+n,t).attr(n,t)},get:function(e,t){return e.attr("data-mce-"+t)||e.attr(t)}},t={style:{set:function(e,t){null===t||"object"!=typeof t?(D&&e.attr("data-mce-style",t),null!==t&&"string"==typeof t?(e.removeAttr("style"),e.css(_.parse(t))):e.attr("style",t)):e.css(t)},get:function(e){var t=e.attr("data-mce-style")||e.attr("style");return _.serialize(_.parse(t),e[0].nodeName)}}},(D=(A=u).keep_values)&&(t.href=t.src=e),t);return $};eu.DOM=eu(document),eu.nodeIndex=Xa;var tu=eu.DOM,nu=Nt.each,ru=Nt.grep,ou=(iu.prototype._setReferrerPolicy=function(e){this.settings.referrerPolicy=e},iu.prototype.loadScript=function(e,t,n){function r(){o.remove(i),a&&(a.onerror=a.onload=a=null)}var o=tu,i=o.uniqueId(),a=document.createElement("script");a.id=i,a.type="text/javascript",a.src=Nt._addCacheSuffix(e),this.settings.referrerPolicy&&o.setAttrib(a,"referrerpolicy",this.settings.referrerPolicy),a.onload=function(){r(),t()},a.onerror=function(){r(),y(n)?n():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+e)},(document.getElementsByTagName("head")[0]||document.body).appendChild(a)},iu.prototype.isDone=function(e){return 2===this.states[e]},iu.prototype.markDone=function(e){this.states[e]=2},iu.prototype.add=function(e,t,n,r){var o=this.states[e];this.queue.push(e),void 0===o&&(this.states[e]=0),t&&(this.scriptLoadedCallbacks[e]||(this.scriptLoadedCallbacks[e]=[]),this.scriptLoadedCallbacks[e].push({success:t,failure:r,scope:n||this}))},iu.prototype.load=function(e,t,n,r){return this.add(e,t,n,r)},iu.prototype.remove=function(e){delete this.states[e],delete this.scriptLoadedCallbacks[e]},iu.prototype.loadQueue=function(e,t,n){this.loadScripts(this.queue,e,t,n)},iu.prototype.loadScripts=function(n,e,t,r){function o(t,e){nu(i.scriptLoadedCallbacks[e],function(e){y(e[t])&&e[t].call(e.scope)}),i.scriptLoadedCallbacks[e]=void 0}var i=this,a=[];i.queueLoadedCallbacks.push({success:e,failure:r,scope:t||this});var u=function(){var e,t=ru(n);n.length=0,nu(t,function(e){2!==i.states[e]?3!==i.states[e]?1!==i.states[e]&&(i.states[e]=1,i.loading++,i.loadScript(e,function(){i.states[e]=2,i.loading--,o("success",e),u()},function(){i.states[e]=3,i.loading--,a.push(e),o("failure",e),u()})):o("failure",e):o("success",e)}),i.loading||(e=i.queueLoadedCallbacks.slice(0),i.queueLoadedCallbacks.length=0,nu(e,function(e){0===a.length?y(e.success)&&e.success.call(e.scope):y(e.failure)&&e.failure.call(e.scope,a)}))};u()},iu.ScriptLoader=new iu,iu);function iu(e){void 0===e&&(e={}),this.states={},this.queue=[],this.scriptLoadedCallbacks={},this.queueLoadedCallbacks=[],this.loading=0,this.settings=e}function au(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function uu(){return ue(su,cu.get())}var su={},cu=au("en"),lu={getData:function(){return re(su,function(e){return _e({},e)})},setCode:function(e){e&&cu.set(e)},getCode:function(){return cu.get()},add:function(e,t){var n=su[e];n||(su[e]=n={}),ne(t,function(e,t){n[t.toLowerCase()]=e})},translate:function(e){function n(e){return y(e)?Object.prototype.toString.call(e):u(e)?"":""+e}function t(e){var t=n(e);return ue(a,t.toLowerCase()).map(n).getOr(t)}function r(e){return e.replace(/{context:\w+}$/,"")}var o,i,a=uu().getOr({}),u=function(e){return""===e||null==e};if(u(e))return"";if(h(o=e)&&Ee(o,"raw"))return n(e.raw);if(S(i=e)&&1<i.length){var s=e.slice(1);return r(t(e[0]).replace(/\{([0-9]+)\}/g,function(e,t){return Ee(s,t)?n(s[t]):e}))}return r(t(e))},isRtl:function(){return uu().bind(function(e){return ue(e,"_dir")}).exists(function(e){return"rtl"===e})},hasCode:function(e){return Ee(su,e)}},fu=function(){function u(t,n){Y(U(r,function(e){return e.name===t&&e.state===n}),function(e){return e.callback()})}function s(e){var t;return(f[e]?f[e].dependencies:t)||[]}function c(e,t){return"object"==typeof t?t:"string"==typeof e?{prefix:"",resource:t,suffix:""}:{prefix:e.prefix,resource:t,suffix:e.suffix}}function e(e,t,n){void 0===n&&(n="added"),Ee(f,e)&&"added"===n||Ee(l,e)&&"loaded"===n?t():r.push({name:e,state:n,callback:t})}var o=[],l={},f={},r=[],d=function(r,o,i,a,e){var t,n;l[r]||(0!==(t="string"==typeof o?o:o.prefix+o.resource+o.suffix).indexOf("/")&&-1===t.indexOf("://")&&(t=fu.baseURL+"/"+t),l[r]=t.substring(0,t.lastIndexOf("/")),n=function(){var n,e,t;u(r,"loaded"),n=o,e=i,t=a,Y(s(r),function(e){var t=c(n,e);d(t.resource,t,void 0,void 0)}),e&&(t?e.call(t):e.call(ou))},f[r]?n():ou.ScriptLoader.add(t,n,a,e))};return{items:o,urls:l,lookup:f,_listeners:r,get:function(e){if(f[e])return f[e].instance},dependencies:s,requireLangPack:function(t,n){!1!==fu.languageLoad&&e(t,function(){var e=lu.getCode();!e||n&&-1===(","+(n||"")+",").indexOf(","+e+",")||ou.ScriptLoader.add(l[t]+"/langs/"+e+".js")},"loaded")},add:function(e,t,n){var r=t;return o.push(r),f[e]={instance:r,dependencies:n},u(e,"added"),r},remove:function(e){delete l[e],delete f[e]},createUrl:c,addComponents:function(e,t){var n=l[e];Y(t,function(e){ou.ScriptLoader.add(n+"/"+e)})},load:d,waitFor:e}};function du(){var e,t,n=(e=te,t=au(ve.none()),{clear:function(){r(),t.set(ve.none())},isSet:function(){return t.get().isSome()},get:function(){return t.get()},set:function(e){r(),t.set(ve.some(e))}});function r(){return t.get().each(e)}return _e(_e({},n),{on:function(e){return n.get().each(e)}})}function mu(n,r){var o=null;return{cancel:function(){l(o)||(clearTimeout(o),o=null)},throttle:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];l(o)&&(o=setTimeout(function(){o=null,n.apply(null,e)},r))}}}function gu(n,r){function o(){l(i)||(clearTimeout(i),i=null)}var i=null;return{cancel:o,throttle:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o(),i=setTimeout(function(){i=null,n.apply(null,e)},r)}}}function pu(e,t){var n=vn(e,t);return void 0===n||""===n?[]:n.split(" ")}function hu(e){return void 0!==e.dom.classList}function vu(e,t){var n,r,o;hu(e)?e.dom.classList.add(t):(r=t,o=pu(n=e,"class").concat([r]),pn(n,"class",o.join(" ")))}function bu(e,t){return hu(e)&&e.dom.classList.contains(t)}function yu(e,t){return He(n=void 0===e?document:e.dom)?[]:A(n.querySelectorAll(t),Et.fromDom);var n}function Cu(r,e){function t(e,t){return yn(e,t)?ve.some(vn(e,t)):ve.none()}var n=r.selection.getRng(),o=Et.fromDom(n.startContainer),i=Et.fromDom(r.getBody()),a=e.fold(function(){return"."+$u()},function(e){return"["+Wu()+'="'+e+'"]'});return yr(Mt(o,n.startOffset).getOr(o),a,function(e){return je(e,i)}).bind(function(e){return t(e,""+Ku()).bind(function(n){return t(e,""+Wu()).map(function(e){var t=Xu(r,n);return{uid:n,name:e,elements:t}})})})}function xu(t){function o(){return{listeners:[],previous:du()}}function c(e,t){n(e,function(e){return t(e),e})}function n(e,t){var n=i.get(),r=t(ue(n,e).getOrThunk(o));n[e]=r,i.set(n)}var i=au({}),e=gu(function(){var e=i.get();Y(W(we(e)),function(e){n(e,function(u){var s=u.previous.get();return Cu(t,ve.some(e)).fold(function(){var t;s.isSome()&&(c(t=e,function(e){Y(e.listeners,function(e){return e(!1,t)})}),u.previous.clear())},function(e){var t,n,r,o=e.uid,i=e.name,a=e.elements;fn(s,o)||(n=o,r=a,c(t=i,function(e){Y(e.listeners,function(e){return e(!0,t,{uid:n,nodes:A(r,function(e){return e.dom})})})}),u.previous.set(o))}),{previous:u.previous,listeners:u.listeners}})})},30);return t.on("remove",function(){e.cancel()}),t.on("NodeChange",function(){e.throttle()}),{addListener:function(e,t){n(e,function(e){return{previous:e.previous,listeners:e.listeners.concat([t])}})}}}function wu(e){var t=(new Date).getTime();return e+"_"+Math.floor(1e9*Math.random())+ ++Yu+String(t)}function Su(e,t){var n,r,o=Rt(e).dom,i=Et.fromDom(o.createDocumentFragment());Kt(i,(n=t,(r=(o||document).createElement("div")).innerHTML=n,Tn(Et.fromDom(r)))),Xt(e),Ln(e,i)}function Nu(e,t){return Et.fromDom(e.dom.cloneNode(t))}function Eu(e){return Nu(e,!1)}function ku(e){return Nu(e,!0)}function _u(e,t,n){function r(e){for(var t;(t=o[e]())&&!Vn(t)&&!n(t););return ve.from(t).filter(Vn)}void 0===n&&(n=D);var o=new Dr(e,t);return{current:function(){return ve.from(o.current()).filter(Vn)},next:function(){return r("next")},prev:function(){return r("prev")},prev2:function(){return r("prev2")}}}function Au(t,e){var i=e||function(e){return t.isBlock(e)||Kn(e)||Gn(e)},a=function(e,t,n,r){if(Vn(e)){var o=r(e,t,e.data);if(-1!==o)return ve.some({container:e,offset:o})}return n().bind(function(e){return a(e.container,e.offset,n,r)})};return{backwards:function(e,t,n,r){var o=_u(e,r,i);return a(e,t,function(){return o.prev().map(function(e){return{container:e,offset:e.length}})},n).getOrNull()},forwards:function(e,t,n,r){var o=_u(e,r,i);return a(e,t,function(){return o.next().map(function(e){return{container:e,offset:0}})},n).getOrNull()}}}function Ru(e){return e?{left:Gu(e.left),top:Gu(e.top),bottom:Gu(e.bottom),right:Gu(e.right),width:Gu(e.width),height:Gu(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0}}function Du(e,t){return e=Ru(e),t||(e.left=e.left+e.width),e.right=e.left,e.width=0,e}function Tu(e,t,n){return 0<=e&&e<=Math.min(t.height,n.height)/2}function Ou(e,t){var n=Math.min(t.height/2,e.height/2);return e.bottom-n<t.top||!(e.top>t.bottom)&&Tu(t.top-e.bottom,e,t)}function Bu(e,t){return e.top>t.bottom||!(e.bottom<t.top)&&Tu(t.bottom-e.top,e,t)}function Pu(e,t,n){return t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom}function Lu(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset===n+1?t.childNodes[n]:null}function Iu(e,t){if(Hn(e)&&e.hasChildNodes()){var n=e.childNodes;return n[r=n.length-1,Math.min(Math.max(t,0),r)]}return e;var r}function Mu(e){return"string"==typeof e&&768<=e.charCodeAt(0)&&Ju.test(e)}function Fu(e){return"createRange"in e?e.createRange():eu.DOM.createRng()}function Uu(e){return e&&/[\r\n\t ]/.test(e)}function zu(e){return e.setStart&&e.setEnd}function Hu(e){var t=e.startContainer,n=e.startOffset;if(Uu(e.toString())&&rs(t.parentNode)&&Vn(t)){var r=t.data;return Uu(r[n-1])||Uu(r[n+1])?1:void 0}}function ju(e){return 0===e.left&&0===e.right&&0===e.top&&0===e.bottom}function Vu(e,t){var n=Du(e,t);return n.width=1,n.right=n.left+1,n}fu.languageLoad=!0,fu.baseURL="",fu.PluginManager=fu(),fu.ThemeManager=fu();var qu=function(e,t){var n=[];return Y(Tn(e),function(e){n=(n=t(e)?n.concat([e]):n).concat(qu(e,t))}),n},$u=J("mce-annotation"),Wu=J("data-mce-annotation"),Ku=J("data-mce-annotation-uid"),Xu=function(e,t){return yu(Et.fromDom(e.getBody()),"["+Ku()+'="'+t+'"]')},Yu=0,Gu=Math.round,Ju=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]"),Qu=Hn,Zu=Vr,es=an("display","block table"),ts=an("float","left right"),ns=function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return function(e){for(var t=0;t<n.length;t++)if(!n[t](e))return!1;return!0}}(Qu,Zu,s(ts)),rs=s(an("white-space","pre pre-line pre-wrap")),os=Vn,is=Kn,as=eu.nodeIndex,us=function(e,t){if(!(t<0&&Hn(e)&&e.hasChildNodes()))return Iu(e,t)},ss=function(e){var t=e.getClientRects(),n=0<t.length?Ru(t[0]):Ru(e.getBoundingClientRect());return!zu(e)&&is(e)&&ju(n)?function(e){var t=e.ownerDocument,n=Fu(t),r=t.createTextNode(wo),o=e.parentNode;o.insertBefore(r,e),n.setStart(r,0),n.setEnd(r,1);var i=Ru(n.getBoundingClientRect());return o.removeChild(r),i}(e):ju(n)&&zu(e)?function(e){var t=e.startContainer,n=e.endContainer,r=e.startOffset,o=e.endOffset;if(t===n&&Vn(n)&&0===r&&1===o){var i=e.cloneRange();return i.setEndAfter(n),ss(i)}return null}(e):n},cs=function(t,n,e){function r(){return e=e||function(e){function r(e){var t;0!==e.height&&(0<o.length&&(t=o[o.length-1],e.left===t.left&&e.top===t.top&&e.bottom===t.bottom&&e.right===t.right)||o.push(e))}function t(e,t){var n=Fu(e.ownerDocument);if(t<e.data.length){if(Mu(e.data[t]))return o;if(Mu(e.data[t-1])&&(n.setStart(e,t),n.setEnd(e,t+1),!Hu(n)))return r(Vu(ss(n),!1)),o}0<t&&(n.setStart(e,t-1),n.setEnd(e,t),Hu(n)||r(Vu(ss(n),!1))),t<e.data.length&&(n.setStart(e,t),n.setEnd(e,t+1),Hu(n)||r(Vu(ss(n),!0)))}var o=[],n=e.container(),i=e.offset();if(os(n))return t(n,i),o;if(Qu(n))if(e.isAtEnd()){var a=us(n,i);os(a)&&t(a,a.data.length),ns(a)&&!is(a)&&r(Vu(ss(a),!1))}else{if(a=us(n,i),os(a)&&t(a,0),ns(a)&&e.isAtEnd())return r(Vu(ss(a),!1)),o;var u=us(e.container(),e.offset()-1);ns(u)&&!is(u)&&(!es(u)&&!es(a)&&ns(a)||r(Vu(ss(u),!1))),ns(a)&&r(Vu(ss(a),!0))}return o}(cs(t,n))}return{container:J(t),offset:J(n),toRange:function(){var e=Fu(t.ownerDocument);return e.setStart(t,n),e.setEnd(t,n),e},getClientRects:r,isVisible:function(){return 0<r().length},isAtStart:function(){return os(t),0===n},isAtEnd:function(){return os(t)?n>=t.data.length:n>=t.childNodes.length},isEqual:function(e){return e&&t===e.container()&&n===e.offset()},getNode:function(e){return us(t,e?n-1:n)}}};function ls(e,t){Vn(t)&&0===t.data.length&&e.remove(t)}function fs(e,t,n){var r,o,i,a,u,s,c;Wn(n)?(i=e,a=t,s=ve.from((u=n).firstChild),c=ve.from(u.lastChild),a.insertNode(u),s.each(function(e){return ls(i,e.previousSibling)}),c.each(function(e){return ls(i,e.nextSibling)})):(r=e,t.insertNode(o=n),ls(r,o.previousSibling),ls(r,o.nextSibling))}function ds(t){return function(e){return t===e}}function ms(e){var t,r,n,o;return(lc(e)?"text()":e.nodeName.toLowerCase())+"["+(r=gc(mc(t=e)),n=ge(r,ds(t),t),o=me(r=r.slice(0,n+1),function(e,t,n){return lc(t)&&lc(r[n-1])&&e++,e},0),ge(r=fe(r,on([t.nodeName])),ds(t),t)-o)+"]"}function gs(e,t){var n,r,o,i=[],a=t.container(),u=t.offset();return lc(a)?n=function(e,t){for(;(e=e.previousSibling)&&lc(e);)t+=e.data.length;return t}(a,u):(u>=(r=a.childNodes).length?(n="after",u=r.length-1):n="before",a=r[u]),i.push(ms(a)),o=fe(function(e,t){var n=[];for(t=t.parentNode;t!==e;t=t.parentNode)n.push(t);return n}(e,a),s(sn)),(i=i.concat(le(o,ms))).reverse().join("/")+","+n}function ps(e,t){if(!t)return null;var n=t.split(","),r=n[0].split("/"),o=1<n.length?n[1]:"before",i=me(r,function(e,t){var n,r,o,i,a=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t);return a?("text()"===a[1]&&(a[1]="#text"),n=e,r=a[1],o=parseInt(a[2],10),i=fe(i=gc(n),function(e,t){return!lc(e)||!lc(i[t-1])}),(i=fe(i,on([r])))[o]):null},e);return i?lc(i)?function(e,t){for(var n,r=e,o=0;lc(r);){if(n=r.data.length,o<=t&&t<=o+n){e=r,t-=o;break}if(!lc(r.nextSibling)){e=r,t=n;break}o+=n,r=r.nextSibling}return lc(e)&&t>e.data.length&&(t=e.data.length),cs(e,t)}(i,parseInt(o,10)):(o="after"===o?dc(i)+1:dc(i),cs(i.parentNode,o)):null}function hs(e,t,n,r,o){var i,a=r[o?"startContainer":"endContainer"],u=r[o?"startOffset":"endOffset"],s=[],c=0,l=e.getRoot();for(Vn(a)?s.push(n?function(e,t,n){for(var r=e(t.data.slice(0,n)).length,o=t.previousSibling;o&&Vn(o);o=o.previousSibling)r+=e(o.data).length;return r}(t,a,u):u):(u>=(i=a.childNodes).length&&i.length&&(c=1,u=Math.max(0,i.length-1)),s.push(e.nodeIndex(i[u],n)+c));a&&a!==l;a=a.parentNode)s.push(e.nodeIndex(a,n));return s}function vs(e,t,n){var r=0;return Nt.each(e.select(t),function(e){if("all"!==e.getAttribute("data-mce-bogus"))return e!==n&&void r++}),r}function bs(e,t){var n,r=t?"start":"end",o=e[r+"Container"],i=e[r+"Offset"];Hn(o)&&"TR"===o.nodeName&&(o=(n=o.childNodes)[Math.min(t?i:i-1,n.length-1)])&&(i=t?0:o.childNodes.length,e["set"+(t?"Start":"End")](o,i))}function ys(e){return bs(e,!0),bs(e,!1),e}function Cs(e,t){var n;return Hn(e)&&(e=Iu(e,t),pc(e))?e:Mr(e)?(n=(e=Vn(e)&&Lr(e)?e.parentNode:e).previousSibling,pc(n)?n:(n=e.nextSibling,pc(n)?n:void 0)):void 0}function xs(e,t,n){var r=n.getNode(),o=r?r.nodeName:null,i=n.getRng();if(pc(r)||"IMG"===o)return{name:o,index:vs(n.dom,o,r)};var a,u,s,c,l,f,d,m=Cs((a=i).startContainer,a.startOffset)||Cs(a.endContainer,a.endOffset);return m?{name:o=m.tagName,index:vs(n.dom,o,m)}:(f=(s=n).dom,(d={}).start=hs(f,u=e,c=t,l=i,!0),s.isCollapsed()||(d.end=hs(f,u,c,l,!1)),jr(l)&&(d.isFakeCaret=!0),d)}function ws(e,t,n){var r={"data-mce-type":"bookmark",id:t,style:"overflow:hidden;line-height:0px"};return n?e.create("span",r,""):e.create("span",r)}function Ss(e,t){var n=e.dom,r=e.getRng(),o=n.uniqueId(),i=e.isCollapsed(),a=e.getNode(),u=a.nodeName;if("IMG"===u)return{name:u,index:vs(n,u,a)};var s=ys(r.cloneRange());return i||(s.collapse(!1),fs(n,s,ws(n,o+"_end",t))),(r=ys(r)).collapse(!0),fs(n,r,ws(n,o+"_start",t)),e.moveToBookmark({id:o,keep:!0}),{id:o}}function Ns(e,t,n){var r=e.getParam(t,n);return-1===r.indexOf("=")?r:ue(e.getParam(t,"","hash"),e.id).getOr(n)}function Es(e){return e.getParam("content_security_policy","")}function ks(e){if(e.getParam("force_p_newlines",!1))return"p";var t=e.getParam("forced_root_block","p");return!1===t?"":!0===t?"p":t}function _s(e){return e.getParam("forced_root_block_attrs",{})}function As(e){return e.getParam("automatic_uploads",!0,"boolean")}function Rs(e){return e.getParam("icons","","string")}function Ds(e){return e.getParam("referrer_policy","","string")}function Ts(e){return e.getParam("language","en","string")}function Os(e){return e.getParam("indent_use_margin",!1)}function Bs(e){var t=e.getParam("font_css",[]);return S(t)?t:A(t.split(","),Je)}function Ps(e){var t=e.getParam("object_resizing");return!1!==t&&!xt.iOS&&(X(t)?t:"table,img,figure.image,div,video,iframe")}function Ls(e){return e.getParam("event_root")}function Is(e){return e.getParam("theme")}function Ms(e){return!1!==e.getParam("inline_boundaries")}function Fs(e){return e.getParam("plugins","","string")}function Us(e){var t=e.parentNode;t&&t.removeChild(e)}function zs(e){var t=Eo(e);return{count:e.length-t.length,text:t}}function Hs(e){for(var t;-1!==(t=e.data.lastIndexOf(So));)e.deleteData(t,1)}function js(e,t){return Cc(e),t}function Vs(e,t){var n,r=t.container(),o=(-1===(n=_(xe(r.childNodes),e))?ve.none():ve.some(n)).map(function(e){return e<t.offset()?cs(r,t.offset()-1):t}).getOr(t);return Cc(e),o}function qs(e,t){return cs.isTextPosition(t)?(r=t,yc(n=e)&&r.container()===n?(a=zs((o=n).data.substr(0,(i=r).offset())),u=zs(o.data.substr(i.offset())),0<(a.text+u.text).length?(Hs(o),cs(o,i.offset()-a.count)):i):js(n,r)):(s=e,((c=t).container()===s.parentNode?Vs:js)(s,c));var n,r,o,i,a,u,s,c}function $s(e,t,n){var r,o,i,a=Du(t.getBoundingClientRect(),n),u="BODY"===e.tagName?(r=e.ownerDocument.documentElement,o=e.scrollLeft||r.scrollLeft,e.scrollTop||r.scrollTop):(i=e.getBoundingClientRect(),o=e.scrollLeft-i.left,e.scrollTop-i.top);a.left+=o,a.right+=o,a.top+=u,a.bottom+=u,a.width=1;var s=t.offsetWidth-t.clientWidth;return 0<s&&(n&&(s*=-1),a.left+=s,a.right+=s),a}function Ws(e,i,a,u){function s(){!function(){for(var e=yu(Et.fromDom(i),"*[contentEditable=false],video,audio,embed,object"),t=0;t<e.length;t++){var n,r=e[t].dom,o=r.previousSibling;Ro(o)&&(1===(n=o.data).length?o.parentNode.removeChild(o):o.deleteData(n.length-1,1)),o=r.nextSibling,Ao(o)&&(1===(n=o.data).length?o.parentNode.removeChild(o):o.deleteData(0,1))}}(),l&&(Cc(l),l=null),f.on(function(e){Ya(e.caret).remove(),f.clear()}),c&&(Ar.clearInterval(c),c=void 0)}var c,l,f=du(),t=ks(e),d=0<t.length?t:"p";return{show:function(e,t){var n;if(s(),Nc(t))return null;if(!a(t))return l=function(e,t){var n=e.ownerDocument.createTextNode(So),r=e.parentNode;if(t){if(o=e.previousSibling,_o(o)){if(Mr(o))return o;if(Ro(o))return o.splitText(o.data.length-1)}r.insertBefore(n,e)}else{var o=e.nextSibling;if(_o(o)){if(Mr(o))return o;if(Ao(o))return o.splitText(1),o}e.nextSibling?r.insertBefore(n,e.nextSibling):r.appendChild(n)}return n}(t,e),n=t.ownerDocument.createRange(),Ec(l.nextSibling)?(n.setStart(l,0),n.setEnd(l,0)):(n.setStart(l,1),n.setEnd(l,1)),n;l=function(e,t,n){var r,o=t.ownerDocument.createElement(e);o.setAttribute("data-mce-caret",n?"before":"after"),o.setAttribute("data-mce-bogus","all"),o.appendChild(((r=document.createElement("br")).setAttribute("data-mce-bogus","1"),r));var i=t.parentNode;return n?i.insertBefore(o,t):t.nextSibling?i.insertBefore(o,t.nextSibling):i.appendChild(o),o}(d,t,e);var r=$s(i,t,e);Ya(l).css("top",r.top);var o=Ya('<div class="mce-visual-caret" data-mce-bogus="all"></div>').css(_e({},r)).appendTo(i)[0];return f.set({caret:o,element:t,before:e}),e&&Ya(o).addClass("mce-visual-caret-before"),c=Ar.setInterval(function(){u()?Ya("div.mce-visual-caret",i).toggleClass("mce-visual-caret-hidden"):Ya("div.mce-visual-caret",i).addClass("mce-visual-caret-hidden")},500),(n=t.ownerDocument.createRange()).setStart(l,0),n.setEnd(l,0),n},hide:s,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){f.on(function(e){var t=$s(i,e.element,e.before);Ya(e.caret).css(_e({},t))})},destroy:function(){return Ar.clearInterval(c)}}}function Ks(){return xc.isIE()||xc.isEdge()||xc.isFirefox()}function Xs(e){return Ec(e)||cn(e)&&Ks()}function Ys(e,t){for(var n;n=e(t);)if(!Dc(n))return n;return null}function Gs(e,t,n,r,o){var i=new Dr(e,r),a=kc(e)||Dc(e);if(t<0){if(a&&n(e=Ys(i.prev.bind(i),!0)))return e;for(;e=Ys(i.prev.bind(i),o);)if(n(e))return e}if(0<t){if(a&&n(e=Ys(i.next.bind(i),!0)))return e;for(;e=Ys(i.next.bind(i),o);)if(n(e))return e}return null}function Js(e,t){for(;e&&e!==t;){if(Ac(e))return e;e=e.parentNode}return null}function Qs(e,t,n){return Js(e.container(),n)===Js(t.container(),n)}function Zs(e,t){if(!t)return null;var n=t.container(),r=t.offset();return Tc(n)?n.childNodes[r+e]:null}function ec(e,t){var n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n}function tc(e,t,n){for(var r,o,i=e?"previousSibling":"nextSibling";n&&n!==t;){var a=n[i];if(Rc(a)&&(a=a[i]),kc(a)||_c(a)){if(o=n,Js(a,r=t)===Js(o,r))return a;break}if(Oc(a))break;n=n.parentNode}return null}function nc(e,t,n){var r,o=R(tc,!0,t),i=R(tc,!1,t),a=n.startContainer,u=n.startOffset;if(Lr(a)){var s=(a=Tc(a)?a:a.parentNode).getAttribute("data-mce-caret");if("before"===s&&Xs(r=a.nextSibling))return Bc(r);if("after"===s&&Xs(r=a.previousSibling))return Pc(r)}if(!n.collapsed)return n;if(Vn(a)){if(Rc(a)){if(1===e){if(r=i(a))return Bc(r);if(r=o(a))return Pc(r)}if(-1===e){if(r=o(a))return Pc(r);if(r=i(a))return Bc(r)}return n}if(Ro(a)&&u>=a.data.length-1)return 1===e&&(r=i(a))?Bc(r):n;if(Ao(a)&&u<=1)return-1===e&&(r=o(a))?Pc(r):n;if(u===a.data.length)return(r=i(a))?Bc(r):n;if(0===u)return(r=o(a))?Pc(r):n}return n}function rc(e,t){return ve.from(Zs(e?0:-1,t)).filter(kc)}function oc(e,t,n){var r=nc(e,t,n);return-1===e?cs.fromRangeStart(r):cs.fromRangeEnd(r)}function ic(e){return ve.from(e.getNode()).map(Et.fromDom)}function ac(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function uc(e,t){var n=Qs(e,t);return!(n||!Kn(e.getNode()))||n}cs.fromRangeStart=function(e){return cs(e.startContainer,e.startOffset)},cs.fromRangeEnd=function(e){return cs(e.endContainer,e.endOffset)},cs.after=function(e){return cs(e.parentNode,as(e)+1)},cs.before=function(e){return cs(e.parentNode,as(e))},cs.isAbove=function(e,t){return dn(Q(t.getClientRects()),Z(e.getClientRects()),Ou).getOr(!1)},cs.isBelow=function(e,t){return dn(Z(t.getClientRects()),Q(e.getClientRects()),Bu).getOr(!1)},cs.isAtStart=function(e){return!!e&&e.isAtStart()},cs.isAtEnd=function(e){return!!e&&e.isAtEnd()},cs.isTextPosition=function(e){return!!e&&Vn(e.container())},cs.isElementPosition=function(e){return!1===cs.isTextPosition(e)};var sc,cc,lc=Vn,fc=sn,dc=eu.nodeIndex,mc=function(e){var t=e.parentNode;return fc(t)?mc(t):t},gc=function(e){return e?me(e.childNodes,function(e,t){return fc(t)&&"BR"!==t.nodeName?e=e.concat(gc(t)):e.push(t),e},[]):[]},pc=Gn,hc=R(xs,u,!0),vc=eu.DOM,bc=Hn,yc=Vn,Cc=function(e){bc(e)&&Mr(e)&&(Fr(e)?e.removeAttribute("data-mce-caret"):Us(e)),yc(e)&&(Hs(e),0===e.data.length&&Us(e))},xc=dt().browser,wc=Gn,Sc=Qn,Nc=Jn,Ec=function(e){return wc(e)||Sc(e)},kc=Gn,_c=Qn,Ac=an("display","block table table-cell table-caption list-item"),Rc=Mr,Dc=Lr,Tc=Hn,Oc=Vr,Bc=R(ec,!0),Pc=R(ec,!1);function Lc(e,t){return e.hasChildNodes()&&t<e.childNodes.length?e.childNodes[t]:null}function Ic(e,t){if(0<e){if(Gl(t.previousSibling)&&!Kl(t.previousSibling))return cs.before(t);if(Kl(t))return cs(t,0)}if(e<0){if(Gl(t.nextSibling)&&!Kl(t.nextSibling))return cs.after(t);if(Kl(t))return cs(t,t.data.length)}return e<0&&!Yl(t)?cs.after(t):cs.before(t)}function Mc(t){return{next:function(e){return Ql(sc.Forwards,e,t)},prev:function(e){return Ql(sc.Backwards,e,t)}}}function Fc(e){return cs.isTextPosition(e)?0===e.offset():Vr(e.getNode())}function Uc(e){if(cs.isTextPosition(e)){var t=e.container();return e.offset()===t.data.length}return Vr(e.getNode(!0))}function zc(e,t){return!cs.isTextPosition(e)&&!cs.isTextPosition(t)&&e.getNode()===t.getNode(!0)}function Hc(o,i,a){return Zl(o,i,a).bind(function(e){return Qs(a,e,i)&&(t=a,n=e,o?!zc(t,n)&&(cs.isTextPosition(r=t)||!Kn(r.getNode()))&&Uc(t)&&Fc(n):!zc(n,t)&&Fc(t)&&Uc(n))?Zl(o,i,e):ve.some(e);var t,n,r})}function jc(e,t){var n,r,o,i,a,u=e?t.firstChild:t.lastChild;return Vn(u)?ve.some(cs(u,e?0:u.data.length)):u?Vr(u)?ve.some(e?cs.before(u):Kn(a=u)?cs.before(a):cs.after(a)):(r=t,o=u,i=(n=e)?cs.before(o):cs.after(o),Zl(n,r,i)):ve.none()}function Vc(e){return Hn(e)&&e.id===af}function qc(e,t){for(;t&&t!==e;){if(t.id===af)return t;t=t.parentNode}return null}function $c(e){return Nt.isArray(e.start)}function Wc(e,t){return Hn(t)&&e.isBlock(t)&&!t.innerHTML&&!xt.ie&&(t.innerHTML='<br data-mce-bogus="1" />'),t}function Kc(e,t,n){return!1===t.hasChildNodes()&&qc(e,t)&&(o=n,i=(r=t).ownerDocument.createTextNode(So),r.appendChild(i),o.setStart(i,0),o.setEnd(i,0),1);var r,o,i}function Xc(e,t,n,r){var o,i,a,u,s=n[t?"start":"end"],c=e.getRoot();if(s){for(a=s[0],i=c,o=s.length-1;1<=o;o--){if(u=i.childNodes,Kc(c,i,r))return 1;if(s[o]>u.length-1)return Kc(c,i,r)||function(t){return of(i).fold(D,function(e){return t.setStart(e.container(),e.offset()),t.setEnd(e.container(),e.offset()),!0})}(r);i=u[s[o]]}3===i.nodeType&&(a=Math.min(s[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(s[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return 1}function Yc(e){return Vn(e)&&0<e.data.length}function Gc(e,t,n){var r,o,i,a,u,s,c=e.get(n.id+"_"+t),l=n.keep;if(c){if(r=c.parentNode,o="start"===t?l?c.hasChildNodes()?(r=c.firstChild,1):Yc(c.nextSibling)?(r=c.nextSibling,0):Yc(c.previousSibling)?(r=c.previousSibling,c.previousSibling.data.length):(r=c.parentNode,e.nodeIndex(c)+1):e.nodeIndex(c):l?c.hasChildNodes()?(r=c.firstChild,1):Yc(c.previousSibling)?(r=c.previousSibling,c.previousSibling.data.length):(r=c.parentNode,e.nodeIndex(c)):e.nodeIndex(c),u=r,s=o,!l){for(a=c.previousSibling,i=c.nextSibling,Nt.each(Nt.grep(c.childNodes),function(e){Vn(e)&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))});c=e.get(n.id+"_"+t);)e.remove(c,!0);a&&i&&a.nodeType===i.nodeType&&Vn(a)&&!xt.opera&&(o=a.nodeValue.length,a.appendData(i.nodeValue),e.remove(i),u=a,s=o)}return ve.some(cs(u,s))}return ve.none()}function Jc(t,e){!function(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g=e.dom;if(t){if($c(t))return d=t,m=(f=g).createRng(),Xc(f,!0,d,m)&&Xc(f,!1,d,m)?ve.some(m):ve.none();if(X(t.start))return ve.some((s=t,c=(u=g).createRng(),l=ps(u.getRoot(),s.start),c.setStart(l.container(),l.offset()),l=ps(u.getRoot(),s.end),c.setEnd(l.container(),l.offset()),c));if(Ee(t,"id"))return dn(a=Gc(o=g,"start",i=t),Gc(o,"end",i).or(a),function(e,t){var n=o.createRng();return n.setStart(Wc(o,e.container()),e.offset()),n.setEnd(Wc(o,t.container()),t.offset()),n});if(Ee(t,"name"))return n=g,ve.from(n.select((r=t).name)[r.index]).map(function(e){var t=n.createRng();return t.selectNode(e),t});if(Ee(t,"rng"))return ve.some(t.rng)}return ve.none()}(t,e).each(function(e){t.setRng(e)})}function Qc(e){return Hn(e)&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")}function Zc(e){return""!==e&&-1!==" \f\n\r\t\v".indexOf(e)}function el(e){return!Zc(e)&&!sf(e)}function tl(e){return e.nodeType}function nl(e,t,n){var r,o=n.startOffset,i=n.startContainer;if((i!==n.endContainer||!(r=i.childNodes[o])||!/^(IMG)$/.test(r.nodeName))&&Hn(i)){var a=i.childNodes,u=void 0;o<a.length?(i=a[o],u=new Dr(i,e.getParent(i,e.isBlock))):(i=a[a.length-1],(u=new Dr(i,e.getParent(i,e.isBlock))).next(!0));for(var s=u.current();s;s=u.next())if(Vn(s)&&!cf(s))return n.setStart(s,0),t.setRng(n),0}}function rl(e,t,n){if(e){var r=t?"nextSibling":"previousSibling";for(e=n?e:e[r];e;e=e[r])if(Hn(e)||!cf(e))return e}}function ol(e,t){return tl(t)&&(t=t.nodeName),!!e.schema.getTextBlockElements()[t.toLowerCase()]}function il(e,t,n){return e.schema.isValidChild(t,n)}function al(e,n){return y(e)?e=e(n):V(n)&&(e=e.replace(/%(\w+)/g,function(e,t){return n[t]||e})),e}function ul(e,t){return e=""+((e=e||"").nodeName||e),t=""+((t=t||"").nodeName||t),e.toLowerCase()===t.toLowerCase()}function sl(e,t,n){return"color"!==n&&"backgroundColor"!==n||(t=e.toHex(t)),"fontWeight"===n&&700===t&&(t="bold"),""+("fontFamily"===n?t.replace(/[\'\"]/g,"").replace(/,\s+/g,","):t)}function cl(e,t,n){return sl(e,e.getStyle(t,n),n)}function ll(t,e){var n;return t.getParent(e,function(e){return(n=t.getStyle(e,"text-decoration"))&&"none"!==n}),n}function fl(e,t,n){return e.getParents(t,n,e.getRoot())}function dl(e,t){return F(e.formatter.get(t),function(t){function o(e){return 1<e.length&&"%"===e.charAt(0)}return F(["styles","attributes"],function(e){return ue(t,e).exists(function(e){var n,r;return F(S(e)?e:(n=u,r=[],ne(e,function(e,t){r.push(n(e,t))}),r),o)})})})}function ml(e){return se(e,"block")}function gl(e){return se(e,"selector")}function pl(e){return se(e,"inline")}function hl(e){return gl(e)&&!1!==e.expand&&!pl(e)}function vl(e,t){for(var n=t;n;){if(Hn(n)&&e.getContentEditable(n))return"false"===e.getContentEditable(n)?n:t;n=n.parentNode}return t}function bl(e,t,n,r){for(var o=t.data,i=n;e?0<=i:i<o.length;e?i--:i++)if(r(o.charAt(i)))return e?i+1:i;return-1}function yl(e,t,n){return bl(e,t,n,function(e){return sf(e)||Zc(e)})}function Cl(e,t,n){return bl(e,t,n,el)}function xl(i,e,t,n,a,r){function o(e,t,n){var r=Au(i),o=a?r.backwards:r.forwards;return ve.from(o(e,t,function(e,t){return lf(e.parentNode)?-1:n(a,u=e,t)},s))}var u,s=i.getParent(t,i.isBlock)||e;return o(t,n,yl).bind(function(e){return r?o(e.container,e.offset+(a?-1:0),Cl):ve.some(e)}).orThunk(function(){return u?ve.some({container:u,offset:a?0:u.length}):ve.none()})}function wl(e,t,n,r,o){Vn(r)&&Pe(r.data)&&r[o]&&(r=r[o]);for(var i=ff(e,r),a=0;a<i.length;a++)for(var u=0;u<t.length;u++){var s=t[u];if((!V(s.collapsed)||s.collapsed===n.collapsed)&&gl(s)&&e.is(i[a],s.selector))return i[a]}return r}function Sl(t,e,n,r){var o,i=n,a=t.dom,u=a.getRoot(),s=e[0];if((i=ml(s)?s.wrapper?null:a.getParent(n,s.block,u):i)||(o=a.getParent(n,"LI,TD,TH"),i=a.getParent(Vn(n)?n.parentNode:n,function(e){return e!==u&&mf(t,e)},o)),!(i=i&&ml(s)&&s.wrapper&&ff(a,i,"ul,ol").reverse()[0]||i))for(i=n;i[r]&&!a.isBlock(i[r])&&!ul(i=i[r],"br"););return i||n}function Nl(e,t,n,r,o){var i,a=n,u=o?"previousSibling":"nextSibling",s=e.getRoot();if(Vn(n)&&!df(n)&&(o?0<r:r<n.data.length))return n;for(;;){if(!t[0].block_expand&&e.isBlock(a))return a;for(var c=a[u];c;c=c[u]){var l=Vn(c)&&!gf(e,s,c,u);if(!lf(c)&&(!Kn(i=c)||!i.getAttribute("data-mce-bogus")||i.nextSibling)&&!df(c,l))return a}if(a===s||a.parentNode===s){n=a;break}a=a.parentNode}return n}function El(e){return lf(e.parentNode)||lf(e)}function kl(e,t,n,r){void 0===r&&(r=!1);var o=t.startContainer,i=t.startOffset,a=t.endContainer,u=t.endOffset,s=e.dom,c=n[0];return Hn(o)&&o.hasChildNodes()&&(o=Iu(o,i),Vn(o)&&(i=0)),Hn(a)&&a.hasChildNodes()&&(a=Iu(a,t.collapsed?u:u-1),Vn(a)&&(u=a.nodeValue.length)),o=vl(s,o),a=vl(s,a),El(o)&&(o=lf(o)?o:o.parentNode,o=t.collapsed?o.previousSibling||o:o.nextSibling||o,Vn(o)&&(i=t.collapsed?o.length:0)),El(a)&&(a=lf(a)?a:a.parentNode,a=t.collapsed?a.nextSibling||a:a.previousSibling||a,Vn(a)&&(u=t.collapsed?0:a.length)),t.collapsed&&(xl(s,e.getBody(),o,i,!0,r).each(function(e){var t=e.container,n=e.offset;o=t,i=n}),xl(s,e.getBody(),a,u,!1,r).each(function(e){var t=e.container,n=e.offset;a=t,u=n})),(pl(c)||c.block_expand)&&(pl(c)&&Vn(o)&&0!==i||(o=Nl(s,n,o,i,!0)),pl(c)&&Vn(a)&&u!==a.nodeValue.length||(a=Nl(s,n,a,u,!1))),hl(c)&&(o=wl(s,n,t,o,"previousSibling"),a=wl(s,n,t,a,"nextSibling")),(ml(c)||gl(c))&&(o=Sl(e,n,o,"previousSibling"),a=Sl(e,n,a,"nextSibling"),ml(c)&&(s.isBlock(o)||(o=Nl(s,n,o,i,!0)),s.isBlock(a)||(a=Nl(s,n,a,u,!1)))),Hn(o)&&(i=s.nodeIndex(o),o=o.parentNode),Hn(a)&&(u=s.nodeIndex(a)+1,a=a.parentNode),{startContainer:o,startOffset:i,endContainer:a,endOffset:u}}function _l(n,e,u){function s(e){var t=e[0];Vn(t)&&t===i&&o>=t.data.length&&e.splice(0,1);var n=e[e.length-1];return 0===a&&0<e.length&&n===l&&Vn(n)&&e.splice(e.length-1,1),e}function c(e,t,n){for(var r=[];e&&e!==n;e=e[t])r.push(e);return r}function t(e,t){return n.getParent(e,function(e){return e.parentNode===t},t)}function r(e,t,n){var r=n?"nextSibling":"previousSibling",o=e;for(o.parentNode;o&&o!==t;o=i){var i=o.parentNode,a=c(o===e?o:o[r],r);a.length&&(n||a.reverse(),u(s(a)))}}var o=e.startOffset,i=Iu(e.startContainer,o),a=e.endOffset,l=Iu(e.endContainer,a-1);if(i===l)return u(s([i]));var f=n.findCommonAncestor(i,l);if(n.isChildOf(i,l))return r(i,f,!0);if(n.isChildOf(l,i))return r(l,f);var d=t(i,f)||i,m=t(l,f)||l;r(i,d,!0);var g=c(d===i?d:d.nextSibling,"nextSibling",m===l?m.nextSibling:m);g.length&&u(s(g)),r(l,m)}function Al(e){var t=[];if(e)for(var n=0;n<e.rangeCount;n++)t.push(e.getRangeAt(n));return t}function Rl(e,t){var n=yu(t,"td[data-mce-selected],th[data-mce-selected]");return 0<n.length?n:U(H(e,function(e){var t=Lu(e);return t?[Et.fromDom(t)]:[]}),yo)}function Dl(e){return Rl(Al(e.selection.getSel()),Et.fromDom(e.getBody()))}function Tl(e,t){return vr(e,"table",t)}function Ol(o,e){return dn((r=e.startContainer,i=e.startOffset,Vn(r)?0===i?ve.some(Et.fromDom(r)):ve.none():ve.from(r.childNodes[i]).map(Et.fromDom)),(t=e.endContainer,n=e.endOffset,Vn(t)?n===t.data.length?ve.some(Et.fromDom(t)):ve.none():ve.from(t.childNodes[n-1]).map(Et.fromDom)),function(e,t){var n=M(pf(o),R(je,e)),r=M(hf(o),R(je,t));return n.isSome()&&r.isSome()}).getOr(!1);var t,n,r,i}function Bl(e,t,n,r){var o=n,i=new Dr(n,o),a=ae(e.schema.getMoveCaretBeforeOnEnterElements(),function(e,t){return!T(["td","th","table"],t.toLowerCase())});do{if(Vn(n)&&0!==Nt.trim(n.nodeValue).length)return r?t.setStart(n,0):t.setEnd(n,n.nodeValue.length),0;if(a[n.nodeName])return r?t.setStartBefore(n):"BR"===n.nodeName?t.setEndBefore(n):t.setEndAfter(n),0}while(n=r?i.next():i.prev());"BODY"===o.nodeName&&(r?t.setStart(o,0):t.setEnd(o,o.childNodes.length))}function Pl(e){var t=e.selection.getSel();return t&&0<t.rangeCount}function Ll(r,o){var e=Dl(r);0<e.length?Y(e,function(e){var t=e.dom,n=r.dom.createRng();n.setStartBefore(t),n.setEndAfter(t),o(n,!0)}):o(r.selection.getRng(),!1)}function Il(e,t,n){var r=Ss(e,t);n(r),e.moveToBookmark(r)}function Ml(e){return vf.get(e)}function Fl(e,t,n,r){var o=t.uid,i=void 0===o?wu("mce-annotation"):o,a=function(e,t){var n={};for(o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(n[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var r=0,o=Object.getOwnPropertySymbols(e);r<o.length;r++)t.indexOf(o[r])<0&&Object.prototype.propertyIsEnumerable.call(e,o[r])&&(n[o[r]]=e[o[r]]);return n}(t,["uid"]),u=Et.fromTag("span",e);vu(u,$u()),pn(u,""+Ku(),i),pn(u,""+Wu(),n);var s,c=r(i,a),l=c.attributes,f=c.classes,d=void 0===f?[]:f;return hn(u,void 0===l?{}:l),s=u,Y(d,function(e){vu(s,e)}),u}function Ul(u,e,t,n,r){function s(){d.clear()}function c(e){Y(e,o)}var l=[],f=Fl(u.getDoc(),r,t,n),d=du(),o=function(e){var t,n,r,o,i,a;switch(r=u,i="span",a=kt(o=e),Ot(o).fold(function(){return"skipping"},function(e){return"br"===a||An(n=o)&&Ml(n)===So?"valid":_n(t=o)&&bu(t,$u())?"existing":Vc(o.dom)?"caret":il(r,i,a)&&il(r,kt(e),i)?"valid":"invalid-child";var t,n})){case"invalid-child":s(),c(Tn(e)),s();break;case"valid":qt(t=e,n=d.get().getOrThunk(function(){var e=Eu(f);return l.push(e),d.set(e),e})),Ln(n,t)}};return _l(u.dom,e,function(e){s(),c(A(e,Et.fromDom))}),l}function zl(o){var n,e,r,i=(n={},{register:function(e,t){n[e]={name:e,settings:t}},lookup:function(e){return ue(n,e).map(function(e){return e.settings})}});r=i,(e=o).on("init",function(){e.serializer.addNodeFilter("span",function(e){Y(e,function(t){ve.from(t.attr(Wu())).bind(r.lookup).each(function(e){!1===e.persistent&&t.unwrap()})})})});var a=xu(o);return{register:function(e,t){i.register(e,t)},annotate:function(t,n){i.lookup(t).each(function(e){var u,s,c,l;s=t,c=e,l=n,(u=o).undoManager.transact(function(){var e,t,n,r,o=u.selection,i=o.getRng(),a=0<Dl(u).length;i.collapsed&&!a&&(n=kl(e=u,t=i,[{inline:"span"}]),t.setStart(n.startContainer,n.startOffset),t.setEnd(n.endContainer,n.endOffset),e.selection.setRng(t)),o.getRng().collapsed&&!a?(Su(r=Fl(u.getDoc(),l,s,c.decorate),wo),o.getRng().insertNode(r.dom),o.select(r.dom)):Il(o,!1,function(){Ll(u,function(e){Ul(u,e,s,c.decorate,l)})})})})},annotationChanged:function(e,t){a.addListener(e,t)},remove:function(e){Cu(o,ve.some(e)).each(function(e){Y(e.elements,Yt)})},getAll:function(e){var t,n,r;return re((t=e,n=yu(Et.fromDom(o.getBody()),"["+Wu()+'="'+t+'"]'),r={},Y(n,function(e){var t=vn(e,Ku()),n=ue(r,t).getOr([]);r[t]=n.concat([e])}),r),function(e){return A(e,function(e){return e.dom})})}}}function Hl(e){return{getBookmark:R(uf,e),moveToBookmark:R(Jc,e)}}(cc=sc=sc||{})[cc.Backwards=-1]="Backwards",cc[cc.Forwards=1]="Forwards";function jl(e){return Lo(e)||!!Fo(t=e)&&!0!==L(xe(t.getElementsByTagName("*")),function(e,t){return e||Do(t)},!1);var t}var Vl,ql,$l,Wl=Gn,Kl=Vn,Xl=Hn,Yl=Kn,Gl=Vr,Jl=qr,Ql=function(e,t,n){var r,o,i;if(!Xl(n)||!t)return null;if(t.isEqual(cs.after(n))&&n.lastChild){if(i=cs.after(n.lastChild),e<0&&Gl(n.lastChild)&&Xl(n.lastChild))return Yl(n.lastChild)?cs.before(n.lastChild):i}else i=t;var a,u,s,c=i.container(),l=i.offset();if(Kl(c)){if(e<0&&0<l)return cs(c,--l);if(0<e&&l<c.length)return cs(c,++l);r=c}else{if(e<0&&0<l&&(f=Lc(c,l-1),Gl(f)))return!jl(f)&&(o=Gs(f,e,Jl,f))?Kl(o)?cs(o,o.data.length):cs.after(o):Kl(f)?cs(f,f.data.length):cs.before(f);if(0<e&&l<c.childNodes.length&&(f=Lc(c,l),Gl(f)))return Yl(f)?(a=n,(s=(u=f).nextSibling)&&Gl(s)?Kl(s)?cs(s,0):cs.before(s):Ql(sc.Forwards,cs.after(u),a)):!jl(f)&&(o=Gs(f,e,Jl,f))?Kl(o)?cs(o,0):cs.before(o):Kl(f)?cs(f,0):cs.after(f);r=f||i.getNode()}if((0<e&&i.isAtEnd()||e<0&&i.isAtStart())&&(r=Gs(r,e,w,n,!0),Jl(r,n)))return Ic(e,r);var f=Gs(r,e,Jl,n),d=pe(U(function(e,t){for(var n=[];e&&e!==t;)n.push(e),e=e.parentNode;return n}(c,n),Wl));return!d||f&&d.contains(f)?f?Ic(e,f):null:0<e?cs.after(d):cs.before(d)},Zl=function(e,t,n){var r=Mc(t);return ve.from(e?r.next(n):r.prev(n))},ef=function(t,n,e,r){return Hc(t,n,e).bind(function(e){return r(e)?ef(t,n,e,r):ve.some(e)})},tf=R(Zl,!0),nf=R(Zl,!1),rf=R(jc,!0),of=R(jc,!1),af="_mce_caret",uf=function(e,t,n){return 2===t?xs(Eo,n,e):3===t?(o=(r=e).getRng(),{start:gs(r.dom.getRoot(),cs.fromRangeStart(o)),end:gs(r.dom.getRoot(),cs.fromRangeEnd(o))}):t?{rng:e.getRng()}:Ss(e,!1);var r,o},sf=(Vl=wo,function(e){return Vl===e}),cf=function(e,t){return void 0===t&&(t=!1),!(!V(e)||!Vn(e))&&$r(t?e.data.replace(/ /g,"\xa0"):e.data)},lf=Qc,ff=fl,df=cf,mf=ol,gf=function(e,t,n,r){var o=n.parentNode;return!V(n[r])&&(!(o!==t&&!K(o)&&!e.isBlock(o))||gf(e,t,o,r))},pf=function(t){return Ft(t).fold(J([t]),function(e){return[t].concat(pf(e))})},hf=function(t){return Ut(t).fold(J([t]),function(e){return"br"===kt(e)?Bt(e).map(function(e){return[t].concat(hf(e))}).getOr([]):[t].concat(hf(e))})},vf=(ql=An,{get:function(e){if(!ql(e))throw new Error("Can only get text value of a text node");return $l(e).getOr("")},getOption:$l=function(e){return ql(e)?ve.from(e.dom.nodeValue):ve.none()},set:function(e,t){if(!ql(e))throw new Error("Can only set raw text value of a text node");e.dom.nodeValue=t}});function bf(e,t){for(;t&&t!==e;){if(Yn(t)||Gn(t))return t;t=t.parentNode}return null}function yf(t,n,e){if(!e.collapsed){if(xt.browser.isIE()&&e.startOffset===e.endOffset-1&&e.startContainer===e.endContainer){var r=e.startContainer.childNodes[e.startOffset];if(Hn(r))return F(r.getClientRects(),function(e){return Pu(e,t,n)})}return F(e.getClientRects(),function(e){return Pu(e,t,n)})}}function Cf(e,t,n){return e.fire(t,n)}function xf(e,t,n,r){return e.fire("FormatApply",{format:t,node:n,vars:r})}function wf(e,t,n,r){return e.fire("FormatRemove",{format:t,node:n,vars:r})}function Sf(r,l){function c(e){return e&&("IMG"===e.nodeName||l.dom.is(e,"figure.image"))}function f(e){return Qn(e)||T.hasClass(e,"mce-preview-object")}function n(e){var t=e.target;!function(e,t){if("longpress"!==e.type&&0!==e.type.indexOf("touch"))return c(e.target)&&!yf(e.clientX,e.clientY,t);var n=e.touches[0];return c(e.target)&&!yf(n.clientX,n.clientY,t)}(e,l.selection.getRng())||e.isDefaultPrevented()||l.selection.select(t)}function d(e){return T.is(e,"figure.image")?[e.querySelector("img")]:T.hasClass(e,"mce-preview-object")&&V(e.firstElementChild)?[e,e.firstElementChild]:[e]}function i(e){var t=Ps(l);return!!t&&"false"!==e.getAttribute("data-mce-resize")&&e!==l.getBody()&&(T.hasClass(e,"mce-preview-object")?ze(Et.fromDom(e.firstElementChild),t):ze(Et.fromDom(e),t))}function a(e,t,n){V(n)&&Y(d(e),function(e){e.style[t]||!l.schema.isValid(e.nodeName.toLowerCase(),t)?T.setStyle(e,t,n):T.setAttrib(e,t,""+n)})}function m(e,t,n){a(e,"width",t),a(e,"height",n)}function g(e){var t,n,r,o,i,a,u=e.screenX-C,s=e.screenY-x;k=u*b[2]+w,_=s*b[3]+S,k=k<5?5:k,_=_<5?5:_,((c(p)||f(p))&&!1!==l.getParam("resize_img_proportional",!0,"boolean")?!If.modifierPressed(e):If.modifierPressed(e))&&(L(u)>L(s)?(_=I(k*N),k=I(_/N)):(k=I(_/N),_=I(k*N))),m(h,k,_),t=b.startPos.x+u,n=b.startPos.y+s,T.setStyles(v,{left:t=0<t?t:0,top:n=0<n?n:0,display:"block"}),v.innerHTML=k+" × "+_,b[2]<0&&h.clientWidth<=k&&T.setStyle(h,"left",void 0+(w-k)),b[3]<0&&h.clientHeight<=_&&T.setStyle(h,"top",void 0+(S-_)),(u=M.scrollWidth-A)+(s=M.scrollHeight-R)!=0&&T.setStyles(v,{left:t-u,top:n-s}),E||(r=p,o=w,i=S,a="corner-"+b.name,l.fire("ObjectResizeStart",{target:r,width:o,height:i,origin:a}),E=!0)}function o(e){function t(e,t){if(e)do{if(e===t)return 1}while(e=e.parentNode)}var n;E||l.removed||(O(T.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute(D)}),n="mousedown"===e.type?e.target:r.getNode(),t(n=T.$(n).closest("table,img,figure.image,hr,video,span.mce-preview-object")[0],M)&&(s(),t(r.getStart(!0),n)&&t(r.getEnd(!0),n))?z(n):H())}function u(e){return Mf(bf(l.getBody(),e))}function s(){try{l.getDoc().execCommand("enableObjectResizing",!1,"false")}catch(e){}}var p,h,v,b,y,C,x,w,S,N,E,k,_,A,R,D="data-mce-selected",T=l.dom,O=Nt.each,B=l.getDoc(),P=document,L=Math.abs,I=Math.round,M=l.getBody(),F={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]},U=function(){var e,t,n,r,o=E;E=!1,o&&(a(p,"width",k),a(p,"height",_)),T.unbind(B,"mousemove",g),T.unbind(B,"mouseup",U),P!==B&&(T.unbind(P,"mousemove",g),T.unbind(P,"mouseup",U)),T.remove(h),T.remove(v),T.remove(y),z(p),o&&(e=p,t=k,n=_,r="corner-"+b.name,l.fire("ObjectResized",{target:e,width:t,height:n,origin:r}),T.setAttrib(p,"style",T.getAttrib(p,"style"))),l.nodeChanged()},z=function(e){j();var t=T.getPos(e,M),a=t.x,u=t.y,n=e.getBoundingClientRect(),s=n.width||n.right-n.left,c=n.height||n.bottom-n.top;p!==e&&(H(),p=e,k=_=0);var r=l.fire("ObjectSelected",{target:e}),o=T.getAttrib(p,D,"1");i(e)&&!r.isDefaultPrevented()?O(F,function(o,i){var e=T.get("mceResizeHandle"+i);e&&T.remove(e),e=T.add(M,"div",{id:"mceResizeHandle"+i,"data-mce-bogus":"all",class:"mce-resizehandle",unselectable:!0,style:"cursor:"+i+"-resize; margin:0; padding:0"}),11===xt.ie&&(e.contentEditable=!1),T.bind(e,"mousedown",function(e){var t,n,r;e.stopImmediatePropagation(),e.preventDefault(),t=e,r=d(p)[0],C=t.screenX,x=t.screenY,w=r.clientWidth,S=r.clientHeight,N=S/w,(b=o).name=i,b.startPos={x:s*o[0]+a,y:c*o[1]+u},A=M.scrollWidth,R=M.scrollHeight,y=T.add(M,"div",{class:"mce-resize-backdrop","data-mce-bogus":"all"}),T.setStyles(y,{position:"fixed",left:"0",top:"0",width:"100%",height:"100%"}),h=f(n=p)?T.create("img",{src:xt.transparentSrc}):n.cloneNode(!0),T.addClass(h,"mce-clonedresizable"),T.setAttrib(h,"data-mce-bogus","all"),h.contentEditable="false",T.setStyles(h,{left:a,top:u,margin:0}),m(h,s,c),h.removeAttribute(D),M.appendChild(h),T.bind(B,"mousemove",g),T.bind(B,"mouseup",U),P!==B&&(T.bind(P,"mousemove",g),T.bind(P,"mouseup",U)),v=T.add(M,"div",{class:"mce-resize-helper","data-mce-bogus":"all"},w+" × "+S)}),o.elm=e,T.setStyles(e,{left:s*o[0]+a-e.offsetWidth/2,top:c*o[1]+u-e.offsetHeight/2})}):H(),T.getAttrib(p,D)||p.setAttribute(D,o)},H=function(){j(),p&&p.removeAttribute(D),ne(F,function(e,t){var n=T.get("mceResizeHandle"+t);n&&(T.unbind(n),T.remove(n))})},j=function(){ne(F,function(e){e.elm&&(T.unbind(e.elm),delete e.elm)})};return l.on("init",function(){var e;s(),(xt.browser.isIE()||xt.browser.isEdge())&&(l.on("mousedown click",function(e){var t=e.target,n=t.nodeName;E||!/^(TABLE|IMG|HR)$/.test(n)||u(t)||(2!==e.button&&l.selection.select(t,"TABLE"===n),"mousedown"===e.type&&l.nodeChanged())}),T.bind(M,"mscontrolselect",e=function(e){function t(e){Ar.setEditorTimeout(l,function(){return l.selection.select(e)})}if(u(e.target)||Qn(e.target))return e.preventDefault(),void t(e.target);/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"===e.target.tagName&&t(e.target))}),l.on("remove",function(){return T.unbind(M,"mscontrolselect",e)}));var t=Ar.throttle(function(e){l.composing||o(e)});l.on("NodeChange ResizeEditor ResizeWindow ResizeContent drop",t),l.on("keyup compositionend",function(e){p&&"TABLE"===p.nodeName&&t(e)}),l.on("hide blur",H),l.on("contextmenu longpress",n,!0)}),l.on("remove",j),{isResizable:i,showResizeRect:z,hideResizeRect:H,updateResizeRect:o,destroy:function(){p=h=y=null}}}function Nf(e){return Yn(e)||Gn(e)}function Ef(t,n,r){var o,e,i,a,u,s=r;if(s.caretPositionFromPoint)(e=s.caretPositionFromPoint(t,n))&&((o=r.createRange()).setStart(e.offsetNode,e.offset),o.collapse(!0));else if(s.caretRangeFromPoint)o=s.caretRangeFromPoint(t,n);else if(s.body.createTextRange){o=s.body.createTextRange();try{o.moveToPoint(t,n),o.collapse(!0)}catch(e){o=function(e,n,t){var r,o=t.elementFromPoint(e,n),i=t.body.createTextRange();if(o&&"HTML"!==o.tagName||(o=t.body),i.moveToElementText(o),0<(r=(r=Nt.toArray(i.getClientRects())).sort(function(e,t){return(e=Math.abs(Math.max(e.top-n,e.bottom-n)))-Math.abs(Math.max(t.top-n,t.bottom-n))})).length){n=(r[0].bottom+r[0].top)/2;try{return i.moveToPoint(e,n),i.collapse(!0),i}catch(e){}}return null}(t,n,r)}return i=o,a=r.body,u=i&&i.parentElement?i.parentElement():null,Gn(function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(u,a,Nf))?null:i}return o}function kf(e,t){return e&&t&&e.startContainer===t.startContainer&&e.startOffset===t.startOffset&&e.endContainer===t.endContainer&&e.endOffset===t.endOffset}function _f(e,t,n){return null!==function(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}(e,t,n)}function Af(e){return e&&"TABLE"===e.nodeName}function Rf(e,t,n){for(var r=new Dr(t,e.getParent(t.parentNode,e.isBlock)||e.getRoot());t=r[n?"prev":"next"]();)if(Kn(t))return 1}function Df(e,t,n,r,o){var i,a,u=e.getRoot(),s=e.schema.getNonEmptyElements(),c=e.getParent(o.parentNode,e.isBlock)||u;if(r&&Kn(o)&&t&&e.isEmpty(c))return ve.some(cs(o.parentNode,e.nodeIndex(o)));for(var l,f,d=new Dr(o,c);a=d[r?"prev":"next"]();){if("false"===e.getContentEditableParent(a)||(f=u,Mr(l=a)&&!1===_f(l,f,Vc)))return ve.none();if(Vn(a)&&0<a.nodeValue.length)return!1===_f(a,u,function(e){return"A"===e.nodeName})?ve.some(cs(a,r?a.nodeValue.length:0)):ve.none();if(e.isBlock(a)||s[a.nodeName.toLowerCase()])return ve.none();i=a}return n&&i?ve.some(cs(i,0)):ve.none()}function Tf(e,t,n,r){var o,i=e.getRoot(),a=!1,u=r[(n?"start":"end")+"Container"],s=r[(n?"start":"end")+"Offset"],c=Hn(u)&&s===u.childNodes.length,l=e.schema.getNonEmptyElements(),f=n;if(Mr(u))return ve.none();if(Hn(u)&&s>u.childNodes.length-1&&(f=!1),$n(u)&&(u=i,s=0),u===i){if(f&&(d=u.childNodes[0<s?s-1:0])){if(Mr(d))return ve.none();if(l[d.nodeName]||Af(d))return ve.none()}if(u.hasChildNodes()){if(s=Math.min(!f&&0<s?s-1:s,u.childNodes.length-1),u=u.childNodes[s],s=Vn(u)&&c?u.data.length:0,!t&&u===i.lastChild&&Af(u))return ve.none();if(function(e,t){for(;t&&t!==e;){if(Gn(t))return 1;t=t.parentNode}}(i,u)||Mr(u))return ve.none();if(u.hasChildNodes()&&!1===Af(u)){var d=u,m=new Dr(u,i);do{if(Gn(d)||Mr(d)){a=!1;break}if(Vn(d)&&0<d.nodeValue.length){s=f?0:d.nodeValue.length,u=d,a=!0;break}if(l[d.nodeName.toLowerCase()]&&(!(o=d)||!/^(TD|TH|CAPTION)$/.test(o.nodeName))){s=e.nodeIndex(d),u=d.parentNode,f||s++,a=!0;break}}while(d=f?m.next():m.prev())}}}return t&&(Vn(u)&&0===s&&Df(e,c,t,!0,u).each(function(e){u=e.container(),s=e.offset(),a=!0}),Hn(u)&&(!(d=(d=u.childNodes[s])||u.childNodes[s-1])||!Kn(d)||d.previousSibling&&"A"===d.previousSibling.nodeName||Rf(e,d,!1)||Rf(e,d,!0)||Df(e,c,t,!0,d).each(function(e){u=e.container(),s=e.offset(),a=!0}))),f&&!t&&Vn(u)&&s===u.nodeValue.length&&Df(e,c,t,!1,u).each(function(e){u=e.container(),s=e.offset(),a=!0}),a?ve.some(cs(u,s)):ve.none()}function Of(e,t){var n=t.collapsed,r=t.cloneRange(),o=cs.fromRangeStart(t);return Tf(e,n,!0,r).each(function(e){n&&cs.isAbove(o,e)||r.setStart(e.container(),e.offset())}),n||Tf(e,n,!1,r).each(function(e){r.setEnd(e.container(),e.offset())}),n&&r.collapse(!0),kf(t,r)?ve.none():ve.some(r)}function Bf(e,t){return e.splitText(t)}function Pf(e){var t=e.startContainer,n=e.startOffset,r=e.endContainer,o=e.endOffset;return t===r&&Vn(t)?0<n&&n<t.nodeValue.length&&(t=(r=Bf(t,n)).previousSibling,n<o?(t=r=Bf(r,o-=n).previousSibling,o=r.nodeValue.length,n=0):o=0):(Vn(t)&&0<n&&n<t.nodeValue.length&&(t=Bf(t,n),n=0),Vn(r)&&0<o&&o<r.nodeValue.length&&(o=(r=Bf(r,o).previousSibling).nodeValue.length)),{startContainer:t,startOffset:n,endContainer:r,endOffset:o}}function Lf(n){return{walk:function(e,t){return _l(n,e,t)},split:Pf,normalize:function(t){return Of(n,t).fold(D,function(e){return t.setStart(e.startContainer,e.startOffset),t.setEnd(e.endContainer,e.endOffset),!0})}}}Hl.isBookmarkNode=Qc;var If={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,ESC:27,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,modifierPressed:function(e){return e.shiftKey||e.ctrlKey||e.altKey||If.metaKeyPressed(e)},metaKeyPressed:function(e){return xt.mac?e.metaKey:e.ctrlKey&&!e.altKey}},Mf=Gn;Lf.compareRanges=kf,Lf.getCaretRangeFromPoint=Ef,Lf.getSelectedNode=Lu,Lf.getNode=Iu;var Ff,Uf,zf=(Ff="height",Uf=function(e){var t=e.dom;return Mn(e)?t.getBoundingClientRect().height:t.offsetHeight},{set:function(e,t){if(!N(t)&&!t.match(/^[0-9]+$/))throw new Error(Ff+".set accepts only positive integer values. Value was "+t);var n=e.dom;mn(n)&&(n.style[Ff]=t+"px")},get:Hf,getOuter:Hf,aggregate:jf,max:function(e,t,n){var r=jf(e,n);return r<t?t-r:0}});function Hf(e){var t=Uf(e);if(t<=0||null===t){var n=wn(e,Ff);return parseFloat(n)||0}return t}function jf(o,e){return L(e,function(e,t){var n=wn(o,t),r=void 0===n?0:parseInt(n,10);return isNaN(r)?e:e+r},0)}function Vf(e){return"textarea"===kt(e)}function qf(e,t){var n=function(e){var t=e.dom.ownerDocument,n=t.body,r=t.defaultView,o=t.documentElement;if(n===e.dom)return Un(n.offsetLeft,n.offsetTop);var i=Gt(null==r?void 0:r.pageYOffset,o.scrollTop),a=Gt(null==r?void 0:r.pageXOffset,o.scrollLeft),u=Gt(o.clientTop,n.clientTop),s=Gt(o.clientLeft,n.clientLeft);return zn(e).translate(a-s,i-u)}(e),r=zf.get(e);return{element:e,bottom:n.top+r,height:r,pos:n,cleanup:t}}function $f(n,r,o,i){Od(n,function(e,t){return Td(n,r,o,i)},o)}function Wf(e,t,n,r,o){var i={elm:r.element.dom,alignToTop:o};e.fire("ScrollIntoView",i).isDefaultPrevented()||(n(t,Jt(t).top,r,o),e.fire("AfterScrollIntoView",i))}function Kf(e,t,n,r){var o=Et.fromDom(e.getDoc());Wf(e,o,n,qf(Et.fromDom(t),te),r)}function Xf(e,t,n,r){var o,i=e.pos;n?Qt(i.left,i.top,r):(o=i.top-t+e.height,Qt(i.left,o,r))}function Yf(e,t,n,r,o){var i=n+t,a=r.pos.top,u=r.bottom,s=n<=u-a;a<t?Xf(r,n,!1!==o,e):i<a?Xf(r,n,s?!1!==o:!0===o,e):i<u&&!s&&Xf(r,n,!0===o,e)}function Gf(e,t,n,r){Yf(e,t,e.dom.defaultView.innerHeight,n,r)}function Jf(e,t,n,r){Yf(e,t,e.dom.defaultView.innerHeight,n,r);var o,i,a,u,s,c,l,f=(o=n.element,u=Jt(Et.fromDom(document)),a=(i=Dd).owner(o),s=Rd(i,a),c=zn(o),l=P(s,function(e,t){var n=zn(t);return{left:e.left+n.left,top:e.top+n.top}},{left:0,top:0}),Un(l.left+c.left+u.left,l.top+c.top+u.top)),d=tn(window);f.top<d.y?Zt(n.element,!1!==r):f.top>d.bottom&&Zt(n.element,!0===r)}function Qf(e,t,n){return $f(e,Gf,t,n)}function Zf(e,t,n){return Kf(e,t,Gf,n)}function ed(e,t,n){return $f(e,Jf,t,n)}function td(e,t,n){return Kf(e,t,Jf,n)}function nd(e,t,n){(e.inline?Qf:ed)(e,t,n)}function rd(e){var t=Pn(e).dom;return e.dom===t.activeElement}function od(e){return void 0===e&&(e=Et.fromDom(document)),ve.from(e.dom.activeElement).map(Et.fromDom)}function id(e,t){var n=An(t)?Ml(t).length:Tn(t).length+1;return n<e?n:e<0?0:e}function ad(e){return Id.range(e.start,id(e.soffset,e.start),e.finish,id(e.foffset,e.finish))}function ud(e,t){return!rn(t.dom)&&(Ve(e,t)||je(e,t))}function sd(t){return function(e){return ud(t,e.start)&&ud(t,e.finish)}}function cd(e){return!0===e.inline||Md.isIE()}function ld(e){return Id.range(Et.fromDom(e.startContainer),e.startOffset,Et.fromDom(e.endContainer),e.endOffset)}function fd(e){var t=document.createRange();try{return t.setStart(e.start.dom,e.soffset),t.setEnd(e.finish.dom,e.foffset),ve.some(t)}catch(e){return ve.none()}}function dd(e){var t,n,r=cd(e)?(t=Et.fromDom(e.getBody()),((n=Tt(t).dom.getSelection())&&0!==n.rangeCount?ve.from(n.getRangeAt(0)):ve.none()).map(ld).filter(sd(t))):ve.none();e.bookmark=r.isSome()?r:e.bookmark}function md(n){return(n.bookmark||ve.none()).bind(function(e){return t=Et.fromDom(n.getBody()),ve.from(e).filter(sd(t)).map(ad);var t}).bind(fd)}function gd(u){var s=mu(function(){dd(u)},0);u.on("init",function(){function e(){n.throttle()}var t,n,r,o,i,a;u.inline&&(t=u,n=s,eu.DOM.bind(document,"mouseup",e),t.on("remove",function(){eu.DOM.unbind(document,"mouseup",e)})),r=u,o=s,dt().browser.isIE()?(a=r).on("focusout",function(){dd(a)}):(i=o,r.on("mouseup touchend",function(e){i.throttle()})),r.on("keyup NodeChange",function(e){"nodechange"===e.type&&e.selectionChange||dd(r)})}),u.on("remove",function(){s.cancel()})}function pd(t,e){var n=t.getParam("custom_ui_selector","","string");return null!==Ud.getParent(e,function(e){return Fd.isEditorUIElement(e)||!!n&&t.dom.is(e,n)})}function hd(n,e){var t=e.editor;gd(t),t.on("focusin",function(){var e=n.focusedEditor;e!==t&&(e&&e.fire("blur",{focusedEditor:t}),n.setActive(t),(n.focusedEditor=t).fire("focus",{blurredEditor:e}),t.focus(!0))}),t.on("focusout",function(){Ar.setEditorTimeout(t,function(){var e=n.focusedEditor;pd(t,function(e){try{return od(Pn(Et.fromDom(e.getElement()))).fold(function(){return document.body},function(e){return e.dom})}catch(e){return document.body}}(t))||e!==t||(t.fire("blur",{focusedEditor:null}),n.focusedEditor=null)})}),Ad||(Ad=function(e){var t=n.activeEditor;t&&!function(e){if(Bn()&&V(e.target)){var t=Et.fromDom(e.target);if(_n(t)&&V(t.dom.shadowRoot)&&e.composed&&e.composedPath){var n=e.composedPath();if(n)return Q(n)}}return ve.from(e.target)}(e).each(function(e){e.ownerDocument===document&&(e===document.body||pd(t,e)||n.focusedEditor!==t||(t.fire("blur",{focusedEditor:null}),n.focusedEditor=null))})},Ud.bind(document,"focusin",Ad))}function vd(e,t){e.focusedEditor===t.editor&&(e.focusedEditor=null),e.activeEditor||(Ud.unbind(document,"focusin",Ad),Ad=null)}function bd(t,e){var n,r;n=Et.fromDom(t.getBody()),((r=e).collapsed?ve.from(Iu(r.startContainer,r.startOffset)).map(Et.fromDom):ve.none()).bind(function(e){return bo(e)?ve.some(e):!1===Ve(n,e)?ve.some(n):ve.none()}).bind(function(e){return rf(e.dom)}).fold(function(){t.selection.normalize()},function(e){return t.selection.setRng(e.toRange())})}function yd(t){if(t.setActive)try{t.setActive()}catch(e){t.focus()}else t.focus()}function Cd(e){return e.inline?(r=e.getBody())&&(rd(t=Et.fromDom(r))||od(Pn(n=t)).filter(function(e){return n.dom.contains(e.dom)}).isSome()):e.iframeElement&&rd(Et.fromDom(e.iframeElement));var t,n,r}function xd(e,t,n,r,o){var i=n?t.startContainer:t.endContainer,a=n?t.startOffset:t.endOffset;return ve.from(i).map(Et.fromDom).map(function(e){return r&&t.collapsed?e:Mt(e,o(e,a)).getOr(e)}).bind(function(e){return _n(e)?ve.some(e):Ot(e).filter(_n)}).map(function(e){return e.dom}).getOr(e)}function wd(e,t,n){return xd(e,t,!0,n,function(e,t){return Math.min(zt(e),t)})}function Sd(e,t,n){return xd(e,t,!1,n,function(e,t){return 0<t?t-1:t})}function Nd(e,t){for(var n=e;e&&Vn(e)&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n}function Ed(n,e){return A(e,function(e){var t=n.fire("GetSelectionRange",{range:e});return t.range!==e?t.range:e})}function kd(e,t,n){var r=n?"lastChild":"firstChild",o=n?"prev":"next";if(e[r])return e[r];if(e!==t){var i=e[o];if(i)return i;for(var a=e.parent;a&&a!==t;a=a.parent)if(i=a[o])return i}}function _d(e){var t="a"===e.name&&!e.attr("href")&&e.attr("id");return e.attr("name")||e.attr("id")&&!e.firstChild||e.attr("data-mce-bookmark")||t}var Ad,Rd=function(r,e){return r.view(e).fold(J([]),function(e){var t=r.owner(e),n=Rd(r,t);return[e].concat(n)})},Dd=Object.freeze({__proto__:null,view:function(e){var t;return(e.dom===document?ve.none():ve.from(null===(t=e.dom.defaultView)||void 0===t?void 0:t.frameElement)).map(Et.fromDom)},owner:Dt}),Td=function(e,t,n,r){var o=Et.fromDom(e.getBody()),i=Et.fromDom(e.getDoc());o.dom.offsetWidth;var a,u,s,c,l=(a=Et.fromDom(n.startContainer),u=n.startOffset,s=function(e,t){var n=Tn(e);if(0===n.length||Vf(e))return{element:e,offset:t};if(t<n.length&&!Vf(n[t]))return{element:n[t],offset:0};var r=n[n.length-1];return Vf(r)?{element:e,offset:t}:"img"===kt(r)?{element:r,offset:1}:An(r)?{element:r,offset:Ml(r).length}:{element:r,offset:Tn(r).length}}(a,u),c=Et.fromHtml('<span data-mce-bogus="all" style="display: inline-block;">\ufeff</span>'),qt(s.element,c),qf(c,function(){return In(c)}));Wf(e,i,t,l,r),l.cleanup()},Od=function(e,t,n){var r=n.startContainer,o=n.startOffset,i=n.endContainer,a=n.endOffset;t(Et.fromDom(r),Et.fromDom(i));var u=e.dom.createRng();u.setStart(r,o),u.setEnd(i,a),e.selection.setRng(n)},Bd=ir([{before:["element"]},{on:["element","offset"]},{after:["element"]}]),Pd=(Bd.before,Bd.on,Bd.after,function(e){return e.fold(u,u,u)}),Ld=ir([{domRange:["rng"]},{relative:["startSitu","finishSitu"]},{exact:["start","soffset","finish","foffset"]}]),Id={domRange:Ld.domRange,relative:Ld.relative,exact:Ld.exact,exactFromRange:function(e){return Ld.exact(e.start,e.soffset,e.finish,e.foffset)},getWin:function(e){return Tt(e.match({domRange:function(e){return Et.fromDom(e.startContainer)},relative:function(e,t){return Pd(e)},exact:function(e,t,n,r){return e}}))},range:function(e,t,n,r){return{start:e,soffset:t,finish:n,foffset:r}}},Md=dt().browser,Fd={isEditorUIElement:function(e){var t=e.className.toString();return-1!==t.indexOf("tox-")||-1!==t.indexOf("mce-")}},Ud=eu.DOM,zd=function(e){return e.editorManager.setActive(e)},Hd={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},jd=(Vd.create=function(e,t){var n=new Vd(e,Hd[e]||1);return t&&ne(t,function(e,t){n.attr(t,e)}),n},Vd.prototype.replace=function(e){return e.parent&&e.remove(),this.insert(e,this),this.remove(),this},Vd.prototype.attr=function(e,t){var n,r=this;if("string"!=typeof e)return null!=e&&ne(e,function(e,t){r.attr(t,e)}),r;if(n=r.attributes){if(void 0===t)return n.map[e];if(null===t){if(e in n.map){delete n.map[e];for(var o=n.length;o--;)if(n[o].name===e)return n.splice(o,1),r}return r}if(e in n.map){for(o=n.length;o--;)if(n[o].name===e){n[o].value=t;break}}else n.push({name:e,value:t});return n.map[e]=t,r}},Vd.prototype.clone=function(){var e,t=new Vd(this.name,this.type);if(e=this.attributes){var n=[];n.map={};for(var r=0,o=e.length;r<o;r++){var i=e[r];"id"!==i.name&&(n[n.length]={name:i.name,value:i.value},n.map[i.name]=i.value)}t.attributes=n}return t.value=this.value,t.shortEnded=this.shortEnded,t},Vd.prototype.wrap=function(e){return this.parent.insert(e,this),e.append(this),this},Vd.prototype.unwrap=function(){for(var e=this.firstChild;e;){var t=e.next;this.insert(e,this,!0),e=t}this.remove()},Vd.prototype.remove=function(){var e=this.parent,t=this.next,n=this.prev;return e&&(e.firstChild===this?(e.firstChild=t)&&(t.prev=null):n.next=t,e.lastChild===this?(e.lastChild=n)&&(n.next=null):t.prev=n,this.parent=this.next=this.prev=null),this},Vd.prototype.append=function(e){e.parent&&e.remove();var t=this.lastChild;return t?((t.next=e).prev=t,this.lastChild=e):this.lastChild=this.firstChild=e,e.parent=this,e},Vd.prototype.insert=function(e,t,n){e.parent&&e.remove();var r=t.parent||this;return n?(t===r.firstChild?r.firstChild=e:t.prev.next=e,e.prev=t.prev,(e.next=t).prev=e):(t===r.lastChild?r.lastChild=e:t.next.prev=e,e.next=t.next,(e.prev=t).next=e),e.parent=r,e},Vd.prototype.getAll=function(e){for(var t=[],n=this.firstChild;n;n=kd(n,this))n.name===e&&t.push(n);return t},Vd.prototype.children=function(){for(var e=[],t=this.firstChild;t;t=t.next)e.push(t);return e},Vd.prototype.empty=function(){if(this.firstChild){for(var e=[],t=this.firstChild;t;t=kd(t,this))e.push(t);for(var n=e.length;n--;)(t=e[n]).parent=t.firstChild=t.lastChild=t.next=t.prev=null}return this.firstChild=this.lastChild=null,this},Vd.prototype.isEmpty=function(e,t,n){void 0===t&&(t={});var r=this.firstChild;if(_d(this))return!1;if(r)do{if(1===r.type){if(r.attr("data-mce-bogus"))continue;if(e[r.name])return!1;if(_d(r))return!1}if(8===r.type)return!1;if(3===r.type&&!function(e){if($r(e.value)){var t=e.parent;return!t||"span"===t.name&&!t.attr("style")||!/^[ ]+$/.test(e.value)}}(r))return!1;if(3===r.type&&r.parent&&t[r.parent.name]&&$r(r.value))return!1;if(n&&n(r))return!1}while(r=kd(r,this));return!0},Vd.prototype.walk=function(e){return kd(this,null,e)},Vd);function Vd(e,t){this.name=e,1===(this.type=t)&&(this.attributes=[],this.attributes.map={})}function qd(e){return X(e.nodeValue)&&Te(e.nodeValue,So)}function $d(e){return(0===e.length?"":A(e,function(e){return"["+e+"]"}).join(",")+",")+'[data-mce-bogus="all"]'}function Wd(e,t,n){return document.createTreeWalker(e,t,n,!1)}function Kd(e){return Wd(e,NodeFilter.SHOW_COMMENT,function(e){return qd(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP})}function Xd(e){return Wd(e,NodeFilter.SHOW_TEXT,function(e){if(qd(e)){var t=e.parentNode;return t&&Ee(om,t.nodeName)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}return NodeFilter.FILTER_SKIP})}function Yd(e){return null!==Kd(e).nextNode()}function Gd(e){return null!==Xd(e).nextNode()}function Jd(e,t){return null!==t.querySelector($d(e))}function Qd(n,e){Y(e.querySelectorAll($d(n)),function(e){var t=Et.fromDom(e);"all"===vn(t,"data-mce-bogus")?In(t):Y(n,function(e){yn(t,e)&&Cn(t,e)})})}function Zd(e){for(var t=e.nextNode();null!==t;)t.nodeValue=null,t=e.nextNode()}function em(r,e){var t=[{condition:R(Jd,e),action:R(Qd,e)},{condition:Yd,action:im},{condition:Gd,action:am}],o=r,i=!1;return Y(t,function(e){var t=e.condition,n=e.action;t(o)&&(i||(o=r.cloneNode(!0),i=!0),n(o))}),o}function tm(o){return{compare:function(e,t){return e.nodeName===t.nodeName&&!(!r(n(e),n(t))||!r(o.parseStyle(o.getAttrib(e,"style")),o.parseStyle(o.getAttrib(t,"style")))||Qc(e)||Qc(t));function n(n){var r={};return um(o.getAttribs(n),function(e){var t=e.nodeName.toLowerCase();0!==t.indexOf("_")&&"style"!==t&&0!==t.indexOf("data-")&&(r[t]=o.getAttrib(n,t))}),r}function r(e,t){var n,r;for(r in e)if(Ee(e,r)){if(void 0===(n=t[r]))return;if(e[r]!==n)return;delete t[r]}for(r in t)if(Ee(t,r))return;return 1}}}}function nm(e){var u=[],s=(e=e||{}).indent,c=sm(e.indent_before||""),l=sm(e.indent_after||""),f=Zo.getEncodeFunc(e.entity_encoding||"raw",e.entities),d="html"===e.element_format;return{start:function(e,t,n){var r,o,i,a;if(s&&c[e]&&0<u.length&&0<(a=u[u.length-1]).length&&"\n"!==a&&u.push("\n"),u.push("<",e),t)for(r=0,o=t.length;r<o;r++)i=t[r],u.push(" ",i.name,'="',f(i.value,!0),'"');u[u.length]=!n||d?">":" />",n&&s&&l[e]&&0<u.length&&0<(a=u[u.length-1]).length&&"\n"!==a&&u.push("\n")},end:function(e){var t;u.push("</",e,">"),s&&l[e]&&0<u.length&&0<(t=u[u.length-1]).length&&"\n"!==t&&u.push("\n")},text:function(e,t){0<e.length&&(u[u.length]=t?e:f(e))},cdata:function(e){u.push("<![CDATA[",e,"]]>")},comment:function(e){u.push("\x3c!--",e,"--\x3e")},pi:function(e,t){t?u.push("<?",e," ",f(t),"?>"):u.push("<?",e,"?>"),s&&u.push("\n")},doctype:function(e){u.push("<!DOCTYPE",e,">",s?"\n":"")},reset:function(){u.length=0},getContent:function(){return u.join("").replace(/\n$/,"")}}}function rm(t,g){void 0===g&&(g=oo());var p=nm(t);return(t=t||{}).validate=!("validate"in t)||t.validate,{serialize:function(e){var f=t.validate,d={3:function(e){p.text(e.value,e.raw)},8:function(e){p.comment(e.value)},7:function(e){p.pi(e.name,e.value)},10:function(e){p.doctype(e.value)},4:function(e){p.cdata(e.value)},11:function(e){if(e=e.firstChild)for(;m(e),e=e.next;);}};p.reset();var m=function(e){var t=d[e.type];if(t)t(e);else{var n=e.name,r=e.shortEnded,o=e.attributes;if(f&&o&&1<o.length){var i=[];i.map={};var a=g.getElementRule(e.name);if(a){for(var u=0,s=a.attributesOrder.length;u<s;u++)(c=a.attributesOrder[u])in o.map&&(l=o.map[c],i.map[c]=l,i.push({name:c,value:l}));for(var c,l,u=0,s=o.length;u<s;u++)(c=o[u].name)in i.map||(l=o.map[c],i.map[c]=l,i.push({name:c,value:l}));o=i}}if(p.start(e.name,o,r),!r){if(e=e.firstChild)for(;m(e),e=e.next;);p.end(n)}}};return 1!==e.type||t.inner?d[11](e):m(e),p.getContent()}}}var om=Nt.makeMap("NOSCRIPT STYLE SCRIPT XMP IFRAME NOEMBED NOFRAMES PLAINTEXT"," "),im=i(Zd,Kd),am=i(Zd,Xd),um=Nt.each,sm=Nt.makeMap,cm=new Set;function lm(e,t){return we(e.parseStyle(e.getAttrib(t,"style")))}function fm(n,r,o){return ve.from(o.container()).filter(Vn).exists(function(e){var t=n?0:-1;return r(e.data.charAt(o.offset()+t))})}function dm(e){var t=e.container();return Vn(t)&&(0===t.data.length||No(t.data)&&Hl.isBookmarkNode(t.parentNode))}function mm(t,n){return function(e){return ve.from(Zs(t?0:-1,e)).filter(n).isSome()}}function gm(e){return Xn(e)&&"block"===wn(Et.fromDom(e),"display")}function pm(e){return Gn(e)&&!(Hn(t=e)&&"all"===t.getAttribute("data-mce-bogus"));var t}function hm(e){Xt(e),Ln(e,Et.fromHtml('<br data-mce-bogus="1">'))}function vm(n){Ut(n).each(function(t){Bt(t).each(function(e){go(n)&&Pr(t)&&go(e)&&In(t)})})}function bm(e,t){return o=D,Ve(r=t,n=e)?function(e,t){for(var n=y(t)?t:D,r=e.dom,o=[];null!==r.parentNode&&void 0!==r.parentNode;){var i=r.parentNode,a=Et.fromDom(i);if(o.push(a),!0===n(a))break;r=i}return o}(n,function(e){return o(e)||je(e,r)}).slice(0,-1):[];var n,r,o}function ym(e,t){return[e].concat(bm(e,t))}function Cm(e,t,n){return ef(e,t,n,dm)}function xm(e,t){return M(ym(Et.fromDom(t.container()),e),go)}function wm(e,n,r){return Cm(e,n.dom,r).forall(function(t){return xm(n,r).fold(function(){return!1===Qs(t,r,n.dom)},function(e){return!1===Qs(t,r,n.dom)&&Ve(e,Et.fromDom(t.container()))})})}function Sm(t,n,r){return xm(n,r).fold(function(){return Cm(t,n.dom,r).forall(function(e){return!1===Qs(e,r,n.dom)})},function(e){return Cm(t,e.dom,r).isNone()})}function Nm(e){return ic(e).exists(Pr)}function Em(e,t,n){var r=Q(U(ym(Et.fromDom(n.container()),t),go)).getOr(t);return Zl(e,r.dom,n).filter(Nm)}function km(e,t){return ic(t).exists(Pr)||Em(!0,e,t).isSome()}function _m(e,t){return ve.from(t.getNode(!0)).map(Et.fromDom).exists(Pr)||Em(!1,e,t).isSome()}function Am(e){return cs.isTextPosition(e)&&!e.isAtStart()&&!e.isAtEnd()}function Rm(e,t){return Q(U(ym(Et.fromDom(t.container()),e),go)).getOr(e)}function Dm(e,t){return Am(t)?Gg(t):Gg(t)||nf(Rm(e,t).dom,t).exists(Gg)}function Tm(e,t){return Am(t)?Yg(t):Yg(t)||tf(Rm(e,t).dom,t).exists(Yg)}function Om(e){return ic(e).bind(function(e){return hr(e,_n)}).exists(function(e){return T(["pre","pre-wrap"],wn(e,"white-space"))})}function Bm(e,t){return!Om(t)&&(ip(e,t)||up(e,t)||_m(e,t)||Dm(e,t))}function Pm(e,t){return!Om(t)&&(ap(e,t)||sp(e,t)||km(e,t)||Tm(e,t))}function Lm(e,t){return Bm(e,t)||Pm(e,(r=(n=t).container(),o=n.offset(),Vn(r)&&o<r.data.length?cs(r,o+1):n));var n,r,o}function Im(e,t){return sf(e.charAt(t))}function Mm(e){var t=e.container();return Vn(t)&&Te(t.data,wo)}function Fm(g,e){return ve.some(e).filter(Mm).bind(function(e){var t,n,r,o,i,a,u,s,c,l=e.container(),f=g,d=(i=l).data,m=cs(i,0);return(!Im(d,0)||Lm(f,m)?(s=(a=l).data,(c=A(u=s.split(""),function(e,t){return sf(e)&&0<t&&t<u.length-1&&el(u[t-1])&&el(u[t+1])?" ":e}).join(""))!==s&&(a.data=c,1)):(i.data=" "+d.slice(1),1))||(t=g,r=(n=l).data,o=cs(n,r.length-1),Im(r,r.length-1)&&!Lm(t,o)&&(n.data=r.slice(0,-1)+" ",1))?ve.some(e):ve.none()})}function Um(t){var e=Et.fromDom(t.getBody());t.selection.isCollapsed()&&Fm(e,cs.fromRangeStart(t.selection.getRng())).each(function(e){t.selection.setRng(e.toRange())})}function zm(e,t,n){var r,o,i,a,u,s,c,l;0!==n&&(o=pr(r=Et.fromDom(e),go).getOr(r),i=e.data.slice(t,t+n),a=t+n>=e.data.length&&Pm(o,cs(e,e.data.length)),u=0===t&&Bm(o,cs(e,0)),e.replaceData(t,n,(c=u,l=a,L(s=i,function(e,t){return Zc(t)||sf(t)?e.previousCharIsSpace||""===e.str&&c||e.str.length===s.length-1&&l?{previousCharIsSpace:!1,str:e.str+wo}:{previousCharIsSpace:!0,str:e.str+" "}:{previousCharIsSpace:!1,str:e.str+t}},{previousCharIsSpace:!1,str:""}).str)))}function Hm(e,t){var n=e.data.slice(t);zm(e,t,n.length-Qe(n).length)}function jm(e,t){var n=e.data.slice(0,t),r=n.length-Ze(n).length;zm(e,t-r,r)}function Vm(e,t,n,r){void 0===r&&(r=!0);var o=Ze(e.data).length,i=r?e:t,a=r?t:e;return r?i.appendData(a.data):i.insertData(0,a.data),In(Et.fromDom(a)),n&&Hm(i,o),i}function qm(e,t){return r=e,o=(n=t).container(),i=n.offset(),!1===cs.isTextPosition(n)&&o===r.parentNode&&i>cs.before(r).offset()?cs(t.container(),t.offset()-1):t;var n,r,o,i}function $m(e){return Vr(e.previousSibling)?ve.some((t=e.previousSibling,Vn(t)?cs(t,t.data.length):cs.after(t))):e.previousSibling?of(e.previousSibling):ve.none();var t}function Wm(e){return Vr(e.nextSibling)?ve.some((t=e.nextSibling,Vn(t)?cs(t,0):cs.before(t))):e.nextSibling?rf(e.nextSibling):ve.none();var t}function Km(r,o){return $m(o).orThunk(function(){return Wm(o)}).orThunk(function(){return e=r,n=cs.before((t=o).previousSibling||t.parentNode),nf(e,n).fold(function(){return tf(e,cs.after(t))},ve.some);var e,t,n})}function Xm(n,r){return Wm(r).orThunk(function(){return $m(r)}).orThunk(function(){return tf(e=n,cs.after(t=r)).fold(function(){return nf(e,cs.before(t))},ve.some);var e,t})}function Ym(t,n,e){e.fold(function(){t.focus()},function(e){t.selection.setRng(e.toRange(),n)})}function Gm(e,t){return t&&Ee(e.schema.getBlockElements(),kt(t))}function Jm(e){if(Kr(e)){var t=Et.fromHtml('<br data-mce-bogus="1">');return Xt(e),Ln(e,t),ve.some(cs.before(t.dom))}return ve.none()}function Qm(t,n,e,r){void 0===r&&(r=!0);var o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(p=n,h=t.getBody(),v=e.dom,(p?Xm:Km)(h,v).map(R(qm,v))),y=pr(e,R(Gm,t),(o=t.getBody(),function(e){return e.dom===o})),C=(u=b,i=a=e,s=Ee(t.schema.getTextInlineElements(),kt(i)),m=Bt(a).filter(An),g=Pt(a).filter(An),In(a),l=g,f=u,d=function(e,t,n){var r=e.dom,o=t.dom,i=r.data.length;return Vm(r,o,s),n.container()===o?cs(r,i):n},((c=m).isSome()&&l.isSome()&&f.isSome()?ve.some(d(c.getOrDie(),l.getOrDie(),f.getOrDie())):ve.none()).orThunk(function(){return s&&(m.each(function(e){return jm(e.dom,e.dom.length)}),g.each(function(e){return Hm(e.dom,0)})),u}));t.dom.isEmpty(t.getBody())?(t.setContent(""),t.selection.setCursorLocation()):y.bind(Jm).fold(function(){r&&Ym(t,n,C)},function(e){r&&Ym(t,n,ve.some(e))})}function Zm(e){return yu(e,"td,th")}function eg(e,t){return{start:e,end:t}}function tg(e,t){return yr(Et.fromDom(e),"td,th",t)}function ng(e){return!je(e.start,e.end)}function rg(e,n){return Tl(e.start,n).bind(function(t){return Tl(e.end,n).bind(function(e){return je(t,e)?ve.some(t):ve.none()})})}function og(e){return function(t){return rg(t,e).map(function(e){return{rng:t,table:e,cells:Zm(e)}})}}function ig(e,t,n,r){if(n.collapsed||!e.forall(ng))return ve.none();if(t.isSameTable){var o=e.bind(og(r));return ve.some({start:o,end:o})}var i,a,u=tg(n.startContainer,r),s=tg(n.endContainer,r),c=u.bind((a=r,function(t){return Tl(t,a).bind(function(e){return Z(Zm(e)).map(function(e){return eg(t,e)})})})).bind(og(r)),l=s.bind((i=r,function(t){return Tl(t,i).bind(function(e){return Q(Zm(e)).map(function(e){return eg(e,t)})})})).bind(og(r));return ve.some({start:c,end:l})}function ag(e,t){return z(e,function(e){return je(e,t)})}function ug(n){return dn(ag(n.cells,n.rng.start),ag(n.cells,n.rng.end),function(e,t){return n.cells.slice(e,t+1)})}function sg(e,t){var n=t.startTable,r=t.endTable,o=e.cloneRange();return n.each(function(e){return o.setStartAfter(e.dom)}),r.each(function(e){return o.setEndBefore(e.dom)}),o}function cg(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b=(n=e,function(e){return je(n,e)}),y=dn(tg((r=t).startContainer,o=b),tg(r.endContainer,o),eg),C=(l=b,f=x((c=t).startContainer),d=x(c.endContainer),m=f.isSome(),g=d.isSome(),p=dn(f,d,je).getOr(!1),{startTable:f,endTable:d,isStartInTable:m,isEndInTable:g,isSameTable:p,isMultiTable:!p&&m&&g});function x(e){return Tl(Et.fromDom(e),l)}return h=t,v=b,y.exists(function(e){return!ng(t=e)&&rg(t,v).exists(function(e){var t=e.dom.rows;return 1===t.length&&1===t[0].cells.length})&&Ol(e.start,h);var t})?y.map(function(e){return fp.singleCellTable(t,e.start)}):C.isMultiTable?ig(y,u=C,s=t,b).bind(function(e){var t=e.start,n=e.end,r=t.bind(ug).getOr([]),o=n.bind(ug).getOr([]);if(0<r.length&&0<o.length){var i=sg(s,u);return ve.some(fp.multiTable(r,o,i))}return ve.none()}):ig(y,i=C,a=t,b).bind(function(e){var t=e.start,n=e.end;return t.or(n)}).bind(function(e){var t=i.isSameTable,n=ug(e).getOr([]);if(t&&e.cells.length===n.length)return ve.some(fp.fullTable(e.table));if(0<n.length){if(t)return ve.some(fp.partialTable(n,ve.none()));var r=sg(a,i);return ve.some(fp.partialTable(n,ve.some(_e(_e({},i),{rng:r}))))}return ve.none()})}function lg(e){return Y(e,function(e){Cn(e,"contenteditable"),hm(e)}),0}function fg(e,t,n,r){var o=n.cloneRange();r?(o.setStart(n.startContainer,n.startOffset),o.setEndAfter(t.dom.lastChild)):(o.setStartBefore(t.dom.firstChild),o.setEnd(n.endContainer,n.endOffset)),mp(e,o,t,!1)}function dg(e){var t=Dl(e),n=Et.fromDom(e.selection.getNode());Jn(n.dom)&&Kr(n)?e.selection.setCursorLocation(n.dom,0):e.selection.collapse(!0),1<t.length&&F(t,function(e){return je(e,n)})&&pn(n,"data-mce-selected","1")}function mg(s,c,e){var l=s.selection.getRng();return lg(e.bind(function(e){var t,n,r,o=e.rng,i=e.isStartInTable,a=(t=i?o.endContainer:o.startContainer,ve.from(s.dom.getParent(t,s.dom.isBlock)).map(Et.fromDom));o.deleteContents(),n=s,r=i,a.filter(Kr).each(function(e){r?In(e):(hm(e),n.selection.setCursorLocation(e.dom,0))});var u=i?c[0]:c[c.length-1];return fg(s,u,l,i),Kr(u)?ve.none():ve.some(i?c.slice(1):c.slice(0,-1))}).getOr(c)),dg(s),!0}function gg(e,t,n,r){var o=e.selection.getRng(),i=t[0],a=n[n.length-1];fg(e,i,o,!0),fg(e,a,o,!1);var u=Kr(i)?t:t.slice(1),s=Kr(a)?n:n.slice(0,-1);return lg(u.concat(s)),r.deleteContents(),dg(e),!0}function pg(e,t){return Qm(e,!1,t),!0}function hg(e,t){return M(ym(t,e),yo)}function vg(e,t){return(e?tp:np)(t)}function bg(f,d,s){var m=Et.fromDom(f.getBody());return gp(m,s).fold(function(){return o=f,i=d,a=m,e=s,u=cs.fromRangeStart(o.selection.getRng()),hg(a,e).bind(function(e){return Kr(e)?pp(o,e):(t=a,n=e,r=u,Hc(i,o.getBody(),r).bind(function(e){return hg(t,Et.fromDom(e.getNode())).map(function(e){return!1===je(e,n)})}));var t,n,r}).getOr(!1)||(n=d,r=cs.fromRangeStart((t=f).selection.getRng()),vg(n,r)||Zl(n,t.getBody(),r).exists(function(e){return vg(n,e)}));var o,i,a,e,u,t,n,r},function(e){return n=d,r=m,o=e,i=cs.fromRangeStart((t=f).selection.getRng()),(Kr(o)?pp(t,o):(u=r,c=o,l=i,Hc(s=n,(a=t).getBody(),l).bind(function(e){return r=s,o=l,i=e,rf((n=c).dom).bind(function(t){return of(n.dom).map(function(e){return r?o.isEqual(t)&&i.isEqual(e):o.isEqual(e)&&i.isEqual(t)})}).getOr(!0)?pp(a,c):(t=c,gp(u,Et.fromDom(e.getNode())).map(function(e){return!1===je(e,t)}));var t,n,r,o,i}).or(ve.some(!0)))).getOr(!1);var a,u,s,c,l,t,n,r,o,i})}function yg(e,t){var n,r,o,i,a,u,s,c,l=Et.fromDom(e.selection.getStart(!0)),f=Dl(e);return e.selection.isCollapsed()&&0===f.length?bg(e,t,l):(r=l,o=f,i=Et.fromDom((n=e).getBody()),a=n.selection.getRng(),0!==o.length?mg(n,o,ve.none()):(u=n,c=a,gp(s=i,r).fold(function(){return t=u,cg(s,c).map(function(e){return e.fold(R(mp,t),R(pg,t),R(mg,t),R(gg,t))});var t},function(e){return pp(u,e)}).getOr(!1)))}function Cg(e){return e.collapsed?e:(a=e,u=cs.fromRangeStart(a),s=cs.fromRangeEnd(a),c=a.commonAncestorContainer,Zl(!1,c,s).map(function(e){return!Qs(u,s,c)&&Qs(u,e,c)?(t=u.container(),n=u.offset(),r=e.container(),o=e.offset(),(i=document.createRange()).setStart(t,n),i.setEnd(r,o),i):a;var t,n,r,o,i}).getOr(a));var a,u,s,c}function xg(e,t){var n,r,o,i,a,u=t.firstChild,s=t.lastChild;return u&&"meta"===u.name&&(u=u.next),r=s=s&&"mce_marker"===s.attr("id")?s.prev:s,o=(n=e).getNonEmptyElements(),r&&(r.isEmpty(o)||(i=r,n.getBlockElements()[i.name]&&i.firstChild&&i.firstChild===i.lastChild&&("br"===(a=i.firstChild).name||a.value===wo)))&&(s=s.prev),u&&u===s&&("ul"===u.name||"ol"===u.name)}function wg(e){return 0<e.length&&(!(r=e[e.length-1]).firstChild||(t=r)&&t.firstChild&&t.firstChild===t.lastChild&&((n=t.firstChild).data===wo||Kn(n)))?e.slice(0,-1):e;var t,n,r}function Sg(e,t){var n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null}function Ng(e,t){var n=cs.after(e),r=Mc(t).prev(n);return r?r.toRange():null}function Eg(e,o,i,t){function n(e){var t=cs.fromRangeStart(i),n=Mc(o.getRoot()),r=1===e?n.prev(t):n.next(t);return!r||Sg(o,r.getNode())!==R}var r,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x,w,S,N,E,k,_,A=(r=o,c=e.serialize(t),u=(a=r.createFragment(c)).firstChild,s=a.lastChild,u&&"META"===u.nodeName&&u.parentNode.removeChild(u),s&&"mce_marker"===s.id&&s.parentNode.removeChild(s),a),R=Sg(o,i.startContainer),D=wg(U(A.firstChild.childNodes,function(e){return"LI"===e.nodeName})),T=o.getRoot();return n(1)?(S=T,_=(w=R).parentNode,Nt.each(D,function(e){_.insertBefore(e,w)}),N=S,E=cs.before(w),(k=Mc(N).next(E))?k.toRange():null):n(2)?(l=R,d=T,o.insertAfter((f=D).reverse(),l),Ng(f[0],d)):(g=D,p=T,h=m=R,b=(v=i).cloneRange(),y=v.cloneRange(),b.setStartBefore(h),y.setEndAfter(h),C=[b.cloneContents(),y.cloneContents()],(x=m.parentNode).insertBefore(C[0],m),Nt.each(g,function(e){x.insertBefore(e,m)}),x.insertBefore(C[1],m),x.removeChild(m),Ng(g[g.length-1],p))}function kg(e,t,n){var r,o,i,a,u=e.selection,s=e.dom;/^ | $/.test(t)&&(r=s,o=u.getRng(),i=t,i=Bm(a=Et.fromDom(r.getRoot()),cs.fromRangeStart(o))?i.replace(/^ /," "):i.replace(/^ /," "),t=i=Pm(a,cs.fromRangeEnd(o))?i.replace(/( | )(<br( \/)>)?$/," "):i.replace(/ (<br( \/)?>)?$/," "));var c=e.parser,l=n.merge,f=rm({validate:e.getParam("validate")},e.schema),d='<span id="mce_marker" data-mce-type="bookmark"></span>',m=e.fire("BeforeSetContent",{content:t,format:"html",selection:!0,paste:n.paste});if(m.isDefaultPrevented())e.fire("SetContent",{content:m.content,format:"html",selection:!0,paste:n.paste});else{t=m.content,-1===(t=n.preserve_zwsp?t:Eo(t)).indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,d);var g,p,h=(g=u.getRng()).startContainer||(g.parentElement?g.parentElement():null),v=e.getBody();h===v&&u.isCollapsed()&&s.isBlock(v.firstChild)&&((p=v.firstChild)&&!e.schema.getShortEndedElements()[p.nodeName])&&s.isEmpty(v.firstChild)&&((g=s.createRng()).setStart(v.firstChild,0),g.setEnd(v.firstChild,0),u.setRng(g)),u.isCollapsed()||function(e){var t=e.dom,n=Cg(e.selection.getRng());e.selection.setRng(n);var r,o=t.getParent(n.startContainer,hp),i=n;null!==(r=o)&&r===t.getParent(i.endContainer,hp)&&Ol(Et.fromDom(r),i)?mp(e,n,Et.fromDom(o)):e.getDoc().execCommand("Delete",!1,null)}(e);var b,y,C,x,w,S,N,E,k,_,A,R,D,T,O={context:(I=u.getNode()).nodeName.toLowerCase(),data:n.data,insert:!0},B=c.parse(t,O);if(!0===n.paste&&xg(e.schema,B)&&Sg(s,I))return g=Eg(f,s,u.getRng(),B),u.setRng(g),void e.fire("SetContent",m);if(function(){for(var e=B;e=e.walk();)1===e.type&&e.attr("data-mce-fragment","1")}(),"mce_marker"===(L=B.lastChild).attr("id"))for(var P=L,L=L.prev;L;L=L.walk(!0))if(3===L.type||!s.isBlock(L.name)){e.schema.isValidChild(L.parent.name,"span")&&L.parent.insert(P,L,"br"===L.name);break}if(e._selectionOverrides.showBlockCaretContainer(I),O.invalid){e.selection.setContent(d);var I=u.getNode(),M=e.getBody();for(9===I.nodeType?I=L=M:L=I;L!==M;)L=(I=L).parentNode;t=I===M?M.innerHTML:s.getOuterHTML(I),t=f.serialize(c.parse(t.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i,function(){return f.serialize(B)}))),I===M?s.setHTML(M,t):s.setOuterHTML(I,t)}else b=e,y=t=f.serialize(B),"all"===(C=I).getAttribute("data-mce-bogus")?C.parentNode.insertBefore(b.dom.createFragment(y),C):(x=C.firstChild,w=C.lastChild,!x||x===w&&"BR"===x.nodeName?b.dom.setHTML(C,y):b.selection.setContent(y));N=l,_=(S=e).schema.getTextInlineElements(),A=S.dom,N&&(E=S.getBody(),k=tm(A),Nt.each(A.select("*[data-mce-fragment]"),function(e){if(V(_[e.nodeName.toLowerCase()])&&j(lm(A,e),function(e){return!cm.has(e)}))for(var t=e.parentNode;V(t)&&t!==E&&!function(r,o,i){function a(e){var t=r.getStyle(o,e),n=r.getStyle(i,e);return Be(t)&&Be(n)&&t!==n}var e=lm(r,o),u=lm(r,i);return F(e,function(t){function e(e){return F(e,function(e){return e===t})}if(e(u)||!e(Xg))return a(t);var n=U(u,function(t){return F(Xg,function(e){return Ge(t,e)})});return F(n,a)})}(A,e,t);t=t.parentNode)if(k.compare(t,e)){A.remove(e,!0);break}})),function(n,e){var t,r=n.dom,o=n.selection;if(e){o.scrollIntoView(e);var i=bf(n.getBody(),e);if("false"===r.getContentEditable(i))return r.remove(e),o.select(i);var a,u=r.createRng(),s=e.previousSibling;Vn(s)?(u.setStart(s,s.nodeValue.length),xt.ie||(a=e.nextSibling,Vn(a)&&(s.appendData(a.data),a.parentNode.removeChild(a)))):(u.setStartBefore(e),u.setEndBefore(e));var c=r.getParent(e,r.isBlock);r.remove(e),c&&r.isEmpty(c)&&(n.$(c).empty(),u.setStart(c,0),u.setEnd(c,0),hp(c)||c.getAttribute("data-mce-fragment")||!(t=function(e){var t=cs.fromRangeStart(e);if(t=Mc(n.getBody()).next(t))return t.toRange()}(u))?r.add(c,r.create("br",{"data-mce-bogus":"1"})):(u=t,r.remove(c))),o.setRng(u)}}(e,s.get("mce_marker")),R=e.getBody(),Nt.each(R.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")}),D=s,T=u.getStart(),ve.from(D.getParent(T,"td,th")).map(Et.fromDom).each(vm),e.fire("SetContent",m),e.addVisual()}}function _g(e){return e instanceof jd}function Ag(e,t,n){var r;e.dom.setHTML(e.getBody(),t),!0!==n&&Cd(r=e)&&rf(r.getBody()).each(function(e){var t=e.getNode(),n=cn(t)?rf(t).getOr(e):e;r.selection.setRng(n.toRange())})}function Rg(u,s,e){var t,n=(t=s,_e(_e({format:"html"},e),{set:!0,content:_g(t)?"":t})),c=e.no_events?n:u.fire("BeforeSetContent",n);return _g(s)||(s=c.content),ve.from(u.getBody()).fold(J(s),function(e){return _g(s)?function(e,t,n,r){var o,i,u,a;o=e.parser.getNodeFilters(),i=e.parser.getAttributeFilters(),u=n,a=function(e,n){var t,r,o={},i={},a=[];for(t in u.firstChild&&vp(u.firstChild,function(t){Y(e,function(e){e.name===t.name&&(o[e.name]?o[e.name].nodes.push(t):o[e.name]={filter:e,nodes:[t]})}),Y(n,function(e){"string"==typeof t.attr(e.name)&&(i[e.name]?i[e.name].nodes.push(t):i[e.name]={filter:e,nodes:[t]})})}),o)Ee(o,t)&&a.push(o[t]);for(r in i)Ee(i,r)&&a.push(i[r]);return a}(o,i),Y(a,function(t){Y(t.filter.callbacks,function(e){e(t.nodes,t.filter.name,{})})});var s=rm({validate:e.validate},e.schema).serialize(n);return r.content=Eo(Co(Et.fromDom(t))?s:Nt.trim(s)),Ag(e,r.content,r.no_selection),r.no_events||e.fire("SetContent",r),n}(u,e,s,c):(t=u,n=e,o=c,0===(r=Eo(r=s)).length||/^\s+$/.test(r)?(i='<br data-mce-bogus="1">',"TABLE"===n.nodeName?r="<tr><td>"+i+"</td></tr>":/^(UL|OL)$/.test(n.nodeName)&&(r="<li>"+i+"</li>"),r=(a=ks(t))&&t.schema.isValidChild(n.nodeName.toLowerCase(),a.toLowerCase())?(r=i,t.dom.createHTML(a,_s(t),r)):r||'<br data-mce-bogus="1">',Ag(t,r,o.no_selection),t.fire("SetContent",o)):("raw"!==o.format&&(r=rm({validate:t.validate},t.schema).serialize(t.parser.parse(r,{isRootContent:!0,insert:!0}))),o.content=Co(Et.fromDom(n))?r:Nt.trim(r),Ag(t,o.content,o.no_selection),o.no_events||t.fire("SetContent",o)),o.content);var t,n,r,o,i,a})}function Dg(e){return y(e)?e:D}function Tg(i,e,t){var n=e(i),a=Dg(t);return n.orThunk(function(){return a(i)?ve.none():function(e){for(var t=i.dom,n=Dg(a);t.parentNode;){var t=t.parentNode,r=Et.fromDom(t),o=e(r);if(o.isSome())return o;if(n(r))break}return ve.none()}(e)})}function Og(e,t,n){var r=e.formatter.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o];if(gl(i)&&!1===i.inherit&&e.dom.is(t,i.selector))return 1}}function Bg(t,e,n,r,o){var i=t.dom.getRoot();return e!==i&&(e=t.dom.getParent(e,function(e){return!!Og(t,e,n)||e.parentNode===i||!!yp(t,e,n,r,!0)}),!!yp(t,e,n,r,o))}function Pg(e,t,n){return!!bp(t,n.inline)||!!bp(t,n.block)||(n.selector?1===t.nodeType&&e.is(t,n.selector):void 0)}function Lg(e,t,n,r,o,i){var a=n[r];if(y(n.onmatch))return n.onmatch(t,n,r);if(a)if(b(a.length)){for(var u in a)if(Ee(a,u)){var s="attributes"===r?e.getAttrib(t,u):cl(e,t,u),c=al(a[u],i),l=K(s)||Pe(s);if(!l||!K(c)){if(o&&l&&!n.exact)return;if((!o||n.exact)&&!bp(s,sl(e,c,u)))return}}}else for(var f=0;f<a.length;f++)if("attributes"===r?e.getAttrib(t,a[f]):cl(e,t,a[f]))return 1;return 1}function Ig(e,t,n,r,o){if(r)return Bg(e,r,t,n,o);if(r=e.selection.getNode(),Bg(e,r,t,n,o))return!0;var i=e.selection.getStart();return!(i===r||!Bg(e,i,t,n,o))}function Mg(e){return 0<function(e){for(var t=[];e;){if(3===e.nodeType&&e.nodeValue!==Cp||1<e.childNodes.length)return[];1===e.nodeType&&t.push(e),e=e.firstChild}return t}(e).length}function Fg(e){if(e){var t=new Dr(e,e);for(e=t.current();e;e=t.next())if(Vn(e))return e}return null}function Ug(e){var t=Et.fromTag("span");return hn(t,{id:xp,"data-mce-bogus":"1","data-mce-type":"format-caret"}),e&&Ln(t,Et.fromText(Cp)),t}function zg(e,t,n){void 0===n&&(n=!0);var r,o,i,a,u,s,c,l,f=e.dom,d=e.selection;Mg(t)?Qm(e,!1,Et.fromDom(t),n):(r=d.getRng(),o=f.getParent(t,f.isBlock),i=r.startContainer,a=r.startOffset,u=r.endContainer,s=r.endOffset,(l=Fg(t))&&l.nodeValue.charAt(0)===Cp&&l.deleteData(0,1),c=l,f.remove(t,!0),i===c&&0<a&&r.setStart(c,a-1),u===c&&0<s&&r.setEnd(c,s-1),o&&f.isEmpty(o)&&hm(Et.fromDom(o)),d.setRng(r))}function Hg(e,t,n){void 0===n&&(n=!0);var r=e.dom,o=e.selection;if(t)zg(e,t,n);else if(!(t=qc(e.getBody(),o.getStart())))for(;t=r.get(xp);)zg(e,t,!1)}function jg(e,t){return e.appendChild(t),t}function Vg(e,t){var n=P(e,function(e,t){return jg(e,t.cloneNode(!1))},t);return jg(n,n.ownerDocument.createTextNode(Cp))}function qg(o,e,t,i,n,r){var a,u,s=o.formatter,c=o.dom,l=U(we(s.get()),function(e){return e!==i&&!Te(e,"removeformat")});if(0<U((a=o,u=t,L(l,function(e,t){var n=dl(a,t);return a.formatter.matchNode(u,t,{},n)?e.concat([t]):e},[])),function(e){return n=i,r=["inline","block","selector","attributes","styles","classes"],!F((t=o).formatter.get(e),function(e){var i=a(e);return F(t.formatter.get(n),function(e){var t,n=a(e),r=i,o=n;return d(t=void 0===t?p:t).eq(r,o)})});function a(e){return ae(e,function(e,t){return F(r,function(e){return e===t})})}var t,n,r}).length){var f=t.cloneNode(!1);return c.add(e,f),s.remove(i,n,f,r),c.remove(f),ve.some(f)}return ve.none()}function $g(e,t,n,r){var o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=e.dom,C=e.selection,x=[],w=C.getRng(),S=w.startContainer,N=w.startOffset,E=S;for(3===S.nodeType&&(N!==S.nodeValue.length&&(o=!0),E=E.parentNode);E;){if(yp(e,E,t,n,r)){i=E;break}E.nextSibling&&(o=!0),x.push(E),E=E.parentNode}i&&(o?(a=C.getBookmark(),w.collapse(!0),u=Pf(kl(e,w,e.formatter.get(t),!0)),e.formatter.remove(t,n,u,r),C.moveToBookmark(a)):(s=qc(e.getBody(),i),d=c=Ug(!1).dom,(p=(g=e.dom).getParent(m=null!==s?s:i,R(ol,e)))&&g.isEmpty(p)?m.parentNode.replaceChild(d,m):(h=Et.fromDom(m),v=yu(h,"br"),b=U(function(){for(var e=[],t=h.dom;t;)e.push(Et.fromDom(t)),t=t.lastChild;return e}().slice(-1),Pr),v.length===b.length&&Y(b,In),g.isEmpty(m)?m.parentNode.replaceChild(d,m):g.insertAfter(d,m)),l=qg(e,c,i,t,n,r),f=Vg(x.concat(l.toArray()),c),zg(e,s,!1),C.setCursorLocation(f,1),y.isEmpty(i)&&y.remove(i)))}function Wg(e,t){var n=e.schema.getTextInlineElements();return Ee(n,kt(t))&&!Vc(t.dom)&&!sn(t.dom)}Y(["margin","margin-left","margin-right","margin-top","margin-bottom","padding","padding-left","padding-right","padding-top","padding-bottom","border","border-width","border-style","border-color","background","background-attachment","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","float","position","left","right","top","bottom","z-index","display","transform","width","max-width","min-width","height","max-height","min-height","overflow","overflow-x","overflow-y","text-overflow","vertical-align","transition","transition-delay","transition-duration","transition-property","transition-timing-function"],function(e){cm.add(e)});var Kg,Xg=["font","text-decoration","text-emphasis"],Yg=R(fm,!0,Zc),Gg=R(fm,!1,Zc),Jg=mm(!0,gm),Qg=mm(!1,gm),Zg=mm(!0,Qn),ep=mm(!1,Qn),tp=mm(!0,cn),np=mm(!1,cn),rp=mm(!0,pm),op=mm(!1,pm),ip=R(Sm,!1),ap=R(Sm,!0),up=R(wm,!1),sp=R(wm,!0),cp=R(Em,!1),lp=R(Em,!0),fp=ir([{singleCellTable:["rng","cell"]},{fullTable:["table"]},{partialTable:["cells","outsideDetails"]},{multiTable:["startTableCells","endTableCells","betweenRng"]}]),dp=function(e){var t;return(8===_t(t=e)||"#comment"===kt(t)?Bt:Ut)(e).bind(dp).orThunk(function(){return ve.some(e)})},mp=function(e,t,n,r){void 0===r&&(r=!0),t.deleteContents();var o,i=dp(n).getOr(n),a=Et.fromDom(e.dom.getParent(i.dom,e.dom.isBlock));return Kr(a)&&(hm(a),r&&e.selection.setCursorLocation(a.dom,0)),je(n,a)||Y((fn(Ot(a),n)?[]:Ot(o=a).map(Tn).map(function(e){return U(e,function(e){return!je(o,e)})}).getOr([])).concat(Tn(n)),function(e){je(e,a)||Ve(e,a)||!Kr(e)||In(e)}),!0},gp=function(e,t){return M(ym(t,e),function(e){return _n(e)&&"caption"===kt(e)})},pp=function(e,t){return hm(t),e.selection.setCursorLocation(t.dom,0),ve.some(!0)},hp=Jn,vp=function(e,t){t(e),e.firstChild&&vp(e.firstChild,t),e.next&&vp(e.next,t)},bp=ul,yp=function(e,t,n,r,o){var i=e.formatter.get(n),a=e.dom;if(i&&t)for(var u=0;u<i.length;u++){var s=i[u];if(Pg(e.dom,t,s)&&Lg(a,t,s,"attributes",o,r)&&Lg(a,t,s,"styles",o,r)){var c=s.classes;if(c)for(var l=0;l<c.length;l++)if(!e.dom.hasClass(t,al(c[l],r)))return;return s}}},Cp=So,xp="_mce_caret",wp={},Sp=fe,Np=ce;function Ep(e){return Hn(e)&&!Qc(e)&&!Vc(e)&&!sn(e)}function kp(e,t){for(var n=e;n;n=n[t]){if(Vn(n)&&Be(n.data))return e;if(Hn(n)&&!Qc(n))return n}return e}function _p(e,t,n){var r=tm(e);if(t&&n&&(t=kp(t,"previousSibling"),n=kp(n,"nextSibling"),r.compare(t,n))){for(var o=t.nextSibling;o&&o!==n;){var i=o,o=o.nextSibling;t.appendChild(i)}return e.remove(n),Nt.each(Nt.grep(n.childNodes),function(e){t.appendChild(e)}),t}return n}function Ap(e,t,n,r){var o;r&&!1!==t.merge_siblings&&(o=_p(e,rl(r),r),_p(e,o,rl(o,!0)))}function Rp(t,n){return function(e){return!(!e||!cl(t,e,n))}}function Dp(r,o,i){return function(e){var t,n;r.setStyle(e,o,i),""===e.getAttribute("style")&&e.removeAttribute("style"),t=r,"SPAN"===(n=e).nodeName&&0===t.getAttribs(n).length&&t.remove(n,!0)}}function Tp(e,t,n){return e.isChildOf(t,n)&&t!==n&&!e.isBlock(n)}function Op(e,t,n){var r,o=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"];return Hn(o)&&(r=o.childNodes.length-1,!n&&i&&i--,o=o.childNodes[r<i?r:i]),Vn(o)&&n&&i>=o.nodeValue.length&&(o=new Dr(o,e.getBody()).next()||o),Vn(o)&&!n&&0===i&&new Dr(o,e.getBody()).prev()||o}function Bp(e,t){var n=t?"firstChild":"lastChild";if(/^(TR|TH|TD)$/.test(e.nodeName)&&e[n]){var r=e[n];return"TR"===e.nodeName&&r[n]||r}return e}function Pp(e,t,n,r){var o=e.create(n,r);return t.parentNode.insertBefore(o,t),o.appendChild(t),o}function Lp(e,t,n,r,o){var i=Et.fromDom(t),a=Et.fromDom(e.create(r,o));return Kt(a,(n?It:Lt)(i)),n?(qt(i,a),Wt(a,i)):($t(i,a),Ln(a,i)),a.dom}function Ip(e,t,n,r){var o=rl(t,n,r);return K(o)||"BR"===o.nodeName||e.isBlock(o)}function Mp(e,r,o,t,i){var n,a,u=e.dom,s=u,c=t;if(!(pl(a=r)&&Rh(c,a.inline)||ml(a)&&Rh(c,a.block)||gl(a)&&(Hn(c)&&s.is(c,a.selector))||r.links&&"A"===t.nodeName))return kh.keep();var l,f,d,m,g,p,h,v,b=t;if(pl(r)&&"all"===r.remove&&S(r.preserve_attributes)){var y=U(u.getAttribs(b),function(e){return T(r.preserve_attributes,e.name.toLowerCase())});if(u.removeAllAttribs(b),Y(y,function(e){return u.setAttrib(b,e.name,e.value)}),0<y.length)return kh.rename("span")}if("all"!==r.remove){Ah(r.styles,function(e,t){e=sl(u,al(e,o),t+""),N(t)&&(t=e,i=null),!r.remove_similar&&i&&!Rh(cl(u,i,t),e)||u.setStyle(b,t,""),n=!0}),n&&""===u.getAttrib(b,"style")&&(b.removeAttribute("style"),b.removeAttribute("data-mce-style")),Ah(r.attributes,function(e,t){var n;if(e=al(e,o),N(t)&&(t=e,i=null),r.remove_similar||!i||Rh(u.getAttrib(i,t),e))if("class"===t&&(e=u.getAttrib(b,t))&&(n="",Y(e.split(/\s+/),function(e){/mce\-\w+/.test(e)&&(n+=(n?" ":"")+e)}),n))u.setAttrib(b,t,n);else{if(_h.test(t)&&b.removeAttribute("data-mce-"+t),"style"===t&&on(["li"])(b)&&"none"===u.getStyle(b,"list-style-type"))return b.removeAttribute(t),void u.setStyle(b,"list-style-type","none");"class"===t&&b.removeAttribute("className"),b.removeAttribute(t)}}),Ah(r.classes,function(e){e=al(e,o),i&&!u.hasClass(i,e)||u.removeClass(b,e)});for(var C=u.getAttribs(b),x=0;x<C.length;x++){var w=C[x].nodeName;if(0!==w.indexOf("_")&&0!==w.indexOf("data-"))return kh.keep()}}return"none"!==r.remove?(l=e,d=r,p=(f=b).parentNode,h=l.dom,v=ks(l),ml(d)&&(v?p===h.getRoot()&&(d.list_block&&Rh(f,d.list_block)||Y(xe(f.childNodes),function(e){il(l,v,e.nodeName.toLowerCase())?m?m.appendChild(e):(m=Pp(h,e,v),h.setAttribs(m,l.settings.forced_root_block_attrs)):m=null})):h.isBlock(f)&&!h.isBlock(p)&&(Ip(h,f,!1)||Ip(h,f.firstChild,!0,!0)||f.insertBefore(h.create("br"),f.firstChild),Ip(h,f,!0)||Ip(h,f.lastChild,!1,!0)||f.appendChild(h.create("br")))),gl(g=d)&&pl(g)&&fn(ue(g,"mixed"),!0)&&!Rh(d.inline,f)||h.remove(f,!0),kh.removed()):kh.keep()}function Fp(t,e,n,r,o){return Mp(t,e,n,r,o).fold(D,function(e){return t.dom.rename(r,e),!0},w)}function Up(u,s,c,e,l){function a(e){var n,r,o,i,a,t=(r=s,o=c,i=l,Y(fl((n=u).dom,e.parentNode).reverse(),function(e){var t;a||"_start"===e.id||"_end"===e.id||(t=yp(n,e,r,o,i))&&!1!==t.split&&(a=e)}),a);return function(e,t,n,r,o,i,a,u){var s,c,l=e.dom;if(n){for(var f=n.parentNode,d=r.parentNode;d&&d!==f;d=d.parentNode){for(var m=l.clone(d,!1),g=0;g<t.length&&null!==(m=function(t,e,n){return Mp(t,e,u,n,n).fold(J(n),function(e){return t.dom.createFragment().appendChild(n),t.dom.rename(n,e)},J(null))}(e,t[g],m));g++);m&&(s&&m.appendChild(s),c=c||m,s=m)}!i||a.mixed&&l.isBlock(n)||(r=l.split(n,r)),s&&(o.parentNode.insertBefore(s,o),c.appendChild(o),pl(a)&&Ap(l,a,0,s))}return r}(u,m,t,e,e,!0,g,c)}function f(t){return F(m,function(e){return Fp(u,e,c,t,t)})}function d(e){var t,n=h.get(e?"_start":"_end"),r=n[e?"firstChild":"lastChild"];return Qc(t=r)&&Hn(t)&&("_start"===t.id||"_end"===t.id)&&(r=r[e?"firstChild":"lastChild"]),Vn(r)&&0===r.data.length&&(r=e?n.previousSibling||n.nextSibling:n.nextSibling||n.previousSibling),h.remove(n,!0),r}function t(e){var t=kl(u,e,m,e.collapsed);if(g.split){if(t=Pf(t),(r=Op(u,t,!0))!==(o=Op(u,t))){if(r=Bp(r,!0),o=Bp(o,!1),Tp(h,r,o)){var n=ve.from(r.firstChild).getOr(r);return a(Lp(h,n,!0,"span",{id:"_start","data-mce-type":"bookmark"})),void d(!0)}if(Tp(h,o,r))return n=ve.from(o.lastChild).getOr(o),a(Lp(h,n,!1,"span",{id:"_end","data-mce-type":"bookmark"})),void d(!1);var r=Pp(h,r,"span",{id:"_start","data-mce-type":"bookmark"}),o=Pp(h,o,"span",{id:"_end","data-mce-type":"bookmark"}),i=h.createRng();i.setStartAfter(r),i.setEndBefore(o),_l(h,i,function(e){Y(e,function(e){Qc(e)||Qc(e.parentNode)||a(e)})}),a(r),a(o),r=d(!0),o=d()}else r=o=a(r);t.startContainer=r.parentNode||r,t.startOffset=h.nodeIndex(r),t.endContainer=o.parentNode||o,t.endOffset=h.nodeIndex(o)+1}_l(h,t,function(e){Y(e,v)})}var n,m=u.formatter.get(s),g=m[0],p=!0,h=u.dom,r=u.selection,v=function(t){var e=!0,n=!1;Hn(t)&&h.getContentEditable(t)&&(e=p,p="true"===h.getContentEditable(t),n=!0);var r,o,i=xe(t.childNodes);if(p&&!n&&(r=f(t)||F(m,function(e){return Pg(h,t,e)}),o=t.parentNode,!r&&V(o)&&hl(g)&&f(o)),g.deep&&i.length){for(var a=0;a<i.length;a++)v(i[a]);n&&(p=e)}Y(["underline","line-through","overline"],function(e){Hn(t)&&u.dom.getStyle(t,"text-decoration")===e&&t.parentNode&&ll(h,t.parentNode)===e&&Fp(u,{deep:!1,exact:!0,inline:"span",styles:{textDecoration:e}},null,t)})};if(e)return tl(e)?((n=h.createRng()).setStartBefore(e),n.setEndAfter(e),t(n)):t(e),void wf(u,s,e,c);if("false"!==h.getContentEditable(r.getNode()))r.isCollapsed()&&pl(g)&&!Dl(u).length?$g(u,s,c,l):(Il(r,!0,function(){Ll(u,t)}),pl(g)&&Ig(u,s,c,r.getStart())&&nl(h,r,r.getRng()),u.nodeChanged()),wf(u,s,e,c);else{e=r.getNode();for(var o=0;o<m.length&&(!m[o].ceFalseOverride||!Fp(u,m[o],c,e,e));o++);wf(u,s,e,c)}}function zp(e){return Hn(e)&&!Qc(e)&&!Vc(e)&&!sn(e)}function Hp(e){return Ee(e,"vars")}function jp(n,e,r,o,i){return I(e,function(e){var t=n.formatter.matchNode(e,r,null!=i?i:{},o);return!b(t)},function(e){return Og(n,e,r)||!o&&V(n.formatter.matchNode(e,r,i,!0))})}function Vp(e,t){var n=null!=t?t:Bh(e);return U(fl(e.dom,n),function(e){return Hn(e)&&!sn(e)})}function qp(e,o,i,a,t,n){var r,u,s,c,l,f,d,m,g;return null===o.get()&&(u=e,(r=o).set({}),u.on("NodeChange",function(e){Ph(u,e.element,r.get())}),u.on("FormatApply FormatRemove",function(e){var t=ve.from(e.node).map(function(e){return tl(e)?e:e.startContainer}).bind(function(e){return Hn(e)?ve.some(e):ve.from(e.parentElement)}).getOrThunk(function(){return Bh(u)});Ph(u,t,r.get())})),s=e,l=i,f=a,d=t,m=n,g=(c=o).get(),Y(l.split(","),function(t){function e(){var e=Vp(s);return jp(s,e,t,d,m).isSome()}var n,r=ue(g,t).getOrThunk(function(){var e={withSimilar:{state:au(!1),similar:!0,callbacks:[]},withoutSimilar:{state:au(!1),similar:!1,callbacks:[]},withVars:[]};return g[t]=e});b(m)?((n=d?r.withSimilar:r.withoutSimilar).callbacks.push(f),1===n.callbacks.length&&n.state.set(e())):r.withVars.push({state:au(e()),similar:d,vars:m,callback:f})}),c.set(g),{unbind:function(){var e,t=i,n=a,r=(e=o).get();Y(t.split(","),function(t){return ue(r,t).each(function(e){r[t]={withSimilar:_e(_e({},e.withSimilar),{callbacks:U(e.withSimilar.callbacks,function(e){return e!==n})}),withoutSimilar:_e(_e({},e.withoutSimilar),{callbacks:U(e.withoutSimilar.callbacks,function(e){return e!==n})}),withVars:U(e.withVars,function(e){return e.callback!==n})}})}),e.set(r)}}}function $p(e,t){var n=(t||document).createDocumentFragment();return Y(e,function(e){n.appendChild(e.dom)}),Et.fromDom(n)}function Wp(e,t,n){return{element:e,width:t,rows:n}}function Kp(e,t){return{element:e,cells:t}}function Xp(e,t){var n=parseInt(vn(e,t),10);return isNaN(n)?1:n}function Yp(e){return L(e,function(e,t){return t.cells.length>e?t.cells.length:e},0)}function Gp(e,t){for(var n=e.rows,r=0;r<n.length;r++)for(var o=n[r].cells,i=0;i<o.length;i++)if(je(o[i],t))return ve.some({x:i,y:r});return ve.none()}function Jp(e,t,n,r,o){for(var i=[],a=e.rows,u=n;u<=o;u++){var s=a[u].cells,c=t<r?s.slice(t,r+1):s.slice(r,t+1);i.push(Kp(a[u].element,c))}return i}function Qp(e){var o=Wp(Eu(e),0,[]);return Y(yu(e,"tr"),function(n,r){Y(yu(n,"td,th"),function(e,t){!function(e,t,n,r,o){for(var i=Xp(o,"rowspan"),a=Xp(o,"colspan"),u=e.rows,s=n;s<n+i;s++){u[s]||(u[s]=Kp(ku(r),[]));for(var c=t;c<t+a;c++)u[s].cells[c]=s===n&&c===t?o:Eu(o)}}(o,function(e,t,n){for(;r=t,((o=e.rows)[n]?o[n].cells:[])[r];)t++;var r,o;return t}(o,t,r),r,n,e)})}),Wp(o.element,Yp(o.rows),o.rows)}function Zp(e,t){var n,r,o,i=Et.fromDom(t.commonAncestorContainer),a=ym(i,e),u=U(a,function(e){return Br(e)||mo(e)}),s=(o=t,M(r=a,function(e){return"li"===kt(e)&&Ol(e,o)}).fold(J([]),function(e){return M(r,function(e){return"ul"===kt(e)||"ol"===kt(e)}).map(function(e){var t=Et.fromTag(kt(e));return xn(t,ae(Nn(e),function(e,t){return Ge(t,"list-style")})),[Et.fromTag("li"),t]}).getOr([])}));return A(u.concat(s.length?s:vo(n=i)?Ot(n).filter(ho).fold(J([]),function(e){return[n,e]}):ho(n)?[n]:[]),Eu)}function eh(){return $p([])}function th(e,i){return vr(i[0],"table",R(je,e)).bind(function(e){var s,t,n=i[0],r=i[i.length-1],o=Qp(e);return t=r,Gp(s=o,n).bind(function(u){return Gp(s,t).map(function(e){return t=s,n=u.x,r=u.y,o=e.x,a=r<(i=e.y)?Jp(t,n,r,o,i):Jp(t,n,i,o,r),Wp(t.element,Yp(a),a);var t,n,r,o,i,a})}).map(function(e){return $p([(n=A((t=e).rows,function(e){var t=A(e.cells,function(e){var t=ku(e);return Cn(t,"colspan"),Cn(t,"rowspan"),t}),n=Eu(e.element);return Kt(n,t),n}),r=Eu(t.element),Kt(o=Et.fromTag("tbody"),n),Ln(r,o),r)]);var t,n,r,o})}).getOrThunk(eh)}function nh(e,t){var n,r,o,i,a,u,s,c=Rl(t,e);return 0<c.length?th(e,c):(n=e,0<(r=t).length&&r[0].collapsed?eh():(o=n,i=r[0],a=Et.fromDom(i.cloneContents()),s=L(u=Zp(o,i),function(e,t){return Ln(t,e),t},a),0<u.length?$p([s]):s))}function rh(e,t){return 0<=t&&t<e.length&&Zc(e.charAt(t))}function oh(e,t){var n=Eo(e.innerText);return t?n.replace(/^[ \f\n\r\t\v]+/,""):n}function ih(e){return Hn(e)?e.outerHTML:Vn(e)?Zo.encodeRaw(e.data,!1):qn(e)?"\x3c!--"+e.data+"--\x3e":""}function ah(e,c){var l=0;Y(e,function(e){var t,n,r,o,i,a,u,s;0===e[0]?l++:1===e[0]?(o=c,i=e[1],a=l,s=function(e){var t,n=document.createElement("div"),r=document.createDocumentFragment();for(e&&(n.innerHTML=e);t=n.firstChild;)r.appendChild(t);return r}(i),o.hasChildNodes()&&a<o.childNodes.length?(u=o.childNodes[a]).parentNode.insertBefore(s,u):o.appendChild(s),l++):2===e[0]&&(n=l,(t=c).hasChildNodes()&&n<t.childNodes.length&&(r=t.childNodes[n]).parentNode.removeChild(r))})}function uh(e){var t=e.serializer.getTempAttrs(),n=em(e.getBody(),t);return null!==n.querySelector("iframe")?{type:"fragmented",fragments:U(A(xe(n.childNodes),i(Eo,ih)),function(e){return 0<e.length}),content:"",bookmark:null,beforeBookmark:null}:{type:"complete",fragments:null,content:Eo(n.innerHTML),bookmark:null,beforeBookmark:null}}function sh(e,t,n){var r,o,i,g,p,a,h,v,c,l,u,s=n?t.beforeBookmark:t.bookmark;function b(e,t,n,r){for(var o=e;o-t<r&&o<n&&g[o]===p[o-t];)++o;return{start:e,end:o,diag:t}}"fragmented"===t.type?(r=t.fragments,o=e.getBody(),i=A(xe(o.childNodes),ih),ah((p=r,a=(g=i).length+p.length+2,h=new Array(a),v=new Array(a),c=function(e,t,n,r,o){var i=l(e,t,n,r);if(null===i||i.start===t&&i.diag===t-r||i.end===e&&i.diag===e-n)for(var a=e,u=n;a<t||u<r;)a<t&&u<r&&g[a]===p[u]?(o.push([0,g[a]]),++a,++u):r-n<t-e?(o.push([2,g[a]]),++a):(o.push([1,p[u]]),++u);else{c(e,i.start,n,i.start-i.diag,o);for(var s=i.start;s<i.end;++s)o.push([0,g[s]]);c(i.end,t,i.end-i.diag,r,o)}},l=function(e,t,n,r){var o=t-e,i=r-n;if(0==o||0==i)return null;var a,u,s,c,l,f=o-i,d=i+o,m=(d%2==0?d:1+d)/2;for(h[1+m]=e,v[1+m]=t+1,a=0;a<=m;++a){for(u=-a;u<=a;u+=2){for(s=u+m,u===-a||u!==a&&h[s-1]<h[s+1]?h[s]=h[s+1]:h[s]=h[s-1]+1,l=(c=h[s])-e+n-u;c<t&&l<r&&g[c]===p[l];)h[s]=++c,++l;if(f%2!=0&&f-a<=u&&u<=f+a&&v[s-f]<=h[s])return b(v[s-f],u+e-n,t,r)}for(u=f-a;u<=f+a;u+=2){for(s=u+m-f,u===f-a||u!==f+a&&v[s+1]<=v[s-1]?v[s]=v[s+1]-1:v[s]=v[s-1],l=(c=v[s]-1)-e+n-u;e<=c&&n<=l&&g[c]===p[l];)v[s]=c--,l--;if(f%2==0&&-a<=u&&u<=a&&v[s]<=h[s+f])return b(v[s],u+e-n,t,r)}}},u=[],c(0,g.length,0,p.length,u),u),o)):e.setContent(t.content,{format:"raw",no_selection:!V(s)||!$c(s)||!s.isFakeCaret}),e.selection.moveToBookmark(s)}function ch(e){return"fragmented"===e.type?e.fragments.join(""):e.content}function lh(e){var t=Et.fromTag("body",Lh());return Su(t,ch(e)),Y(yu(t,"*[data-mce-bogus]"),Yt),t.dom.innerHTML}function fh(e,t){return!(!e||!t)&&(r=t,ch(e)===ch(r)||(n=t,lh(e)===lh(n)));var n,r}function dh(e){return 0===e.get()}function mh(e,t,n){dh(n)&&(e.typing=t)}function gh(e,t){e.typing&&(mh(e,!1,t),e.add())}function ph(c){return{undoManager:{beforeChange:function(e,t){var n=c,r=t;dh(e)&&r.set(hc(n.selection))},add:function(e,t,n,r,o,i){return function(e,t,n,r,o,i,a){var u=uh(e);if(i=Nt.extend(i=i||{},u),!1===dh(r)||e.removed)return null;var s=t.data[n.get()];if(e.fire("BeforeAddUndo",{level:i,lastLevel:s,originalEvent:a}).isDefaultPrevented())return null;if(s&&fh(s,i))return null;t.data[n.get()]&&o.get().each(function(e){t.data[n.get()].beforeBookmark=e});var c=e.getParam("custom_undo_redo_levels",0,"number");if(c&&t.data.length>c){for(var l=0;l<t.data.length-1;l++)t.data[l]=t.data[l+1];t.data.length--,n.set(t.data.length)}i.bookmark=hc(e.selection),n.get()<t.data.length-1&&(t.data.length=n.get()+1),t.data.push(i),n.set(t.data.length-1);var f={level:i,lastLevel:s,originalEvent:a};return 0<n.get()?(e.setDirty(!0),e.fire("AddUndo",f),e.fire("change",f)):e.fire("AddUndo",f),i}(c,e,t,n,r,o,i)},undo:function(e,t,n){return r=c,i=t,a=n,(o=e).typing&&(o.add(),o.typing=!1,mh(o,!1,i)),0<a.get()&&(a.set(a.get()-1),sh(r,u=o.data[a.get()],!0),r.setDirty(!0),r.fire("Undo",{level:u})),u;var r,o,i,a,u},redo:function(e,t){return n=c,o=t,(r=e).get()<o.length-1&&(r.set(r.get()+1),sh(n,i=o[r.get()],!1),n.setDirty(!0),n.fire("Redo",{level:i})),i;var n,r,o,i},clear:function(e,t){var n,r=c,o=t;(n=e).data=[],o.set(0),n.typing=!1,r.fire("ClearUndos")},reset:function(e){var t;(t=e).clear(),t.add()},hasUndo:function(e,t){return n=c,r=e,0<t.get()||r.typing&&r.data[0]&&!fh(uh(n),r.data[0]);var n,r},hasRedo:function(e,t){return n=e,t.get()<n.data.length-1&&!n.typing;var n},transact:function(e,t,n){return o=n,gh(r=e,t),r.beforeChange(),r.ignore(o),r.add();var r,o},ignore:function(e,t){try{e.set(e.get()+1),t()}finally{e.set(e.get()-1)}},extra:function(e,t,n,r){var o,i,a=c,u=t,s=r;(o=e).transact(n)&&(i=o.data[u.get()].bookmark,sh(a,o.data[u.get()-1],!0),o.transact(s)&&(o.data[u.get()-1].beforeBookmark=i))}},formatter:{match:function(e,t,n,r){return Ig(c,e,t,n,r)},matchAll:function(e,t){return o=e,i=t,a=[],u={},n=(r=c).selection.getStart(),r.dom.getParent(n,function(e){for(var t=0;t<o.length;t++){var n=o[t];!u[n]&&yp(r,e,n,i)&&(u[n]=!0,a.push(n))}},r.dom.getRoot()),a;var r,o,i,a,u,n},matchNode:function(e,t,n,r){return yp(c,e,t,n,r)},canApply:function(u){return function(e){var t=e.formatter.get(u),n=e.dom;if(t)for(var r=fl(n,e.selection.getStart()),o=t.length-1;0<=o;o--){var i=t[o];if(!gl(i)||V(i.defaultBlock))return!0;for(var a=r.length-1;0<=a;a--)if(n.is(r[a],i.selector))return!0}return!1}(c)},closest:function(e){return r=c,o=e,ve.from(r.selection.getStart(!0)).bind(function(e){return Tg(Et.fromDom(e),function(n){return ee(o,function(e){return yp(r,n.dom,t=e)?ve.some(t):ve.none();var t})},t)}).getOrNull();function t(e){return je(e,Et.fromDom(r.getBody()))}var r,o},apply:function(e,t,n){return Oh(c,e,t,n)},remove:function(e,t,n,r){return Up(c,e,t,n,r)},toggle:function(e,t,n){var r,o=e,i=t,a=n,u=(r=c).formatter.get(o);(!Ig(r,o,i,a)||"toggle"in u[0]&&!u[0].toggle?Oh:Up)(r,o,i,a)},formatChanged:function(e,t,n,r,o){return qp(c,e,t,n,r,o)}},editor:{getContent:function(e,t){return d=c,m=e,g=t,ve.from(d.getBody()).fold(J("tree"===m.format?new jd("body",11):""),function(e){return t=d,r=e,o=g,c=_e(_e({},n=m),{format:o,get:!0,getInner:!0}),l=n.no_events?c:t.fire("BeforeGetContent",c),f="raw"===l.format?Nt.trim(Eo(em(r,t.serializer.getTempAttrs()).innerHTML)):"text"===l.format?t.dom.isEmpty(r)?"":Eo(r.innerText||r.textContent):"tree"===l.format?t.serializer.serialize(r,l):(a=(i=t).serializer.serialize(r,l),u=ks(i),s=new RegExp("^(<"+u+"[^>]*>( | |\\s|\xa0|<br \\/>|)<\\/"+u+">[\r\n]*|<br \\/>[\r\n]*)$"),a.replace(s,"")),T(["text","tree"],l.format)||Co(Et.fromDom(r))?l.content=f:l.content=Nt.trim(f),(l.no_events?l:t.fire("GetContent",l)).content;var t,n,r,o,i,a,u,s,c,l,f});var d,m,g},setContent:function(e,t){return Rg(c,e,t)},insertContent:function(e,t){return kg(c,e,t)},addVisual:function(e){var i,t=e,a=(i=c).dom,n=V(t)?t:i.getBody();b(i.hasVisual)&&(i.hasVisual=i.getParam("visual",!0,"boolean")),Y(a.select("table,a",n),function(e){switch(e.nodeName){case"TABLE":var t=i.getParam("visual_table_class","mce-item-table","string"),n=a.getAttrib(e,"border");n&&"0"!==n||!i.hasVisual?a.removeClass(e,t):a.addClass(e,t);break;case"A":var r,o;a.getAttrib(e,"href")||(r=a.getAttrib(e,"name")||e.id,o=i.getParam("visual_anchor_class","mce-item-anchor","string"),r&&i.hasVisual?a.addClass(e,o):a.removeClass(e,o))}}),i.fire("VisualAid",{element:t,hasVisual:i.hasVisual})}},selection:{getContent:function(e,t){return function(e,t,n){var r,o=(r=t,_e(_e({},n=void 0===n?{}:n),{format:r,get:!0,selection:!0})),i=e.fire("BeforeGetContent",o);if(i.isDefaultPrevented())return e.fire("GetContent",i),i.content;if("text"===i.format)return m=e,ve.from(m.selection.getRng()).map(function(e){var t=ve.from(m.dom.getParent(e.commonAncestorContainer,m.dom.isBlock)),n=m.getBody(),r=t.map(function(e){return e.nodeName}).getOr("div").toLowerCase(),o=xt.browser.isIE()&&"pre"!==r,i=m.dom.add(n,r,{"data-mce-bogus":"all",style:"overflow: hidden; opacity: 0;"},e.cloneContents()),a=oh(i,o),u=Eo(i.textContent);if(m.dom.remove(i),rh(u,0)||rh(u,u.length-1)){var s=oh(t.getOr(n),o),c=s.indexOf(a);return-1===c?a:(rh(s,c-1)?" ":"")+a+(rh(s,c+a.length)?" ":"")}return a}).getOr("");i.getInner=!0;var a,u,s,c,l,f,d,m,g=(u=i,s=(a=e).selection.getRng(),c=a.dom.create("body"),l=a.selection.getSel(),f=Ed(a,Al(l)),(d=u.contextual?nh(Et.fromDom(a.getBody()),f).dom:s.cloneContents())&&c.appendChild(d),a.selection.serializer.serialize(c,u));return"tree"===i.format?g:(i.content=e.selection.isCollapsed()?"":g,e.fire("GetContent",i),i.content)}(c,e,t)}},raw:{getModel:function(){return ve.none()}}}}function hh(e){return Ee(e.plugins,"rtc")}function vh(e){var u=e;return ue(e.plugins,"rtc").bind(function(e){return ve.from(e.setup)}).fold(function(){return u.rtcInstance=ph(e),ve.none()},function(e){var t,n;return u.rtcInstance=(t=J(null),n=J(""),{undoManager:{beforeChange:te,add:t,undo:t,redo:t,clear:te,reset:te,hasUndo:D,hasRedo:D,transact:t,ignore:te,extra:te},formatter:{match:D,matchAll:J([]),matchNode:J(void 0),canApply:D,closest:n,apply:te,remove:te,toggle:te,formatChanged:J({unbind:te})},editor:{getContent:n,setContent:n,insertContent:te,addVisual:te},selection:{getContent:n},raw:{getModel:J(ve.none())}}),ve.some(function(){return e().then(function(e){return u.rtcInstance=(i=e.undoManager,a=e.formatter,n=e.editor,r=e.selection,t=e.raw,{undoManager:{beforeChange:i.beforeChange,add:i.add,undo:i.undo,redo:i.redo,clear:i.clear,reset:i.reset,hasUndo:i.hasUndo,hasRedo:i.hasRedo,transact:function(e,t,n){return i.transact(n)},ignore:function(e,t){return i.ignore(t)},extra:function(e,t,n,r){return i.extra(n,r)}},formatter:{match:function(e,t,n,r){return a.match(e,o(t),r)},matchAll:a.matchAll,matchNode:a.matchNode,canApply:function(e){return a.canApply(e)},closest:function(e){return a.closest(e)},apply:function(e,t,n){return a.apply(e,o(t))},remove:function(e,t,n,r){return a.remove(e,o(t))},toggle:function(e,t,n){return a.toggle(e,o(t))},formatChanged:function(e,t,n,r,o){return a.formatChanged(t,n,r,o)}},editor:{getContent:function(e,t){return n.getContent(e)},setContent:function(e,t){return n.setContent(e,t)},insertContent:function(e,t){return n.insertContent(e)},addVisual:n.addVisual},selection:{getContent:function(e,t){return r.getContent(t)}},raw:{getModel:function(){return ve.some(t.getRawModel())}}}),e.rtc.isRemote;function o(e){return h(e)?e:{}}var i,a,n,r,t})})})}function bh(e){return e.rtcInstance||ph(e)}function yh(e){var t=e.rtcInstance;if(t)return t;throw new Error("Failed to get RTC instance not yet initialized.")}function Ch(e){return 0===e.dom.length?(In(e),ve.none()):ve.some(e)}function xh(e,t,u,s){e.bind(function(a){return(s?jm:Hm)(a.dom,s?a.dom.length:0),t.filter(An).map(function(e){var t=u,n=s,r=a.dom,o=e.dom,i=(n?r:o).length;n?(Vm(r,o,!1,!n),t.setStart(o,i)):(Vm(o,r,!1,!n),t.setEnd(o,i))})}).orThunk(function(){var e=s;return t.filter(function(e){return Hl.isBookmarkNode(e.dom)}).bind(e?Pt:Bt).or(t).filter(An).map(function(e){var n,r=s;Ot(n=e).each(function(e){var t=n.dom;r&&Bm(e,cs(t,0))?Hm(t,0):!r&&Pm(e,cs(t,t.length))&&jm(t,t.length)})})})}function wh(e,t,n){var r,o=(r=t,_e(_e({format:"html"},n=void 0===n?{}:n),{set:!0,selection:!0,content:r})),i=o;if(!o.no_events){var a=e.fire("BeforeSetContent",o);if(a.isDefaultPrevented())return void e.fire("SetContent",a);i=a}i.content=function(e,t){if("raw"===t.format)return t.content;var n=e.selection.getRng(),r=e.dom.getParent(n.commonAncestorContainer,e.dom.isBlock),o=r?{context:r.nodeName.toLowerCase()}:{},i=e.parser.parse(t.content,_e(_e({isRootContent:!0,forced_root_block:!1},o),t));return rm({validate:e.validate},e.schema).serialize(i)}(e,i);var u=e.selection.getRng();!function(e,t){var n=ve.from(t.firstChild).map(Et.fromDom),r=ve.from(t.lastChild).map(Et.fromDom);e.deleteContents(),e.insertNode(t);var o=n.bind(Bt).filter(An).bind(Ch),i=r.bind(Pt).filter(An).bind(Ch);xh(o,n,e,!0),xh(i,r,e,!1),e.collapse(!1)}(u,u.createContextualFragment(i.content)),e.selection.setRng(u),nd(e,u),i.no_events||e.fire("SetContent",i)}function Sh(e,t,n){var r;e&&Ee(e,t)&&(0===(r=U(e[t],function(e){return e!==n})).length?delete e[t]:e[t]=r)}Kg=function(e){var t,n=e.selection.getRng(),r=on(["pre"]);n.collapsed||(t=e.selection.getSelectedBlocks(),Np(Sp(Sp(t,r),function(e){return r(e.previousSibling)&&-1!==de(t,e.previousSibling)}),function(e){var t,n=e.previousSibling;Ya(t=e).remove(),Ya(n).append("<br><br>").append(t.childNodes)}))},wp["pre"]||(wp.pre=[]),wp.pre.push(Kg);var Nh=Nt.each,Eh=function(e,t,n){Nh(e.childNodes,function(e){Ep(e)&&(t(e)&&n(e),e.hasChildNodes()&&Eh(e,t,n))})},kh=ir([{keep:[]},{rename:["name"]},{removed:[]}]),_h=/^(src|href|style)$/,Ah=Nt.each,Rh=ul,Dh=Nt.each,Th=Nt.each,Oh=function(S,N,E,r){function k(n,e){var t;y((e=void 0===e?A:e).onformat)&&e.onformat(n,e,E,r),Th(e.styles,function(e,t){u.setStyle(n,t,al(e,E))}),!e.styles||(t=u.getAttrib(n,"style"))&&u.setAttrib(n,"data-mce-style",t),Th(e.attributes,function(e,t){u.setAttrib(n,t,al(e,E))}),Th(e.classes,function(e){e=al(e,E),u.hasClass(n,e)||u.addClass(n,e)})}function g(e,t){var n=!1;return Th(e,function(e){return!!gl(e)&&(V(e.collapsed)&&e.collapsed!==a||!u.is(t,e.selector)||Vc(t)?void 0:(k(t,e),!(n=!0)))}),n}function o(x,e,l){var w=[],f=!0,d=A.inline||A.block,m=function(e){if(X(e)){var t=u.create(e);return k(t),t}return null}(d);_l(x,e,function(e){var s,c=function(e){var t=!1,n=f,r=e.nodeName.toLowerCase(),o=e.parentNode,i=o.nodeName.toLowerCase();if(Hn(e)&&x.getContentEditable(e)&&(n=f,f="true"===x.getContentEditable(e),t=!0),Kn(e)&&!function(e,t,n,r){if(e.getParam("format_empty_lines",!1,"boolean")&&pl(t)){var o=no(e.schema),i=(a=Et.fromDom(n),s=function(e){return Vc(e.dom)},((c=(u=a).dom).parentNode?kr(Et.fromDom(c.parentNode),function(e){return!je(u,e)&&s(e)}):ve.none()).isSome());return se(o,r)&&Kr(Et.fromDom(n.parentNode),!1)&&!i}var a,u,s,c}(S,A,e,i))return s=null,void(ml(A)&&x.remove(e));if(ml(A)&&A.wrapper&&yp(S,e,N,E))s=null;else{if(f&&!t&&ml(A)&&!A.wrapper&&ol(S,r)&&il(S,i,d)){var a=x.rename(e,d);return k(a),w.push(a),void(s=null)}if(gl(A)){var u=g(_,e);if(!u&&V(o)&&hl(A)&&(u=g(_,o)),!pl(A)||u)return void(s=null)}!f||t||!il(S,d,r)||!il(S,i,d)||!l&&Vn(e)&&No(e.data)||Vc(e)||pl(A)&&x.isBlock(e)?(s=null,Y(xe(e.childNodes),c),t&&(f=n),s=null):(s||(s=x.clone(m,!1),e.parentNode.insertBefore(s,e),w.push(s)),s.appendChild(e))}};Y(e,c)}),!0===A.links&&Y(w,function(e){var t=function(e){"A"===e.nodeName&&k(e,A),Y(xe(e.childNodes),t)};t(e)}),Y(w,function(e){var n,t,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y=(n=0,Y(e.childNodes,function(e){var t;V(t=e)&&Vn(t)&&0===t.length||Qc(e)||n++}),n);function C(e){var t;1===e.nodeType&&e.parentNode&&1===e.parentNode.nodeType&&(t=ll(m,e.parentNode),m.getStyle(e,"color")&&t?m.setStyle(e,"text-decoration",t):m.getStyle(e,"text-decoration")===t&&m.setStyle(e,"text-decoration",null))}!(1<w.length)&&x.isBlock(e)||0!==y?(pl(A)||ml(A)&&A.wrapper)&&(A.exact||1!==y||(e=M((d=e).childNodes,zp).filter(function(e){return Pg(x,e,A)}).map(function(e){var t=x.clone(e,!1);return k(t),x.replace(t,d,!0),x.remove(e,!0),t}).getOr(d)),h=S,v=E,b=e,Dh(_,function(t){var r,e,n;pl(t)&&Dh(h.dom.select(t.inline,b),function(e){Ep(e)&&Fp(h,t,v,e,t.exact?e:null)}),r=h.dom,(e=t).clear_child_styles&&(n=e.links?"*:not(a)":"*",Nh(r.select(n,b),function(n){Ep(n)&&Nh(e.styles,function(e,t){r.setStyle(n,t,"")})}))}),s=A,yp(u=S,(f=e).parentNode,c=N,l=E)&&Fp(u,s,l,f)||s.merge_with_parents&&u.dom.getParent(f.parentNode,function(e){if(yp(u,e,c,l))return Fp(u,s,l,f),!0}),a=e,(i=A).styles&&i.styles.backgroundColor&&Eh(a,Rp(x,"fontSize"),Dp(x,"backgroundColor",al(i.styles.backgroundColor,E))),m=x,p=e,(g=A).styles&&(g.styles.color||g.styles.textDecoration)&&(Nt.walk(p,C,"childNodes"),C(p)),t=x,o=e,!pl(r=A)||"sub"!==r.inline&&"sup"!==r.inline||(Eh(o,Rp(t,"fontSize"),Dp(t,"fontSize","")),t.remove(t.select("sup"===r.inline?"sub":"sup",o),!0)),Ap(x,A,0,e)):x.remove(e,!0)})}var e,t,n,i,_=S.formatter.get(N),A=_[0],a=!r&&S.selection.isCollapsed(),u=S.dom,s=S.selection;if("false"!==u.getContentEditable(s.getNode()))A&&(r?tl(r)?g(_,r)||((e=u.createRng()).setStartBefore(r),e.setEndAfter(r),o(u,kl(S,e,_),!0)):o(u,r,!0):a&&pl(A)&&!Dl(S).length?function(e,t,n){var r,o=e.selection,i=o.getRng(),a=i.startOffset,u=i.startContainer.nodeValue,s=qc(e.getBody(),o.getStart());s&&(r=Fg(s));var c,l,f,d,m=/[^\s\u00a0\u00ad\u200b\ufeff]/;u&&0<a&&a<u.length&&m.test(u.charAt(a))&&m.test(u.charAt(a-1))?(c=o.getBookmark(),i.collapse(!0),l=Pf(kl(e,i,e.formatter.get(t))),e.formatter.apply(t,n,l),o.moveToBookmark(c)):(s&&r.nodeValue===Cp||(f=e.getDoc(),d=Ug(!0).dom,r=(s=f.importNode(d,!0)).firstChild,i.insertNode(s),a=1),e.formatter.apply(t,n,s),o.setCursorLocation(r,a))}(S,N,E):(t=s.getNode(),n=_[0],S.settings.forced_root_block||!n.defaultBlock||u.getParent(t,u.isBlock)||Oh(S,n.defaultBlock),s.setRng(Cg(s.getRng())),Il(s,!0,function(){Ll(S,function(e,t){var n=t?e:kl(S,e,_);o(u,n,!1)})}),nl(u,s,s.getRng()),S.nodeChanged()),i=S,Np(wp[N],function(e){e(i)})),xf(S,N,r,E);else{r=s.getNode();for(var c=0,l=_.length;c<l;c++){var f=_[c];if(f.ceFalseOverride&&gl(f)&&u.is(r,f.selector)){k(r,f);break}}xf(S,N,r,E)}},Bh=function(e){return e.selection.getStart()},Ph=function(i,a,e){var u=Vp(i,a);ne(e,function(e,o){function t(e){var t,n=jp(i,u,o,e.similar,Hp(e)?e.vars:void 0),r=n.isSome();e.state.get()!==r&&(e.state.set(r),t=n.getOr(a),Hp(e)?e.callback(r,{node:t,format:o,parents:u}):Y(e.callbacks,function(e){return e(r,{node:t,format:o,parents:u})}))}Y([e.withSimilar,e.withoutSimilar],t),Y(e.withVars,t)})},Lh=Re(function(){return document.implementation.createHTMLDocument("undo")});function Ih(e){return e.select}function Mh(e){return e&&e.ownerDocument&&Ve(Et.fromDom(e.ownerDocument),Et.fromDom(e))}function Fh(a,u,e,s){function t(e,t){return wh(s,e,t)}function n(){var e=c(),t=null==e?void 0:e.anchorNode,n=null==e?void 0:e.focusNode;if(!e||!t||!n||rn(t)||rn(n))return!0;var r=a.createRng();r.setStart(t,e.anchorOffset),r.collapse(!0);var o=a.createRng();return o.setStart(n,e.focusOffset),o.collapse(!0),r.compareBoundaryPoints(r.START_TO_START,o)<=0}function r(e){var t=p();t.collapse(!!e),h(t)}function c(){return u.getSelection?u.getSelection():u.document.selection}var l,f,o,i,d,m,g=function(e,t){return d||(d={},m={},i.on("NodeChange",function(e){var n=e.element,r=x(n),o={};Nt.each(d,function(e,n){C(n,r).each(function(t){m[n]||(Y(e,function(e){e(!0,{node:t,selector:n,parents:r})}),m[n]=e),o[n]=e})}),Nt.each(m,function(e,t){o[t]||(delete m[t],Nt.each(e,function(e){e(!1,{node:n,selector:t,parents:r})}))})})),d[e]||(d[e]=[]),d[e].push(t),C(e,x(i.selection.getStart())).each(function(){m[e]=d[e]}),{unbind:function(){Sh(d,e,t),Sh(m,e,t)}}},p=function(){function e(e,t,n){try{return t.compareBoundaryPoints(e,n)}catch(e){return-1}}var t,n,r,o=u.document;if(void 0!==s.bookmark&&!1===Cd(s)){var i=md(s);if(i.isSome())return i.map(function(e){return Ed(s,[e])[0]}).getOr(o.createRange())}try{(t=c())&&!rn(t.anchorNode)&&(n=0<t.rangeCount?t.getRangeAt(0):(t.createRange?t:o).createRange(),n=Ed(s,[n])[0])}catch(e){}return(n=n||(o.createRange?o.createRange():o.body.createTextRange())).setStart&&9===n.startContainer.nodeType&&n.collapsed&&(r=a.getRoot(),n.setStart(r,0),n.setEnd(r,0)),l&&f&&(0===e(n.START_TO_START,n,l)&&0===e(n.END_TO_END,n,l)?n=f:f=l=null),n},h=function(e,t){var n;if((r=e)&&(Ih(r)||Mh(r.startContainer)&&Mh(r.endContainer))){var r,o=Ih(e)?e:null;if(o){f=null;try{o.select()}catch(e){}}else{var i=c();if(e=s.fire("SetSelectionRange",{range:e,forward:t}).range,i){f=e;try{i.removeAllRanges(),i.addRange(e)}catch(e){}!1===t&&i.extend&&(i.collapse(e.endContainer,e.endOffset),i.extend(e.startContainer,e.startOffset)),l=0<i.rangeCount?i.getRangeAt(0):null}e.collapsed||e.startContainer!==e.endContainer||!i.setBaseAndExtent||xt.ie||e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(n=e.startContainer.childNodes[e.startOffset])&&"IMG"===n.tagName&&(i.setBaseAndExtent(e.startContainer,e.startOffset,e.endContainer,e.endOffset),i.anchorNode===e.startContainer&&i.focusNode===e.endContainer||i.setBaseAndExtent(n,0,n,1)),s.fire("AfterSetSelectionRange",{range:e,forward:t})}}},v={bookmarkManager:null,controlSelection:null,dom:o=a,win:u,serializer:e,editor:i=s,collapse:r,setCursorLocation:function(e,t){var n=a.createRng();V(e)&&V(t)?(n.setStart(e,t),n.setEnd(e,t),h(n),r(!1)):(Bl(a,n,s.getBody(),!0),h(n))},getContent:function(e){return n=(t=void 0===(t=e)?{}:t).format||"html",r=t,yh(s).selection.getContent(n,r);var t,n,r},setContent:t,getBookmark:function(e,t){return b.getBookmark(e,t)},moveToBookmark:function(e){return b.moveToBookmark(e)},select:function(e,t){var r=a,o=t;return ve.from(e).map(function(e){var t=r.nodeIndex(e),n=r.createRng();return n.setStart(e.parentNode,t),n.setEnd(e.parentNode,t+1),o&&(Bl(r,n,e,!0),Bl(r,n,e,!1)),n}).each(h),e},isCollapsed:function(){var e=p(),t=c();return!(!e||e.item)&&(e.compareEndPoints?0===e.compareEndPoints("StartToEnd",e):!t||e.collapsed)},isForward:n,setNode:function(e){return t(a.getOuterHTML(e)),e},getNode:function(){return function(e,t){if(!t)return e;var n=t.startContainer,r=t.endContainer,o=t.startOffset,i=t.endOffset,a=t.commonAncestorContainer;return!t.collapsed&&(n===r&&i-o<2&&n.hasChildNodes()&&(a=n.childNodes[o]),3===n.nodeType&&3===r.nodeType&&(n=n.length===o?Nd(n.nextSibling,!0):n.parentNode,r=0===i?Nd(r.previousSibling,!1):r.parentNode,n&&n===r))?n:a&&3===a.nodeType?a.parentNode:a}(s.getBody(),p())},getSel:c,setRng:h,getRng:p,getStart:function(e){return wd(s.getBody(),p(),e)},getEnd:function(e){return Sd(s.getBody(),p(),e)},getSelectedBlocks:function(e,t){return function(e,t,n,r){var o=[],i=e.getRoot();if(n=e.getParent(n||wd(i,t,t.collapsed),e.isBlock),r=e.getParent(r||Sd(i,t,t.collapsed),e.isBlock),n&&n!==i&&o.push(n),n&&r&&n!==r)for(var a,u=new Dr(n,i);(a=u.next())&&a!==r;)e.isBlock(a)&&o.push(a);return r&&n!==r&&r!==i&&o.push(r),o}(a,p(),e,t)},normalize:function(){var e=p();if(1<Al(c()).length||!Pl(s))return e;var t=Of(a,e);return t.each(function(e){h(e,n())}),t.getOr(e)},selectorChanged:function(e,t){return g(e,t),v},selectorChangedWithUnbind:g,getScrollContainer:function(){for(var e,t=a.getRoot();t&&"BODY"!==t.nodeName;){if(t.scrollHeight>t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){V(e)?(s.inline?Zf:td)(s,e,t):nd(s,p(),t)},placeCaretAt:function(e,t){return h(Ef(e,t,s.getDoc()))},getBoundingClientRect:function(){var e=p();return e.collapsed?cs.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){u=l=f=null,y.destroy()}},b=Hl(v),y=Sf(v,s);function C(t,e){return M(e,function(e){return o.is(e,t)})}function x(e){return o.getParents(e,null,o.getRoot())}return v.bookmarkManager=b,v.controlSelection=y,v}function Uh(e,t){var n,r,a,u,o=ao();t.convert_fonts_to_spans&&(r=e,a=o,u=Nt.explode(t.font_size_legacy_values),r.addNodeFilter("font",function(e){Y(e,function(e){var t,n=a.parse(e.attr("style")),r=e.attr("color"),o=e.attr("face"),i=e.attr("size");r&&(n.color=r),o&&(n["font-family"]=o),i&&(n["font-size"]=u[parseInt(e.attr("size"),10)-1]),e.name="span",e.attr("style",a.serialize(n)),t=e,Y(["color","face","size"],function(e){t.attr(e,null)})})})),n=o,e.addNodeFilter("strike",function(e){Y(e,function(e){var t=n.parse(e.attr("style"));t["text-decoration"]="line-through",e.name="span",e.attr("style",n.serialize(t))})})}function zh(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return{type:t=r?r[1]:t,data:n[1]}}function Hh(e,t){var n;try{n=atob(t)}catch(e){return ve.none()}for(var r=new Uint8Array(n.length),o=0;o<r.length;o++)r[o]=n.charCodeAt(o);return ve.some(new Blob([r],{type:e}))}function jh(e){return 0===e.indexOf("blob:")?(o=e,new _r(function(e,t){function n(){t("Cannot convert "+o+" to Blob. Resource might not exist or is inaccessible.")}try{var r=new XMLHttpRequest;r.open("GET",o,!0),r.responseType="blob",r.onload=function(){200===r.status?e(r.response):n()},r.onerror=n,r.send()}catch(e){n()}})):0===e.indexOf("data:")?(n=e,new _r(function(e){var t=zh(n);Hh(t.type,t.data).fold(function(){return e(new Blob([]))},e)})):null;var o,n}function Vh(e){return(e||"blobid")+Yh++}function qh(r,d){var o={};return{findAll:function(e,n){n=n||w;var t=A(U(e?xe(e.getElementsByTagName("img")):[],function(e){var t=e.src;return xt.fileApi&&!e.hasAttribute("data-mce-bogus")&&!e.hasAttribute("data-mce-placeholder")&&t&&t!==xt.transparentSrc&&(0===t.indexOf("blob:")?!r.isUploaded(t)&&n(e):0===t.indexOf("data:")&&n(e))}),function(f){if(void 0!==o[f.src])return new _r(function(t){o[f.src].then(function(e){return"string"==typeof e?e:void t({image:f,blobInfo:e.blobInfo})})});var e=new _r(function(e,t){var r,o,i,n,a,u,s,c,l;r=d,i=e,n=t,0!==(o=f).src.indexOf("blob:")?(u=(a=zh(o.src)).data,s=a.type,c=u,(l=r.getByData(c,s))?i({image:o,blobInfo:l}):jh(o.src).then(function(e){l=r.create(Vh(),e,c),r.add(l),i({image:o,blobInfo:l})},function(e){n(e)})):(l=r.getByUri(o.src))?i({image:o,blobInfo:l}):jh(o.src).then(function(t){var n=t;new _r(function(e){var t=new FileReader;t.onloadend=function(){e(t.result)},t.readAsDataURL(n)}).then(function(e){c=zh(e).data,l=r.create(Vh(),t,c),r.add(l),i({image:o,blobInfo:l})})},function(e){n(e)})}).then(function(e){return delete o[e.image.src],e}).catch(function(e){return delete o[f.src],e});return o[f.src]=e});return _r.all(t)}}}function $h(e,t){return e.replace(t.re,function(e){return ue(t.uris,e).getOr(e)})}function Wh(e,t,n,r){(e.padd_empty_with_br||t.insert)&&n[r.name]?r.empty().append(new jd("br",1)).shortEnded=!0:r.empty().append(new jd("#text",3)).value=wo}function Kh(n,e,t,r){return r.isEmpty(e,t,function(e){return(t=n.getElementRule(e.name))&&t.paddEmpty;var t})}function Xh(e,p){var t,o,i,h=e.schema;function n(t){var e,n,r=t.attr("src");(e=t).attr("src")===xt.transparentSrc||V(e.attr("data-mce-placeholder"))||V(t.attr("data-mce-bogus"))||((n=/data:([^;]+);base64,([a-z0-9\+\/=\s]+)/i.exec(r))?ve.some({type:n[1],data:decodeURIComponent(n[2])}):ve.none()).filter(function(){return function(e,t){if(t.images_dataimg_filter){var n=new Image;return n.src=e.attr("src"),ne(e.attributes.map,function(e,t){n.setAttribute(t,e)}),t.images_dataimg_filter(n)}return!0}(t,o)}).bind(function(e){var t=e.type,n=e.data;return ve.from(i.getByData(n,t)).orThunk(function(){return Hh(t,n).map(function(e){var t=i.create(Vh(),e,n);return i.add(t),t})})}).each(function(e){t.attr("src",e.blobUri())})}p.remove_trailing_brs&&e.addNodeFilter("br",function(e,t,n){var r,o,i,a,u,s,c,l,f=e.length,d=Nt.extend({},h.getBlockElements()),m=h.getNonEmptyElements(),g=h.getWhiteSpaceElements();for(d.body=1,r=0;r<f;r++)if(i=(o=e[r]).parent,d[o.parent.name]&&o===i.lastChild){for(u=o.prev;u;){if("span"!==(s=u.name)||"bookmark"!==u.attr("data-mce-type")){"br"===s&&(o=null);break}u=u.prev}o&&(o.remove(),Kh(h,m,g,i)&&(c=h.getElementRule(i.name))&&(c.removeEmpty?i.remove():c.paddEmpty&&Wh(p,n,d,i)))}else{for(a=o;i&&i.firstChild===a&&i.lastChild===a&&!d[(a=i).name];)i=i.parent;a===i&&!0!==p.padd_empty_with_br&&((l=new jd("#text",3)).value=wo,o.replace(l))}}),e.addAttributeFilter("href",function(e){var t,n,r=e.length;if(!p.allow_unsafe_link_target)for(;r--;){var o=e[r];"a"===o.name&&"_blank"===o.attr("target")&&o.attr("rel",(n=void 0,n=(t=o.attr("rel"))?Nt.trim(t):"",/\b(noopener)\b/g.test(n)?n:n.split(" ").filter(function(e){return 0<e.length}).concat(["noopener"]).sort().join(" ")))}}),p.allow_html_in_named_anchor||e.addAttributeFilter("id,name",function(e){for(var t,n,r,o,i=e.length;i--;)if("a"===(o=e[i]).name&&o.firstChild&&!o.attr("href"))for(r=o.parent,t=o.lastChild;n=t.prev,r.insert(t,o),t=n;);}),p.fix_list_elements&&e.addNodeFilter("ul,ol",function(e){for(var t,n,r,o=e.length;o--;)"ul"!==(r=(n=e[o]).parent).name&&"ol"!==r.name||(n.prev&&"li"===n.prev.name?n.prev.append(n):((t=new jd("li",1)).attr("style","list-style-type: none"),n.wrap(t)))}),p.validate&&h.getValidClasses()&&e.addAttributeFilter("class",function(e){for(var t=h.getValidClasses(),n=e.length;n--;){for(var r=e[n],o=r.attr("class").split(" "),i="",a=0;a<o.length;a++){var u=o[a],s=!1,c=t["*"];c&&c[u]&&(s=!0),c=t[r.name],(s=!(s||!c||!c[u])||s)&&(i&&(i+=" "),i+=u)}i.length||(i=null),r.attr("class",i)}}),t=e,(i=(o=p).blob_cache)&&t.addAttributeFilter("src",function(e){return Y(e,n)})}var Yh=0,Gh=function(e,t){return e&&e.firstChild&&e.firstChild===e.lastChild&&e.firstChild.name===t},Jh=Nt.each,Qh=Nt.trim,Zh="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),ev={ftp:21,http:80,https:443,mailto:25},tv=["img","video"],nv=(rv.parseDataUri=function(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return{type:t=r?r[1]:t,data:n[1]}},rv.isDomSafe=function(e,t,n){if((n=void 0===n?{}:n).allow_script_urls)return!0;var r,o,i,a,u=Zo.decode(e).replace(/[\s\u0000-\u001F]+/g,"");try{u=decodeURIComponent(u)}catch(e){u=unescape(u)}return!(/((java|vb)script|mhtml):/i.test(u)||(o=u,i=t,!(r=n).allow_html_data_urls&&(/^data:image\//i.test(o)?(V(a=r.allow_svg_data_urls)?!a:!V(i)||!T(tv,i))&&/^data:image\/svg\+xml/i.test(o):/^data:/i.test(o))))},rv.getDocumentBaseUrl=function(e){var t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname;return/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t},rv.prototype.setPath=function(e){var t=/^(.*?)\/?(\w+)?$/.exec(e);this.path=t[0],this.directory=t[1],this.file=t[2],this.source="",this.getURI()},rv.prototype.toRelative=function(e){var t;if("./"===e)return e;var n=new rv(e,{base_uri:this});if("mce_host"!==n.host&&this.host!==n.host&&n.host||this.port!==n.port||this.protocol!==n.protocol&&""!==n.protocol)return n.getURI();var r=this.getURI(),o=n.getURI();return r===o||"/"===r.charAt(r.length-1)&&r.substr(0,r.length-1)===o?r:(t=this.toRelPath(this.path,n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),t)},rv.prototype.toAbsolute=function(e,t){var n=new rv(e,{base_uri:this});return n.getURI(t&&this.isSameOrigin(n))},rv.prototype.isSameOrigin=function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=ev[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},rv.prototype.toRelPath=function(e,t){var n,r,o=0,i="",a=e.substring(0,e.lastIndexOf("/")).split("/"),u=t.split("/");if(a.length>=u.length)for(n=0,r=a.length;n<r;n++)if(n>=u.length||a[n]!==u[n]){o=n+1;break}if(a.length<u.length)for(n=0,r=u.length;n<r;n++)if(n>=a.length||a[n]!==u[n]){o=n+1;break}if(1===o)return t;for(n=0,r=a.length-(o-1);n<r;n++)i+="../";for(n=o-1,r=u.length;n<r;n++)i+=n!==o-1?"/"+u[n]:u[n];return i},rv.prototype.toAbsPath=function(e,t){var n,r,o=0,i=[],a=/\/$/.test(t)?"/":"",u=e.split("/"),s=t.split("/");for(Jh(u,function(e){e&&i.push(e)}),u=i,n=s.length-1,i=[];0<=n;n--)0!==s[n].length&&"."!==s[n]&&(".."!==s[n]?0<o?o--:i.push(s[n]):o++);return 0!==(r=(n=u.length-o)<=0?q(i).join("/"):u.slice(0,n).join("/")+"/"+q(i).join("/")).indexOf("/")&&(r="/"+r),a&&r.lastIndexOf("/")!==r.length-1&&(r+=a),r},rv.prototype.getURI=function(e){var t;return void 0===e&&(e=!1),this.source&&!e||(t="",e||(this.protocol?t+=this.protocol+"://":t+="//",this.userInfo&&(t+=this.userInfo+"@"),this.host&&(t+=this.host),this.port&&(t+=":"+this.port)),this.path&&(t+=this.path),this.query&&(t+="?"+this.query),this.anchor&&(t+="#"+this.anchor),this.source=t),this.source},rv);function rv(e,t){e=Qh(e),this.settings=t||{};var n,r,o,i,a=this.settings.base_uri,u=this;/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e)?u.source=e:(n=0===e.indexOf("//"),0!==e.indexOf("/")||n||(e=(a&&a.protocol||"http")+"://mce_host"+e),/^[\w\-]*:?\/\//.test(e)||(r=this.settings.base_uri?this.settings.base_uri.path:new rv(document.location.href).directory,e=this.settings.base_uri&&""==this.settings.base_uri.protocol?"//mce_host"+u.toAbsPath(r,e):(o=/([^#?]*)([#?]?.*)/.exec(e),(a&&a.protocol||"http")+"://mce_host"+u.toAbsPath(r,o[1])+o[2])),e=e.replace(/@@/g,"(mce_at)"),i=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e),Jh(Zh,function(e,t){var n=(n=i[t])&&n.replace(/\(mce_at\)/g,"@@");u[e]=n}),a&&(u.protocol||(u.protocol=a.protocol),u.userInfo||(u.userInfo=a.userInfo),u.port||"mce_host"!==u.host||(u.port=a.port),u.host&&"mce_host"!==u.host||(u.host=a.host),u.source=""),n&&(u.protocol=""))}function ov(e,t,n){for(var r=/<([!?\/])?([A-Za-z0-9\-_:.]+)/g,o=/(?:\s(?:[^'">]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g,i=e.getShortEndedElements(),a=1,u=n;0!==a;)for(r.lastIndex=u;;){var s=r.exec(t);if(null===s)return u;if("!"===s[1]){u=Ge(s[2],"--")?sv(t,!1,s.index+"!--".length):sv(t,!0,s.index+1);break}o.lastIndex=r.lastIndex;var c=o.exec(t);if(!l(c)&&c.index===r.lastIndex){"/"===s[1]?--a:Ee(i,s[2])||(a+=1),u=r.lastIndex+c[0].length;break}}return u}function iv(q,$){void 0===$&&($=oo()),q=q||{};var W=uv(),K=W.createElement("form");function n(s,e){void 0===e&&(e="html");for(var t,i,n,c,r,o,a,l,u,f,d,m,g,p,h,v,b,y,C,x=s.html,w=0,S=[],N=0,E=Zo.decode,k=Nt.makeMap("src,href,data,background,action,formaction,poster,xlink:href"),_="html"===e?0:1,A=function(e){for(var t,n=S.length;n--&&S[n].name!==e;);if(0<=n){for(t=S.length-1;n<=t;t--)(e=S[t]).valid&&Q(e.name);S.length=n}},R=function(e,t){return G($h(e,s),t)},D=function(e){""!==e&&(">"===e.charAt(0)&&(e=" "+e),q.allow_conditional_comments||"[if"!==e.substr(0,3).toLowerCase()||(e=" "+e),X($h(e,s)))},T=function(e,t){var n=e||"",r=!Ge(n,"--"),o=sv(x,r,t);return e=x.substr(t,o-t),D(r?n+e:e),o+1},O=new RegExp("<(?:(?:!--([\\w\\W]*?)--!?>)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:![Dd][Oo][Cc][Tt][Yy][Pp][Ee]([\\w\\W]*?)>)|(?:!(--)?)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_:.]*)(\\s(?:[^'\">]+(?:\"[^\"]*\"|'[^']*'))*[^\"'>]*(?:\"[^\">]*|'[^'>]*)?|\\s*|\\/)>))","g"),B=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,P=$.getShortEndedElements(),L=q.self_closing_elements||$.getSelfClosingElements(),I=$.getBoolAttrs(),M=q.validate,F=q.remove_internals,U=q.fix_self_closing,z=$.getSpecialElements(),H=x+">";t=O.exec(H);){var j=t[0];if(w<t.index&&R(E(x.substr(w,t.index-w))),i=t[7])A(i=":"===(i=i.toLowerCase()).charAt(0)?i.substr(1):i);else if(i=t[8]){if(t.index+j.length>x.length){R(E(x.substr(t.index))),w=t.index+j.length;continue}u=(i=":"===(i=i.toLowerCase()).charAt(0)?i.substr(1):i)in P,U&&L[i]&&0<S.length&&S[S.length-1].name===i&&A(i);var V=function(e,t){var n=e.exec(t);if(n){var r=n[1],o=n[2];return"string"==typeof r&&"data-mce-bogus"===r.toLowerCase()?o:null}return null}(B,t[9]);if(null!==V){if("all"===V){w=ov($,x,O.lastIndex),O.lastIndex=w;continue}d=!1}if(!M||(f=$.getElementRule(i))){if(d=!0,M&&(p=f.attributes,h=f.attributePatterns),(g=t[9])?((l=-1!==g.indexOf("data-mce-type"))&&F&&(d=!1),(c=[]).map={},g.replace(B,function(e,t,n,r,o){return function(e,t,n,r,o){var i;if(n=$h((t=t.toLowerCase())in I?t:E(n||r||o||""),s),M&&!l&&0==(0===(i=t).indexOf("data-")||0===i.indexOf("aria-"))){var a=p[t];if(!a&&h){for(var u=h.length;u--&&!(a=h[u]).pattern.test(t););-1===u&&(a=null)}if(!a)return;if(a.validValues&&!(n in a.validValues))return}("name"===t||"id"===t)&&e in av&&(n in W||n in K)||k[t]&&!nv.isDomSafe(n,e,q)||l&&(t in k||0===t.indexOf("on"))||(c.map[t]=n,c.push({name:t,value:n}))}(i,t,n,r,o),""})):(c=[]).map={},M&&!l){if(v=f.attributesRequired,b=f.attributesDefault,y=f.attributesForced,f.removeEmptyAttrs&&!c.length&&(d=!1),y)for(r=y.length;r--;)a=(m=y[r]).name,"{$uid}"===(C=m.value)&&(C="mce_"+N++),c.map[a]=C,c.push({name:a,value:C});if(b)for(r=b.length;r--;)(a=(m=b[r]).name)in c.map||("{$uid}"===(C=m.value)&&(C="mce_"+N++),c.map[a]=C,c.push({name:a,value:C}));if(v){for(r=v.length;r--&&!(v[r]in c.map););-1===r&&(d=!1)}if(m=c.map["data-mce-bogus"]){if("all"===m){w=ov($,x,O.lastIndex),O.lastIndex=w;continue}d=!1}}d&&J(i,c,u)}else d=!1;if(n=z[i]){n.lastIndex=w=t.index+j.length,w=(t=n.exec(x))?(d&&(o=x.substr(w,t.index-w)),t.index+t[0].length):(o=x.substr(w),x.length),d&&(0<o.length&&R(o,!0),Q(i)),O.lastIndex=w;continue}u||(g&&g.indexOf("/")===g.length-1?d&&Q(i):S.push({name:i,valid:d}))}else if(i=t[1])D(i);else if(i=t[2]){if(!(1==_||q.preserve_cdata||0<S.length&&$.isValidChild(S[S.length-1].name,"#cdata"))){w=T("",t.index+2),O.lastIndex=w;continue}Y(i)}else if(i=t[3])ee(i);else{if((i=t[4])||"<!"===j){w=T(i,t.index+j.length),O.lastIndex=w;continue}if(i=t[5]){if(1!=_){w=T("?",t.index+2),O.lastIndex=w;continue}Z(i,t[6])}}w=t.index+j.length}for(w<x.length&&R(E(x.substr(w))),r=S.length-1;0<=r;r--)(i=S[r]).valid&&Q(i.name)}!1!==q.fix_self_closing&&(q.fix_self_closing=!0);var X=q.comment||te,Y=q.cdata||te,G=q.text||te,J=q.start||te,Q=q.end||te,Z=q.pi||te,ee=q.doctype||te;return{parse:function(e,t){void 0===t&&(t="html"),n(function(e){for(var t,n=/data:[^;<"'\s]+;base64,([a-z0-9\+\/=\s]+)/gi,r=[],o={},i=wu("img"),a=0,u=0;t=n.exec(e);){var s=t[0],c=i+"_"+u++;o[c]=s,a<t.index&&r.push(e.substr(a,t.index-a)),r.push(c),a=t.index+s.length}var l=new RegExp(i+"_[0-9]+","g");return 0===a?{prefix:i,uris:o,html:e,re:l}:(a<e.length&&r.push(e.substr(a)),{prefix:i,uris:o,html:r.join(""),re:l})}(e),t)}}}var av=Nt.makeMap("button,fieldset,form,iframe,img,image,input,object,output,select,textarea"),uv=Re(function(){return document.implementation.createHTMLDocument("parser")}),sv=function(e,t,n){void 0===n&&(n=0);var r=e.toLowerCase();if(-1!==r.indexOf("[if ",n)&&(u=n,/^\s*\[if [\w\W]+\]>.*<!\[endif\](--!?)?>/.test(r.substr(u)))){var o=r.indexOf("[endif]",n);return r.indexOf(">",o)}if(t){var i=r.indexOf(">",n);return-1!==i?i:r.length}var a=/--!?>/g;a.lastIndex=n;var u,s=a.exec(e);return s?s.index+s[0].length:r.length};function cv(A,R){void 0===R&&(R=oo());var D={},T=[],O={},B={};(A=A||{}).validate=!("validate"in A)||A.validate,A.root_name=A.root_name||"body";function P(e){var t=e.name;t in D&&((r=O[t])?r.push(e):O[t]=[e]);for(var n=T.length;n--;){var r,o=T[n].name;o in e.attributes.map&&((r=B[o])?r.push(e):B[o]=[e])}return e}var e={schema:R,addAttributeFilter:function(e,n){Rv(Dv(e),function(e){for(var t=0;t<T.length;t++)if(T[t].name===e)return void T[t].callbacks.push(n);T.push({name:e,callbacks:[n]})})},getAttributeFilters:function(){return[].concat(T)},addNodeFilter:function(e,n){Rv(Dv(e),function(e){var t=D[e];t||(D[e]=t=[]),t.push(n)})},getNodeFilters:function(){var e,t=[];for(e in D)Ee(D,e)&&t.push({name:e,callbacks:D[e]});return t},filterNode:P,parse:function(e,s){var t,n,r,o,i,c,a,l,f=[];function d(e){for(var t=R.getBlockElements(),n=e.prev;n&&3===n.type;){var r=n.value.replace(w,"");if(0<r.length)return n.value=r,0;var o=n.next;if(o){if(3===o.type&&o.value.length){n=n.prev;continue}if(!t[o.name]&&"script"!==o.name&&"style"!==o.name){n=n.prev;continue}}var i=n.prev;n.remove(),n=i}}s=s||{},O={},B={};function m(e,t){var n,r=new jd(e,t);return e in D&&((n=O[e])?n.push(r):O[e]=[r]),r}var g=Tv(Av("script,style,head,html,body,title,meta,param"),R.getBlockElements()),p=no(R),h=R.getNonEmptyElements(),v=R.children,b=A.validate,u=("forced_root_block"in s?s:A).forced_root_block,y=!1===u?"":!0===u?"p":u,C=R.getWhiteSpaceElements(),x=/^[ \t\r\n]+/,w=/[ \t\r\n]+$/,S=/[ \t\r\n]+/g,N=/^[ \t\r\n]+$/,E=Ee(C,s.context)||Ee(C,A.root_name),k=iv({validate:b,document:A.document,allow_html_data_urls:A.allow_html_data_urls,allow_svg_data_urls:A.allow_svg_data_urls,allow_script_urls:A.allow_script_urls,allow_conditional_comments:A.allow_conditional_comments,preserve_cdata:A.preserve_cdata,self_closing_elements:function(e){var t,n={};for(t in e)"li"!==t&&"p"!==t&&(n[t]=e[t]);return n}(R.getSelfClosingElements()),cdata:function(e){l.append(m("#cdata",4)).value=e},text:function(e,t){var n,r;E||(e=e.replace(S," "),(r=l.lastChild)&&(Ee(g,r.name)||"br"===r.name)&&(e=e.replace(x,""))),0!==e.length&&((n=m("#text",3)).raw=!!t,l.append(n).value=e)},comment:function(e){l.append(m("#comment",8)).value=e},pi:function(e,t){l.append(m(e,7)).value=t,d(l)},doctype:function(e){l.append(m("#doctype",10)).value=e,d(l)},start:function(e,t,n){var r=b?R.getElementRule(e):{};if(r){var o=m(r.outputName||e,1);o.attributes=t,o.shortEnded=n,l.append(o);var i=v[l.name];i&&v[o.name]&&!i[o.name]&&f.push(o);for(var a=T.length;a--;){var u=T[a].name;u in t.map&&((c=B[u])?c.push(o):B[u]=[o])}g[e]&&d(o),n||(l=o),!E&&C[e]&&(E=!0)}},end:function(e){var t,n,r,o,i=b?R.getElementRule(e):{};if(i){if(g[e]&&!E){if((t=l.firstChild)&&3===t.type)if(0<(n=t.value.replace(x,"")).length)t.value=n,t=t.next;else for(r=t.next,t.remove(),t=r;t&&3===t.type;)n=t.value,r=t.next,0!==n.length&&!N.test(n)||(t.remove(),t=r),t=r;if((t=l.lastChild)&&3===t.type)if(0<(n=t.value.replace(w,"")).length)t.value=n,t=t.prev;else for(r=t.prev,t.remove(),t=r;t&&3===t.type;)n=t.value,r=t.prev,0!==n.length&&!N.test(n)||(t.remove(),t=r),t=r}E&&C[e]&&(E=!1);var a=Kh(R,h,C,l),u=l.parent;i.paddInEmptyBlock&&a&&function(){for(var e=l;V(e);){if(e.name in p)return Kh(R,h,C,e);e=e.parent}}()?Wh(A,s,g,l):i.removeEmpty&&a?g[l.name]?l.empty().remove():l.unwrap():i.paddEmpty&&(Gh(o=l,"#text")&&o.firstChild.value===wo||a)&&Wh(A,s,g,l),l=u}}},R),_=l=new jd(s.context||A.root_name,11);if(k.parse(e,s.format),b&&f.length&&(s.context?s.invalid=!0:function(e){for(var t=Av("tr,td,th,tbody,thead,tfoot,table"),n=R.getNonEmptyElements(),r=R.getWhiteSpaceElements(),o=R.getTextBlockElements(),i=R.getSpecialElements(),a=function(e,t){if(void 0===t&&(t=e.parent),i[e.name])e.empty().remove();else{for(var n=0,r=e.children();n<r.length;n++){var o=r[n];R.isValidChild(t.name,o.name)||a(o,t)}e.unwrap()}},u=0;u<e.length;u++){var s,c=e[u],l=void 0,f=void 0;if(c.parent&&!c.fixed)if(o[c.name]&&"li"===c.parent.name){for(var d=c.next;d&&o[d.name];)d.name="li",d.fixed=!0,c.parent.insert(d,c.parent),d=d.next;c.unwrap()}else{for(var m=[c],l=c.parent;l&&!R.isValidChild(l.name,c.name)&&!t[l.name];l=l.parent)m.push(l);if(l&&1<m.length)if(R.isValidChild(l.name,c.name)){m.reverse();for(var g=s=P(m[0].clone()),p=0;p<m.length-1;p++){R.isValidChild(g.name,m[p].name)?(f=P(m[p].clone()),g.append(f)):f=g;for(var h=m[p].firstChild;h&&h!==m[p+1];){var v=h.next;f.append(h),h=v}g=f}Kh(R,n,r,s)?l.insert(c,m[0],!0):(l.insert(s,m[0],!0),l.insert(c,s)),l=m[0],(Kh(R,n,r,l)||Gh(l,"br"))&&l.empty().remove()}else a(c);else c.parent&&("li"!==c.name?R.isValidChild(c.parent.name,"div")&&R.isValidChild("div",c.name)?c.wrap(P(new jd("div",1))):a(c):!(d=c.prev)||"ul"!==d.name&&"ol"!==d.name?!(d=c.next)||"ul"!==d.name&&"ol"!==d.name?c.wrap(P(new jd("ul",1))):d.insert(c,d.firstChild,!0):d.append(c))}}}(f)),y&&("body"===_.name||s.isRootContent)&&function(){function e(e){e&&((t=e.firstChild)&&3===t.type&&(t.value=t.value.replace(x,"")),(t=e.lastChild)&&3===t.type&&(t.value=t.value.replace(w,"")))}var t=_.firstChild,n=null;if(R.isValidChild(_.name,y.toLowerCase())){for(;t;){var r=t.next;3===t.type||1===t.type&&"p"!==t.name&&!g[t.name]&&!t.attr("data-mce-type")?(n||((n=m(y,1)).attr(A.forced_root_block_attrs),_.insert(n,t)),n.append(t)):(e(n),n=null),t=r}e(n)}}(),!s.invalid){for(a in O)if(Ee(O,a)){for(c=D[a],o=(t=O[a]).length;o--;)t[o].parent||t.splice(o,1);for(n=0,r=c.length;n<r;n++)c[n](t,a,s)}for(n=0,r=T.length;n<r;n++)if((c=T[n]).name in B){for(o=(t=B[c.name]).length;o--;)t[o].parent||t.splice(o,1);for(o=0,i=c.callbacks.length;o<i;o++)c.callbacks[o](t,c.name,s)}}return _}};return Xh(e,A),A.inline_styles&&Uh(e,A),e}function lv(e,t,n){-1===Nt.inArray(t,n)&&(e.addAttributeFilter(n,function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),t.push(n))}function fv(L,I){var e=["data-mce-selected"],M=I&&I.dom?I.dom:eu.DOM,F=I&&I.schema?I.schema:oo(L);L.entity_encoding=L.entity_encoding||"named",L.remove_trailing_brs=!("remove_trailing_brs"in L)||L.remove_trailing_brs;var t,U=cv(L,F),s=L,c=M;return(t=U).addAttributeFilter("data-mce-tabindex",function(e,t){for(var n=e.length;n--;){var r=e[n];r.attr("tabindex",r.attr("data-mce-tabindex")),r.attr(t,null)}}),t.addAttributeFilter("src,href,style",function(e,t){for(var n="data-mce-"+t,r=s.url_converter,o=s.url_converter_scope,i=e.length;i--;){var a=e[i],u=a.attr(n);void 0!==u?(a.attr(t,0<u.length?u:null),a.attr(n,null)):(u=a.attr(t),"style"===t?u=c.serializeStyle(c.parseStyle(u),a.name):r&&(u=r.call(o,u,t,a.name)),a.attr(t,0<u.length?u:null))}}),t.addAttributeFilter("class",function(e){for(var t=e.length;t--;){var n,r=e[t];r.attr("class")&&(n=r.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),r.attr("class",0<n.length?n:null))}}),t.addAttributeFilter("data-mce-type",function(e,t,n){for(var r=e.length;r--;){var o=e[r];"bookmark"!==o.attr("data-mce-type")||n.cleanup||(ve.from(o.firstChild).exists(function(e){return!No(e.value)})?o.unwrap():o.remove())}}),t.addNodeFilter("noscript",function(e){for(var t=e.length;t--;){var n=e[t].firstChild;n&&(n.value=Zo.decode(n.value))}}),t.addNodeFilter("script,style",function(e,t){for(var n=function(e){return e.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi,"").replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")},r=e.length;r--;){var o,i=e[r],a=i.firstChild?i.firstChild.value:"";"script"===t?((o=i.attr("type"))&&i.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0<a.length&&(i.firstChild.value="// <![CDATA[\n"+n(a)+"\n// ]]>")):"xhtml"===s.element_format&&0<a.length&&(i.firstChild.value="\x3c!--\n"+n(a)+"\n--\x3e")}}),t.addNodeFilter("#comment",function(e){for(var t=e.length;t--;){var n=e[t];s.preserve_cdata&&0===n.value.indexOf("[CDATA[")?(n.name="#cdata",n.type=4,n.value=c.decode(n.value.replace(/^\[CDATA\[|\]\]$/g,""))):0===n.value.indexOf("mce:protected ")&&(n.name="#text",n.type=3,n.raw=!0,n.value=unescape(n.value).substr(14))}}),t.addNodeFilter("xml:namespace,input",function(e,t){for(var n=e.length;n--;){var r=e[n];7===r.type?r.remove():1===r.type&&("input"!==t||r.attr("type")||r.attr("type","text"))}}),t.addAttributeFilter("data-mce-type",function(e){Y(e,function(e){"format-caret"===e.attr("data-mce-type")&&(e.isEmpty(t.schema.getNonEmptyElements())?e.remove():e.unwrap())})}),t.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-type,data-mce-resize,data-mce-placeholder",function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),{schema:F,addNodeFilter:U.addNodeFilter,addAttributeFilter:U.addAttributeFilter,serialize:function(e,t){var n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x,w,S,N,E,k,_,A,R,D,T=_e({format:"html"},t=void 0===t?{}:t),O=(n=(m=e,N=g=T,(d=I)&&d.hasEventListeners("PreProcess")&&!N.no_events?(h=g,x=(p=d).dom,w=m.cloneNode(!0),(S=document.implementation).createHTMLDocument&&(b=S.createHTMLDocument(""),Nt.each("BODY"===w.nodeName?w.childNodes:[w],function(e){b.body.appendChild(b.importNode(e,!0))}),w="BODY"!==w.nodeName?b.body.firstChild:b.body,v=x.doc,x.doc=b),y=p,C=_e(_e({},h),{node:w}),y.fire("PreProcess",C),v&&(x.doc=v),w):m),o=Eo((r=T).getInner?n.innerHTML:M.getOuterHTML(n)),r.selection||Co(Et.fromDom(n))?o:Nt.trim(o)),B=(i=U,a=O,s=(u=T).selection?_e({forced_root_block:!1},u):u,c=i.parse(a,s),!P(f=c.lastChild)||P(l=f.prev)&&(f.remove(),l.remove()),c);function P(e){return e&&"br"===e.name}return"tree"===T.format?B:(E=I,k=T,_=B,D=rm(L,F).serialize(_),k.no_events||!E?D:(A=E,R=_e(_e({},k),{content:D}),A.fire("PostProcess",R).content))},addRules:F.addValidElements,setRules:F.setValidElements,addTempAttr:R(lv,U,e),getTempAttrs:J(e),getNodeFilters:U.getNodeFilters,getAttributeFilters:U.getAttributeFilters}}function dv(e,t){var n=fv(e,t);return{schema:n.schema,addNodeFilter:n.addNodeFilter,addAttributeFilter:n.addAttributeFilter,serialize:n.serialize,addRules:n.addRules,setRules:n.setRules,addTempAttr:n.addTempAttr,getTempAttrs:n.getTempAttrs,getNodeFilters:n.getNodeFilters,getAttributeFilters:n.getAttributeFilters}}function mv(e,t,n){return r=n=void 0===n?{}:n,bh(e).editor.setContent(t,r);var r}function gv(e){return ve.from(e).each(function(e){return e.destroy()})}function pv(e,t){var n,r,o,i,a,u,s,c=(n=e,r=U(Pv,function(e){return Ee(n,e)}),!1!==(o=n.forced_root_block)&&""!==o||r.push("forced_root_block (false only)"),W(r)),l=(s=Nt.makeMap(t.plugins," "),W(Ae(Ae([],U(Lv,g),!0),H(Iv,function(e){return g(e)?[e+" (moving to premium)"]:[]}),!0))),f=0<l.length,d=0<c.length,m="mobile"===t.theme;function g(e){return Ee(s,e)}(f||d||m)&&(i=m?"\n\nThemes:\n- mobile":"",a=f?"\n\nPlugins:\n- "+l.join("\n- "):"",u=d?"\n\nSettings:\n- "+c.join("\n- "):"",console.warn("The following deprecated features are currently enabled, these will be removed in TinyMCE 6.0. See https://www.tiny.cloud/docs/release-notes/6.0-upcoming-changes/ for more information."+i+a+u))}function hv(e){var t=S(e)?e.join(" "):e;return U(A(X(t)?t.split(" "):[],Je),function(e){return 0<e.length})}function vv(e,t){return Ee(e.sections(),t)}function bv(e,t){return ue(e,"toolbar_mode").orThunk(function(){return ue(e,"toolbar_drawer").map(function(e){return!1===e?"wrap":e})}).getOr(t)}function yv(e,t,n,r){var o,i,a,u,s,c,l,f,d=hv(n.forced_plugins),m=hv(r.plugins),g=vv(o=t,"mobile")?o.sections().mobile:{},p=g.plugins?hv(g.plugins):m,h=(i=(u=t,s=m,c=p,(a=e)&&(0,f=(l=u).sections(),vv(l,"mobile")&&"mobile"===f.mobile.theme)?U(c,R(T,Hv)):a&&vv(u,"mobile")?c:s),[].concat(hv(d)).concat(hv(i)));if(xt.browser.isIE()&&T(h,"rtc"))throw new Error("RTC plugin is not supported on IE 11.");return Nt.extend(r,{plugins:h.join(" ")})}function Cv(e,t,n,r,o){var i,a,u,s,c,l,f,d,m=e?{mobile:(i=t,a={resize:!1,toolbar_mode:bv(o.mobile||{},"scrolling"),toolbar_sticky:!1},_e(_e(_e({},jv),a),i?{menubar:!1}:{}))}:{},g=(c=["mobile"],ie(Bv(m,o),function(e,t){return T(c,t)},oe(l={}),oe(f={})),{sections:J((d={t:l,f:f}).t),settings:J(d.f)}),p=Nt.extend(n,r,g.settings(),e&&vv(g,"mobile")?function(e){void 0===e&&(e={});var t=ue(g.sections(),"mobile").getOr({});return Nt.extend({},e,t)}():{},{validate:!0,external_plugins:(u=r,s=g.settings().external_plugins||{},u&&u.external_plugins?Nt.extend({},u.external_plugins,s):s)});return yv(e,g,r,p)}function xv(e,t,n){return ve.from(t.settings[n]).filter(e)}function wv(e,t){return t.dom[e]}function Sv(e,t){return parseInt(wn(t,e),10)}function Nv(e,t,n){var r,o,i,a,u,s,c=Et.fromDom(e.getBody()),l=e.inline?c:Et.fromDom(Dt(c).dom.documentElement),f=(r=e.inline,i=t,a=n,u=(o=l).dom.getBoundingClientRect(),{x:i-(r?u.left+o.dom.clientLeft+Kv(o):0),y:a-(r?u.top+o.dom.clientTop+Wv(o):0)}),d=f.x,m=f.y,g=qv(s=l),p=$v(s);return 0<=d&&0<=m&&d<=g&&m<=p}function Ev(o){function i(){var e=o.theme;return e&&e.getNotificationManagerImpl?e.getNotificationManagerImpl():{open:t,close:t,reposition:t,getArgs:t};function t(){throw new Error("Theme did not provide a NotificationManager implementation.")}}function a(){return ve.from(c[0])}function u(){0<c.length&&i().reposition(c)}function s(t){z(c,function(e){return e===t}).each(function(e){c.splice(e,1)})}function t(n,e){if(void 0===e&&(e=!0),!o.removed&&(r=(t=o).inline?t.getBody():t.getContentAreaContainer(),ve.from(r).map(Et.fromDom).map(Mn).getOr(!1)))return e&&o.fire("BeforeOpenNotification",{notification:n}),M(c,function(e){return!((t=i().getArgs(e)).type!==n.type||t.text!==n.text||t.progressBar||t.timeout||n.progressBar||n.timeout);var t}).getOrThunk(function(){o.editorManager.setActive(o);var e=i().open(n,function(){s(e),u(),a().fold(function(){return o.focus()},function(e){return Et.fromDom(e.getEl()).dom.focus()})});return c.push(e),u(),o.fire("OpenNotification",{notification:_e({},e)}),e});var t,r}var n,c=[],e=J(c);return(n=o).on("SkinLoaded",function(){var e=n.getParam("service_message");e&&t({text:e,type:"warning",timeout:0},!1),u()}),n.on("show ResizeEditor ResizeWindow NodeChange",function(){Ar.requestAnimationFrame(u)}),n.on("remove",function(){Y(c.slice(),function(e){i().close(e)})}),{open:t,close:function(){a().each(function(e){i().close(e),s(e),u()})},getNotifications:e}}iv.findEndTag=ov;var kv,_v,Av=Nt.makeMap,Rv=Nt.each,Dv=Nt.explode,Tv=Nt.extend,Ov=eu.DOM,Bv=(kv=function(e,t){return h(e)&&h(t)?Bv(e,t):t},function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(0===e.length)throw new Error("Can't merge zero objects");for(var n={},r=0;r<e.length;r++){var o,i=e[r];for(o in i)Ee(i,o)&&(n[o]=kv(n[o],i[o]))}return n}),Pv="autoresize_on_init,content_editable_state,convert_fonts_to_spans,inline_styles,padd_empty_with_br,block_elements,boolean_attributes,editor_deselector,editor_selector,elements,file_browser_callback_types,filepicker_validator_handler,force_hex_style_colors,force_p_newlines,gecko_spellcheck,images_dataimg_filter,media_scripts,mode,move_caret_before_on_enter_elements,non_empty_elements,self_closing_elements,short_ended_elements,special,spellchecker_select_languages,spellchecker_whitelist,tab_focus,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists".split(","),Lv="bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor".split(","),Iv="imagetools,toc".split(","),Mv=dt().deviceType,Fv=Mv.isTouch(),Uv=Mv.isPhone(),zv=Mv.isTablet(),Hv=["lists","autolink","autosave"],jv={table_grid:!1,object_resizing:!1,resize:!1},Vv=(_v={},{add:function(e,t){_v[e]=t},get:function(e){return _v[e]||{icons:{}}},has:function(e){return Ee(_v,e)}}),qv=R(wv,"clientWidth"),$v=R(wv,"clientHeight"),Wv=R(Sv,"margin-top"),Kv=R(Sv,"margin-left"),Xv=fu.PluginManager,Yv=fu.ThemeManager;function Gv(r){function o(){var e=r.theme;return e&&e.getWindowManagerImpl?e.getWindowManagerImpl():{open:t,openUrl:t,alert:t,confirm:t,close:t,getParams:t,setParams:t};function t(){throw new Error("Theme did not provide a WindowManager implementation.")}}function i(n,r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return r?r.apply(n,e):void 0}}function n(t){r.fire("CloseWindow",{dialog:t}),0===(u=U(u,function(e){return e!==t})).length&&r.focus()}function a(e){r.editorManager.setActive(r),dd(r);var t,n=e();return t=n,u.push(t),r.fire("OpenWindow",{dialog:t}),n}var u=[];return r.on("remove",function(){Y(u,function(e){o().close(e)})}),{open:function(e,t){return a(function(){return o().open(e,t,n)})},openUrl:function(e){return a(function(){return o().openUrl(e,n)})},alert:function(e,t,n){var r=o();r.alert(e,i(n||r,t))},confirm:function(e,t,n){var r=o();r.confirm(e,i(n||r,t))},close:function(){ve.from(u[u.length-1]).each(function(e){o().close(e),n(e)})}}}function Jv(e,t){e.notificationManager.open({type:"error",text:t})}function Qv(e,t){e._skinLoaded?Jv(e,t):e.on("SkinLoaded",function(){Jv(e,t)})}function Zv(e,t,n){Cf(e,t,{message:n}),console.error(n)}function eb(e,t,n){return n?"Failed to load "+e+": "+n+" from url "+t:"Failed to load "+e+" url: "+t}function tb(e,t,n){Zv(e,"PluginLoadError",eb("plugin",t,n))}function nb(e){var t,n;e.contentCSS=e.contentCSS.concat(Ey(e,(n=(t=e).getParam("content_css"),X(n)?A(n.split(","),Je):S(n)?n:!1===n||t.inline?[]:["default"])),Ey(e,Bs(e)))}function rb(){function n(e,t){return{status:e,resultUri:t}}function t(e){return e in r}var r={};return{hasBlobUri:t,getResultUri:function(e){var t=r[e];return t?t.resultUri:null},isPending:function(e){return!!t(e)&&1===r[e].status},isUploaded:function(e){return!!t(e)&&2===r[e].status},markPending:function(e){r[e]=n(1,null)},markUploaded:function(e,t){r[e]=n(2,t)},removeFailed:function(e){delete r[e]},destroy:function(){r={}}}}function ob(e){return e+ky+++("s"+(new Date).getTime().toString(36)+t()+t()+t());function t(){return Math.round(4294967295*Math.random()).toString(36)}}function ib(){function e(e){return M(n,e).getOrUndefined()}function i(e){if(!e.blob||!e.base64)throw new Error("blob and base64 representations of the image are required for BlobInfo to be created");var t=e.id||ob("blobid"),n=e.name||t,r=e.blob;return{id:J(t),name:J(n),filename:J(e.filename||n+"."+({"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png","image/apng":"apng","image/avif":"avif","image/svg+xml":"svg","image/webp":"webp","image/bmp":"bmp","image/tiff":"tiff"}[r.type.toLowerCase()]||"dat")),blob:J(r),base64:J(e.base64),blobUri:J(e.blobUri||URL.createObjectURL(r)),uri:J(e.uri)}}function t(t){return e(function(e){return e.id()===t})}var n=[];return{create:function(e,t,n,r,o){if(X(e))return i({id:e,name:r,filename:o,blob:t,base64:n});if(h(e))return i(e);throw new Error("Unknown input type")},add:function(e){t(e.id())||n.push(e)},get:t,getByUri:function(t){return e(function(e){return e.blobUri()===t})},getByData:function(t,n){return e(function(e){return e.base64()===t&&e.blob().type===n})},findFirst:e,removeByUri:function(t){n=U(n,function(e){return e.blobUri()!==t||void URL.revokeObjectURL(e.blobUri())})},destroy:function(){Y(n,function(e){URL.revokeObjectURL(e.blobUri())}),n=[]}}}function ab(u,s){function o(e,r,o,t){var i=new XMLHttpRequest;i.open("POST",s.url),i.withCredentials=s.credentials,i.upload.onprogress=function(e){t(e.loaded/e.total*100)},i.onerror=function(){o("Image upload failed due to a XHR Transport error. Code: "+i.status)},i.onload=function(){var e,t,n;i.status<200||300<=i.status?o("HTTP Error: "+i.status):(e=JSON.parse(i.responseText))&&"string"==typeof e.location?r((t=s.basePath,n=e.location,t?t.replace(/\/$/,"")+"/"+n.replace(/^\//,""):n)):o("Invalid JSON: "+i.responseText)};var n=new FormData;n.append("file",e.blob(),e.filename()),i.send(n)}function c(e,t){return{url:t,blobInfo:e,status:!0}}function l(e,t,n){return{url:"",blobInfo:e,status:!1,error:{message:t,options:n}}}function f(e,t){Nt.each(d[e],function(e){e(t)}),delete d[e]}var d={};return!1===y(s.handler)&&(s.handler=o),{upload:function(e,t){return s.url||s.handler!==o?(n=e,r=t,n=Nt.grep(e,function(e){return!u.isUploaded(e.blobUri())}),_r.all(Nt.map(n,function(e){return u.isPending(e.blobUri())?(n=e.blobUri(),new _r(function(e){d[n]=d[n]||[],d[n].push(e)})):(i=e,t=s.handler,a=r,u.markPending(i.blobUri()),new _r(function(r){var n;try{var o=function(){n&&n.close()};t(i,function(e){o(),u.markUploaded(i.blobUri(),e),f(i.blobUri(),c(i,e)),r(c(i,e))},function(e,t){var n=t||{};o(),u.removeFailed(i.blobUri()),f(i.blobUri(),l(i,e,n)),r(l(i,e,n))},function(t){t<0||100<t||ve.from(n).orThunk(function(){return ve.from(a).map(C)}).each(function(e){(n=e).progressBar.value(t)})})}catch(e){r(l(i,e.message,{}))}}));var i,t,a,n}))):new _r(function(e){e([])});var n,r}}}function ub(e){return function(){return e.notificationManager.open({text:e.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0})}}function sb(e,t){return ab(t,{url:e.getParam("images_upload_url","","string"),basePath:e.getParam("images_upload_base_path","","string"),credentials:e.getParam("images_upload_credentials",!1,"boolean"),handler:e.getParam("images_upload_handler",null,"function")})}function cb(l){function t(t){return function(e){return l.selection?t(e):[]}}function r(e,t,n){for(var r=0;-1!==(r=e.indexOf(t,r))&&(e=e.substring(0,r)+n+e.substr(r+t.length),r+=n.length-t.length+1),-1!==r;);return e}function o(e,t,n){return e=r(e,'src="'+t+'"','src="'+n+'"'+(n===xt.transparentSrc?' data-mce-placeholder="1"':"")),r(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')}function f(t,n){Y(l.undoManager.data,function(e){"fragmented"===e.type?e.fragments=A(e.fragments,function(e){return o(e,t,n)}):e.content=o(e.content,t,n)})}function n(n){return u=u||sb(l,g),v().then(t(function(c){var e=A(c,function(e){return e.blobInfo});return u.upload(e,ub(l)).then(t(function(e){var s=[],t=A(e,function(e,t){var n,r,o,i,a=c[t].blobInfo,u=c[t].image;return e.status&&l.getParam("images_replace_blob_uris",!0,"boolean")?(m.removeByUri(u.src),hh(l)||(r=u,o=e.url,i=l.convertURL(o,"src"),f(r.src,o),l.$(r).attr({src:l.getParam("images_reuse_filename",!1,"boolean")?o+(-1===o.indexOf("?")?"?":"&")+(new Date).getTime():o,"data-mce-src":i}))):e.error&&(e.error.options.remove&&(f(u.getAttribute("src"),xt.transparentSrc),s.push(u)),n=e.error.message,Qv(l,lu.translate(["Failed to upload image: {0}",n]))),{element:u,status:e.status,uploadUri:e.url,blobInfo:a}});return 0<t.length&&h.fireIfChanged(),0<s.length&&(hh(l)?console.error("Removing images on failed uploads is currently unsupported for RTC"):l.undoManager.transact(function(){Y(s,function(e){l.dom.remove(e),m.removeByUri(e.src)})})),n&&n(t),t}))}))}function e(e){if(As(l))return n(e)}function i(t){return!1!==j(p,function(e){return e(t)})&&(0!==t.getAttribute("src").indexOf("data:")||l.getParam("images_dataimg_filter",w,"function")(t))}function a(e){return e.replace(/src="(blob:[^"]+)"/g,function(e,n){var t=g.getResultUri(n);if(t)return'src="'+t+'"';var r=(r=m.getByUri(n))||L(l.editorManager.get(),function(e,t){return e||t.editorUpload&&t.editorUpload.blobCache.getByUri(n)},null);return r?'src="data:'+r.blob().type+";base64,"+r.base64()+'"':e})}var u,s,c,d,m=ib(),g=rb(),p=[],h=(d=au(null),(c=l).on("change AddUndo",function(e){d.set(_e({},e.level))}),{fireIfChanged:function(){var t=c.undoManager.data;Z(t).filter(function(e){return!fh(d.get(),e)}).each(function(e){c.setDirty(!0),c.fire("change",{level:e,lastLevel:G(t,t.length-2).getOrNull()})})}}),v=function(){return(s=s||qh(g,m)).findAll(l.getBody(),i).then(t(function(e){return e=U(e,function(e){return"string"!=typeof e||void Qv(l,e)}),hh(l)||Y(e,function(e){f(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")}),e}))};return l.on("SetContent",function(){(As(l)?e:v)()}),l.on("RawSaveContent",function(e){e.content=a(e.content)}),l.on("GetContent",function(e){e.source_view||"raw"===e.format||"tree"===e.format||(e.content=a(e.content))}),l.on("PostRender",function(){l.parser.addNodeFilter("img",function(e){Y(e,function(e){var t,n=e.attr("src");m.getByUri(n)||(t=g.getResultUri(n))&&e.attr("src",t)})})}),{blobCache:m,addFilter:function(e){p.push(e)},uploadImages:n,uploadImagesAuto:e,scanForImages:v,destroy:function(){m.destroy(),g.destroy(),s=u=null}}}function lb(e,t){function m(e){o="string"==typeof e?{name:e,classes:[],attrs:{}}:e;var t,n=Ay.create(o.name),r=n;return(t=o).classes.length&&Ay.addClass(r,t.classes.join(" ")),Ay.setAttribs(r,t.attrs),n}var n,o,r,g=t&&t.schema||oo({}),p=function(n,e,t){var r,o,i,a,u,s,c,l=0<e.length&&e[0],f=l&&l.name,d=(a=f,u="string"!=typeof(i=n)?i.nodeName.toLowerCase():i,!(!(c=(s=g.getElementRule(u))&&s.parentsRequired)||!c.length)&&(a&&-1!==Nt.inArray(c,a)?a:c[0]));if(d)f===d?(o=e[0],e=e.slice(1)):o=d;else if(l)o=e[0],e=e.slice(1);else if(!t)return n;return o&&(r=m(o)).appendChild(n),t&&(r||(r=Ay.create("div")).appendChild(n),Nt.each(t,function(e){var t=m(e);r.insertBefore(t,n)})),p(r,e,o&&o.siblings)};return e&&e.length?(n=m(o=e[0]),(r=Ay.create("div")).appendChild(p(n,e.slice(1),o.siblings)),r):""}function fb(e){var t,a={classes:[],attrs:{}};return"*"!==(e=a.selector=Nt.trim(e))&&(t=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,function(e,t,n,r,o){switch(t){case"#":a.attrs.id=n;break;case".":a.classes.push(n);break;case":":-1!==Nt.inArray("checked disabled enabled read-only required".split(" "),n)&&(a.attrs[n]=n)}var i;return"["!==r||(i=o.match(/([\w\-]+)(?:\=\"([^\"]+))?/))&&(a.attrs[i[1]]=i[2]),""})),a.name=t||"div",a}function db(n,e){var r,t,o="",i=(t=n.getParam("preview_styles","font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"),X(t)?t:"");if(""===i)return"";function a(e){return e.replace(/%(\w+)/g,"")}if("string"==typeof e){if(!(e=n.formatter.get(e)))return;e=e[0]}if("preview"in e){var u=ue(e,"preview");if(fn(u,!1))return"";i=u.getOr(i)}var s,c=e.block||e.inline||"span",l=(s=e.selector)&&"string"==typeof s?(s=(s=s.split(/\s*,\s*/)[0]).replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),Nt.map(s.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var t=Nt.map(e.split(/(?:~\+|~|\+)/),fb),n=t.pop();return t.length&&(n.siblings=t),n}).reverse()):[],f=l.length?(l[0].name||(l[0].name=c),c=e.selector,lb(l,n)):lb([c],n),d=Ay.select(c,f)[0]||f.firstChild;return _y(e.styles,function(e,t){var n=a(e);n&&Ay.setStyle(d,t,n)}),_y(e.attributes,function(e,t){var n=a(e);n&&Ay.setAttrib(d,t,n)}),_y(e.classes,function(e){var t=a(e);Ay.hasClass(d,t)||Ay.addClass(d,t)}),n.fire("PreviewFormats"),Ay.setStyles(f,{position:"absolute",left:-65535}),n.getBody().appendChild(f),r=Ay.getStyle(n.getBody(),"fontSize",!0),r=/px$/.test(r)?parseInt(r,10):0,_y(i.split(" "),function(e){var t=Ay.getStyle(d,e,!0);if(!("background-color"===e&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)&&(t=Ay.getStyle(n.getBody(),e,!0),"#ffffff"===Ay.toHex(t).toLowerCase())||"color"===e&&"#000000"===Ay.toHex(t).toLowerCase())){if("font-size"===e&&/em|%$/.test(t)){if(0===r)return;t=parseFloat(t)/(/%$/.test(t)?100:1)*r+"px"}"border"===e&&t&&(o+="padding:0 2px;"),o+=e+":"+t+";"}}),n.fire("AfterPreviewFormats"),Ay.remove(f),o}function mb(c){var e,r,t,n,o,i,a=(n={},(o=function(e,t){e&&(X(e)?(Y(t=!S(t)?[t]:t,function(e){b(e.deep)&&(e.deep=!gl(e)),b(e.split)&&(e.split=!gl(e)||pl(e)),b(e.remove)&&gl(e)&&!pl(e)&&(e.remove="none"),gl(e)&&pl(e)&&(e.mixed=!0,e.block_expand=!0),X(e.classes)&&(e.classes=e.classes.split(/\s+/))}),n[e]=t):ne(e,function(e,t){o(t,e)}))})((r=(e=c).dom,t={valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"left"},preview:"font-family font-size"}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img,audio,video",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"img,table,audio,video",collapsed:!1,styles:{float:"right"},preview:"font-family font-size"}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},inherit:!1,defaultBlock:"div",preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all",preserve_attributes:["class","style"]}],italic:[{inline:"em",remove:"all",preserve_attributes:["class","style"]},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all",preserve_attributes:["class","style"]}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all",preserve_attributes:["class","style"]}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all",preserve_attributes:["class","style"]},{inline:"s",remove:"all",preserve_attributes:["class","style"]}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0,clear_child_styles:!0},fontname:{inline:"span",toggle:!1,styles:{fontFamily:"%value"},clear_child_styles:!0},fontsize:{inline:"span",toggle:!1,styles:{fontSize:"%value"},clear_child_styles:!0},lineheight:{selector:"h1,h2,h3,h4,h5,h6,p,li,td,th,div",defaultBlock:"p",styles:{lineHeight:"%value"}},fontsize_class:{inline:"span",attributes:{class:"%value"}},blockquote:{block:"blockquote",wrapper:!0,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(e,t,n){return Hn(e)&&e.hasAttribute("href")},onformat:function(n,e,t){Nt.each(t,function(e,t){r.setAttrib(n,t,e)})}},lang:{inline:"span",clear_child_styles:!0,remove_similar:!0,attributes:{lang:"%value","data-mce-lang":function(e){var t;return null!==(t=null==e?void 0:e.customValue)&&void 0!==t?t:null}}},removeformat:[{selector:"b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]},Nt.each("p h1 h2 h3 h4 h5 h6 div address pre dt dd samp".split(/\s/),function(e){t[e]={block:e,remove:"all"}}),t)),o(e.getParam("formats")),{get:function(e){return V(e)?n[e]:n},has:function(e){return Ee(n,e)},register:o,unregister:function(e){return e&&n[e]&&delete n[e],n}}),l=au(null);return function(e){e.addShortcut("meta+b","","Bold"),e.addShortcut("meta+i","","Italic"),e.addShortcut("meta+u","","Underline");for(var t=1;t<=6;t++)e.addShortcut("access+"+t,"",["FormatBlock",!1,"h"+t]);e.addShortcut("access+7","",["FormatBlock",!1,"p"]),e.addShortcut("access+8","",["FormatBlock",!1,"div"]),e.addShortcut("access+9","",["FormatBlock",!1,"address"])}(c),(i=c).on("mouseup keydown",function(e){var t=i,n=e.keyCode,r=t.selection,o=t.getBody();Hg(t,null,!1),8!==n&&46!==n||!r.isCollapsed()||r.getStart().innerHTML!==Cp||Hg(t,qc(o,r.getStart())),37!==n&&39!==n||Hg(t,qc(o,r.getStart()))}),{get:a.get,has:a.has,register:a.register,unregister:a.unregister,apply:function(e,t,n){var r=e,o=t,i=n;yh(c).formatter.apply(r,o,i)},remove:function(e,t,n,r){var o=e,i=t,a=n,u=r;yh(c).formatter.remove(o,i,a,u)},toggle:function(e,t,n){var r=e,o=t,i=n;yh(c).formatter.toggle(r,o,i)},match:function(e,t,n,r){return o=e,i=t,a=n,u=r,yh(c).formatter.match(o,i,a,u);var o,i,a,u},closest:function(e){return t=e,yh(c).formatter.closest(t);var t},matchAll:function(e,t){return n=e,r=t,yh(c).formatter.matchAll(n,r);var n,r},matchNode:function(e,t,n,r){return o=e,i=t,a=n,u=r,yh(c).formatter.matchNode(o,i,a,u);var o,i,a,u},canApply:function(e){return t=e,yh(c).formatter.canApply(t);var t},formatChanged:function(e,t,n,r){return o=l,i=e,a=t,u=n,s=r,yh(c).formatter.formatChanged(o,i,a,u,s);var o,i,a,u,s},getCssText:R(db,c)}}function gb(e){switch(e.toLowerCase()){case"undo":case"redo":case"mcerepaint":case"mcefocus":return 1;default:return}}function pb(s){var e,n,r,o,i,c=du(),l=au(0),f=au(0),d={data:[],typing:!1,beforeChange:function(){var e=l,t=c;yh(s).undoManager.beforeChange(e,t)},add:function(e,t){return n=d,r=f,o=l,i=c,a=e,u=t,yh(s).undoManager.add(n,r,o,i,a,u);var n,r,o,i,a,u},undo:function(){return e=d,t=l,n=f,yh(s).undoManager.undo(e,t,n);var e,t,n},redo:function(){return e=f,t=d.data,yh(s).undoManager.redo(e,t);var e,t},clear:function(){var e=d,t=f;yh(s).undoManager.clear(e,t)},reset:function(){var e=d;yh(s).undoManager.reset(e)},hasUndo:function(){return e=d,t=f,yh(s).undoManager.hasUndo(e,t);var e,t},hasRedo:function(){return e=d,t=f,yh(s).undoManager.hasRedo(e,t);var e,t},transact:function(e){return t=d,n=l,r=e,yh(s).undoManager.transact(t,n,r);var t,n,r},ignore:function(e){var t=l,n=e;yh(s).undoManager.ignore(t,n)},extra:function(e,t){var n=d,r=f,o=e,i=t;yh(s).undoManager.extra(n,r,o,i)}};return hh(s)||(r=d,o=l,i=au(!1),(n=s).on("init",function(){r.add()}),n.on("BeforeExecCommand",function(e){gb(e.command)||(gh(r,o),r.beforeChange())}),n.on("ExecCommand",function(e){gb(e.command)||a(e)}),n.on("ObjectResizeStart cut",function(){r.beforeChange()}),n.on("SaveContent ObjectResized blur",a),n.on("dragend",a),n.on("keyup",function(e){var t=e.keyCode;e.isDefaultPrevented()||((33<=t&&t<=36||37<=t&&t<=40||45===t||e.ctrlKey)&&(a(),n.nodeChanged()),46!==t&&8!==t||n.nodeChanged(),i.get()&&r.typing&&!1===fh(uh(n),r.data[0])&&(!1===n.isDirty()&&(n.setDirty(!0),n.fire("change",{level:r.data[0],lastLevel:null})),n.fire("TypingUndo"),i.set(!1),n.nodeChanged()))}),n.on("keydown",function(e){var t,n=e.keyCode;e.isDefaultPrevented()||(33<=n&&n<=36||37<=n&&n<=40||45===n?r.typing&&a(e):(t=e.ctrlKey&&!e.altKey||e.metaKey,!(n<16||20<n)||224===n||91===n||r.typing||t||(r.beforeChange(),mh(r,!0,o),r.add({},e),i.set(!0))))}),n.on("mousedown",function(e){r.typing&&a(e)}),n.on("input",function(e){e.inputType&&("insertReplacementText"===e.inputType||"insertText"===e.inputType&&null===e.data||"insertFromPaste"===e.inputType||"insertFromDrop"===e.inputType)&&a(e)}),n.on("AddUndo Undo Redo ClearUndos",function(e){e.isDefaultPrevented()||n.nodeChanged()})),(e=s).addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo"),d;function a(e){mh(r,!1,o),r.add({},e)}}function hb(e){return"keydown"===e.type||"keyup"===e.type}function vb(e){var t=e.keyCode;return t===If.BACKSPACE||t===If.DELETE}function bb(e,t){return ze(Et.fromDom(t),e.getParam("inline_boundaries_selector","a[href],code,.mce-annotation","string"))}function yb(e,t,n){var r,o,i=(r=e,o=t,U(eu.DOM.getParents(n.container(),"*",o),r));return ve.from(i[i.length-1])}function Cb(e,t){if(!t)return t;var n=t.container(),r=t.offset();return e?Ir(n)?Vn(n.nextSibling)?cs(n.nextSibling,0):cs.after(n):Ur(t)?cs(n,r+1):t:Ir(n)?Vn(n.previousSibling)?cs(n.previousSibling,n.previousSibling.data.length):cs.before(n):zr(t)?cs(n,r-1):t}function xb(e){return po(e)||vo(e)}function wb(e,t){return Ve(e,t)?hr(t,xb,(n=e,function(e){return je(n,Et.fromDom(e.dom.parentNode))})):ve.none();var n}function Sb(e){var t,n,r;e.dom.isEmpty(e.getBody())&&(e.setContent(""),r=(n=(t=e).getBody()).firstChild&&t.dom.isBlock(n.firstChild)?n.firstChild:n,t.selection.setCursorLocation(r,0))}function Nb(e,t){return{from:e,to:t}}function Eb(e,t){return wb(Et.fromDom(e),Et.fromDom(t.container())).map(function(e){return{block:e,position:t}})}function kb(e){var t,n=z(t=Tn(e),go).fold(J(t),function(e){return t.slice(0,e)});return Y(n,In),n}function _b(e,t){return M(ym(t,e).reverse(),function(e){return Kr(e)}).each(In)}function Ab(e,t,n,r){if(Kr(n))return hm(n),rf(n.dom);0===U(Lt(r),function(e){return!Kr(e)}).length&&Kr(t)&&qt(r,Et.fromTag("br"));var o=nf(n.dom,cs.before(r.dom));return Y(kb(t),function(e){qt(r,e)}),_b(e,t),o}function Rb(e,t,n){if(Kr(n))return In(n),Kr(t)&&hm(t),rf(t.dom);var r=of(n.dom);return Y(kb(t),function(e){Ln(n,e)}),_b(e,t),r}function Db(e,t){jc(e,t.dom).map(function(e){return e.getNode()}).map(Et.fromDom).filter(Pr).each(In)}function Tb(e,t,n){return Db(!0,t),Db(!1,n),(Ve(o=n,r=t)?(i=ym(r,o),ve.from(i[i.length-1])):ve.none()).fold(R(Rb,e,t,n),R(Ab,e,t,n));var r,o,i}function Ob(e,t,n,r){return t?Tb(e,r,n):Tb(e,n,r)}function Bb(t,n){var e,r,o,i,a,u,s,c=Et.fromDom(t.getBody()),l=(e=c.dom,r=n,((o=t.selection.getRng()).collapsed?(a=r,u=Eb(i=e,cs.fromRangeStart(o)),s=u.bind(function(e){return Zl(a,i,e.position).bind(function(e){return Eb(i,e).map(function(e){return t=i,n=a,Kn((r=e).position.getNode())&&!1===Kr(r.block)?jc(!1,r.block.dom).bind(function(e){return e.isEqual(r.position)?Zl(n,t,e).bind(function(e){return Eb(t,e)}):ve.some(r)}).getOr(r):r;var t,n,r})})}),dn(u,s,Nb).filter(function(e){return!1===je(e.from.block,e.to.block)&&Ot((n=e).from.block).bind(function(t){return Ot(n.to.block).filter(function(e){return je(t,e)})}).isSome()&&!1===Gn((t=e).from.block.dom)&&!1===Gn(t.to.block.dom);var t,n})):ve.none()).bind(function(e){return Ob(c,n,e.from.block,e.to.block)}));return l.each(function(e){t.selection.setRng(e.toRange())}),l.isSome()}function Pb(e,t){var n=Et.fromDom(t),r=R(je,e);return pr(n,yo,r).isSome()}function Lb(e){var n,r,o,t,i,a,u,s,c,l,f=Et.fromDom(e.getBody()),d=e.selection.getRng();return a=d,c=nf((i=f).dom,cs.fromRangeStart(a)).isNone(),l=tf(i.dom,cs.fromRangeEnd(a)).isNone(),!Pb(u=i,(s=a).startContainer)&&!Pb(u,s.endContainer)&&c&&l?((t=e).setContent(""),t.selection.setCursorLocation(),!0):(n=f,r=e.selection,o=r.getRng(),dn(wb(n,Et.fromDom(o.startContainer)),wb(n,Et.fromDom(o.endContainer)),function(e,t){return!1===je(e,t)&&(o.deleteContents(),Ob(n,!0,e,t).each(function(e){r.setRng(e.toRange())}),!0)}).getOr(!1))}function Ib(e,t){return!e.selection.isCollapsed()&&Lb(e)}function Mb(e,t,n,r,o){return ve.from(t._selectionOverrides.showCaret(e,n,r,o))}function Fb(e,t){var n,r;return e.fire("BeforeObjectSelected",{target:t}).isDefaultPrevented()?ve.none():ve.some(((r=(n=t).ownerDocument.createRange()).selectNode(n),r))}function Ub(e,t,n){var r=nc(1,e.getBody(),t),o=cs.fromRangeStart(r),i=o.getNode();if(Ec(i))return Mb(1,e,i,!o.isAtEnd(),!1);var a=o.getNode(!0);if(Ec(a))return Mb(1,e,a,!1,!1);var u=e.dom.getParent(o.getNode(),function(e){return Ly(e)||Py(e)});return Ec(u)?Mb(1,e,u,!1,n):ve.none()}function zb(e,t,n){return t.collapsed?Ub(e,t,n).getOr(t):t}function Hb(e){return rp(e)||Zg(e)}function jb(e){return op(e)||ep(e)}function Vb(n,r,e,t,o,i){var a,u;return Mb(t,n,i.getNode(!o),o,!0).each(function(e){var t;r.collapsed?(t=r.cloneRange(),o?t.setEnd(e.startContainer,e.startOffset):t.setStart(e.endContainer,e.endOffset),t.deleteContents()):r.deleteContents(),n.selection.setRng(e)}),a=n.dom,Vn(u=e)&&0===u.data.length&&a.remove(u),!0}function qb(e,t){var n=e.selection.getRng();if(!Vn(n.commonAncestorContainer))return!1;var r=t?sc.Forwards:sc.Backwards,o=Mc(e.getBody()),i=R(ac,t?o.next:o.prev),a=t?Hb:jb,u=oc(r,e.getBody(),n),s=Cb(t,i(u));if(!s||!uc(u,s))return!1;if(a(s))return Vb(e,n,u.getNode(),r,t,s);var c=i(s);return!!(c&&a(c)&&uc(s,c))&&Vb(e,n,u.getNode(),r,t,c)}function $b(l,f,d){return Zl(f,l,d).bind(function(e){return s=e.getNode(),yo(Et.fromDom(s))||vo(Et.fromDom(s))||(o=l,u=e,rc(!(i=f),a=d).fold(function(){return rc(i,u).fold(D,c)},c))?ve.none():f&&Gn(e.getNode())||!1===f&&Gn(e.getNode(!0))?(t=l,n=d,r=e.getNode(!1===f),wb(Et.fromDom(t),Et.fromDom(n.getNode())).map(function(e){return Kr(e)?Iy.remove(e.dom):Iy.moveToElement(r)}).orThunk(function(){return ve.some(Iy.moveToElement(r))})):f&&op(d)||!1===f&&rp(d)?ve.some(Iy.moveToPosition(e)):ve.none();var t,n,r,o,i,a,u,s;function c(e){return Br(Et.fromDom(e))&&!Qs(a,u,o)}})}function Wb(e,t){return ve.from(bf(e.getBody(),t))}function Kb(m,g){var e=m.selection.getNode();return Wb(m,e).filter(Gn).fold(function(){return s=m.getBody(),l=nc((c=g)?1:-1,s,m.selection.getRng()),f=cs.fromRangeStart(l),d=Et.fromDom(s),(!1===c&&op(f)?ve.some(Iy.remove(f.getNode(!0))):c&&rp(f)?ve.some(Iy.remove(f.getNode())):!1===c&&rp(f)&&_m(d,f)?cp(d,f).map(function(e){return Iy.remove(e.getNode())}):c&&op(f)&&km(d,f)?lp(d,f).map(function(e){return Iy.remove(e.getNode())}):(r=s,e=c,a=(o=f).getNode(!1===(i=e)),u=i?"after":"before",Hn(a)&&a.getAttribute("data-mce-caret")===u?(n=o.getNode(!1===(t=e)),(t&&Gn(n.nextSibling)?ve.some(Iy.moveToElement(n.nextSibling)):!1===t&&Gn(n.previousSibling)?ve.some(Iy.moveToElement(n.previousSibling)):ve.none()).fold(function(){return $b(r,e,o)},ve.some)):$b(r,e,o).bind(function(e){return t=r,n=o,e.fold(function(e){return ve.some(Iy.remove(e))},function(e){return ve.some(Iy.moveToElement(e))},function(e){return Qs(n,e,t)?ve.none():ve.some(Iy.moveToPosition(e))});var t,n}))).exists(function(e){return e.fold(function(e){return o._selectionOverrides.hideFakeCaret(),Qm(o,i,Et.fromDom(e)),!0},(r=i=g,function(e){var t=r?cs.before(e):cs.after(e);return n.selection.setRng(t.toRange()),!0}),(t=n=o=m,function(e){return t.selection.setRng(e.toRange()),!0}));var t,n,r,o,i});var r,e,o,t,n,i,a,u,s,c,l,f,d},w)}function Xb(e,t){var n=e.selection.getNode();return!(!Gn(n)||Jn(n))&&Wb(e,n.parentNode).filter(Gn).fold(function(){return Y(yu(Et.fromDom(e.getBody()),".mce-offscreen-selection"),In),Qm(e,t,Et.fromDom(e.selection.getNode())),Sb(e),!0},w)}function Yb(e){var t,n=e.dom,r=e.selection,o=bf(e.getBody(),r.getNode());return Yn(o)&&n.isBlock(o)&&n.isEmpty(o)&&(t=n.create("br",{"data-mce-bogus":"1"}),n.setHTML(o,""),o.appendChild(t),r.setRng(cs.before(t).toRange())),!0}function Gb(e,t){return(e.selection.isCollapsed()?Kb:Xb)(e,t)}function Jb(e,t){return!!e.selection.isCollapsed()&&(n=e,r=t,o=cs.fromRangeStart(n.selection.getRng()),Zl(r,n.getBody(),o).filter(function(e){return(r?Jg:Qg)(e)}).bind(function(e){return ve.from(Zs(r?0:-1,e))}).exists(function(e){return n.selection.select(e),!0}));var n,r,o}function Qb(e){return My(e)&&e.data[0]===So}function Zb(e){return My(e)&&e.data[e.data.length-1]===So}function ey(e){return e.ownerDocument.createTextNode(So)}function ty(e,t){return(e?function(e){if(My(e.previousSibling))return Zb(e.previousSibling)||e.previousSibling.appendData(So),e.previousSibling;if(My(e))return Qb(e)||e.insertData(0,So),e;var t=ey(e);return e.parentNode.insertBefore(t,e),t}:function(e){if(My(e.nextSibling))return Qb(e.nextSibling)||e.nextSibling.insertData(0,So),e.nextSibling;if(My(e))return Zb(e)||e.appendData(So),e;var t=ey(e);return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t})(t)}function ny(e,t){return Vn(e.container())?ty(t,e.container()):ty(t,e.getNode())}function ry(e,t){var n=t.get();return n&&e.container()===n&&Ir(n)}function oy(n,e){return e.fold(function(e){Cc(n.get());var t=Fy(e);return n.set(t),ve.some(cs(t,t.length-1))},function(e){return rf(e).map(function(e){if(ry(e,n))return cs(n.get(),1);Cc(n.get());var t=ny(e,!0);return n.set(t),cs(t,1)})},function(e){return of(e).map(function(e){if(ry(e,n))return cs(n.get(),n.get().length-1);Cc(n.get());var t=ny(e,!1);return n.set(t),cs(t,t.length-1)})},function(e){Cc(n.get());var t=Uy(e);return n.set(t),ve.some(cs(t,1))})}function iy(e,t){for(var n=0;n<e.length;n++){var r=e[n].apply(null,t);if(r.isSome())return r}return ve.none()}function ay(e,t){return Js(t,e)||e}function uy(e,t,n){var r=Oy(n),o=ay(t,r.container());return yb(e,o,r).fold(function(){return tf(o,r).bind(R(yb,e,o)).map(function(e){return zy.before(e)})},ve.none)}function sy(e,t){return null===qc(e,t)}function cy(e,t,n){return yb(e,t,n).filter(R(sy,t))}function ly(e,t,n){var r=By(n);return cy(e,t,r).bind(function(e){return nf(e,r).isNone()?ve.some(zy.start(e)):ve.none()})}function fy(e,t,n){var r=Oy(n);return cy(e,t,r).bind(function(e){return tf(e,r).isNone()?ve.some(zy.end(e)):ve.none()})}function dy(e,t,n){var r=By(n),o=ay(t,r.container());return yb(e,o,r).fold(function(){return nf(o,r).bind(R(yb,e,o)).map(function(e){return zy.after(e)})},ve.none)}function my(e){return!1===(t=Hy(e),"rtl"===eu.DOM.getStyle(t,"direction",!0)||(n=t.textContent,Ty.test(n)));var t,n}function gy(e,t,n){return iy([uy,ly,fy,dy],[e,t,n]).filter(my)}function py(e){return e.fold(J("before"),J("start"),J("end"),J("after"))}function hy(e){return e.fold(zy.before,zy.before,zy.after,zy.after)}function vy(e){return e.fold(zy.start,zy.start,zy.end,zy.end)}function by(a,e,u,t,n,s){return dn(yb(e,u,t),yb(e,u,n),function(e,t){return e!==t&&(r=t,o=Js(e,n=u),i=Js(r,n),o&&o===i)?zy.after(a?e:t):s;var n,r,o,i}).getOr(s)}function yy(e,r){return e.fold(w,function(e){return n=r,!(py(t=e)===py(n)&&Hy(t)===Hy(n));var t,n})}function Cy(e,t){return e?t.fold(i(ve.some,zy.start),ve.none,i(ve.some,zy.after),ve.none):t.fold(ve.none,i(ve.some,zy.before),ve.none,i(ve.some,zy.end))}function xy(e,a,u,s){var t=Cb(e,s),c=gy(a,u,t);return gy(a,u,t).bind(R(Cy,e)).orThunk(function(){return n=a,r=u,o=c,i=Cb(t=e,s),Zl(t,r,i).map(R(Cb,t)).fold(function(){return o.map(hy)},function(e){return gy(n,r,e).map(R(by,t,n,r,i,e)).filter(R(yy,o))}).filter(my);var t,n,r,o,i})}function wy(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=window.console;r&&(r.error||r.log).apply(r,Ae([e],t,!1))}var Sy,Ny,Ey=function(t,e){var n=t.editorManager.baseURL+"/skins/content",r="content"+t.editorManager.suffix+".css",o=!0===t.inline;return A(e,function(e){return/^[a-z0-9\-]+$/i.test(e)&&!o?n+"/"+e+"/"+r:t.documentBaseURI.toAbsolute(e)})},ky=0,_y=Nt.each,Ay=eu.DOM,Ry=[9,27,If.HOME,If.END,19,20,44,144,145,33,34,45,16,17,18,91,92,93,If.DOWN,If.UP,If.LEFT,If.RIGHT].concat(xt.browser.isFirefox()?[224]:[]),Dy="data-mce-placeholder",Ty=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,Oy=R(Cb,!0),By=R(Cb,!1),Py=Yn,Ly=Gn,Iy=ir([{remove:["element"]},{moveToElement:["element"]},{moveToPosition:["position"]}]),My=Vn,Fy=R(ty,!0),Uy=R(ty,!1),zy=ir([{before:["element"]},{start:["element"]},{end:["element"]},{after:["element"]}]),Hy=function(e){return e.fold(u,u,u,u)};function jy(e,t,n){var r=e?1:-1;return t.setRng(cs(n.container(),n.offset()+r).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0}function Vy(e,t){return e===sc.Backwards?q(t):t}function qy(e,t,n,r){for(var o,i,a,u,s=Mc(n),c=r,l=[];c;){var f=(a=s,u=c,t===sc.Forwards?a.next(u):a.prev(u));if(!f)break;if(Kn(f.getNode(!1)))return t===sc.Forwards?{positions:Vy(t,l).concat([f]),breakType:Sy.Br,breakAt:ve.some(f)}:{positions:Vy(t,l),breakType:Sy.Br,breakAt:ve.some(f)};if(f.isVisible()){if(e(c,f)){var d=(o=c,Kn((i=f).getNode(t===sc.Forwards))?Sy.Br:!1===Qs(o,i)?Sy.Block:Sy.Wrap);return{positions:Vy(t,l),breakType:d,breakAt:ve.some(f)}}l.push(f),c=f}else c=f}return{positions:Vy(t,l),breakType:Sy.Eol,breakAt:ve.none()}}function $y(n,r,o,e){return r(o,e).breakAt.map(function(e){var t=r(o,e).positions;return n===sc.Backwards?t.concat(e):[e].concat(t)}).getOr([])}function Wy(e,i){return L(e,function(e,o){return e.fold(function(){return ve.some(o)},function(r){return dn(Q(r.getClientRects()),Q(o.getClientRects()),function(e,t){var n=Math.abs(i-e.left);return Math.abs(i-t.left)<=n?o:r}).or(e)})},ve.none())}function Ky(t,e){return Q(e.getClientRects()).bind(function(e){return Wy(t,e.left)})}function Xy(n){function e(e){return A(e,function(e){var t=Ru(e);return t.node=n,t})}if(Hn(n))return e(n.getClientRects());if(Vn(n)){var t=n.ownerDocument.createRange();return t.setStart(n,0),t.setEnd(n,n.data.length),e(t.getClientRects())}}function Yy(e){return H(e,Xy)}R(xy,!1),R(xy,!0),(Ny=Sy={})[Ny.Br=0]="Br",Ny[Ny.Block=1]="Block",Ny[Ny.Wrap=2]="Wrap",Ny[Ny.Eol=3]="Eol";var Gy,Jy,Qy=R(qy,cs.isAbove,-1),Zy=R(qy,cs.isBelow,1),e0=R($y,-1,Qy),t0=R($y,1,Zy);function n0(o,i,a,e,u,t){function n(e){var t=Yy([e]);-1===o&&(t=t.reverse());for(var n=0;n<t.length;n++){var r=t[n];if(!a(r,l)){if(0<c.length&&i(r,pe(c))&&s++,r.line=s,u(r))return!0;c.push(r)}}}var s=0,c=[],l=pe(t.getClientRects());if(!l)return c;var r=t.getNode();return n(r),function(e,t,n,r){for(;r=Gs(r,e,qr,t);)if(n(r))return}(o,e,n,r),c}function r0(t){return function(e){return e.line>t}}function o0(t){return function(e){return e.line===t}}function i0(e,t){return Math.abs(e.left-t)}function a0(e,t){return Math.abs(e.right-t)}function u0(e,t){return e>=t.left&&e<=t.right}function s0(e,t){return e>=t.top&&e<=t.bottom}function c0(e,o,i){return void 0===i&&(i=w),me(e,function(e,t){if(u0(o,t))return i(t)?t:e;if(u0(o,e))return i(e)?e:t;var n=Math.min(i0(e,o),a0(e,o)),r=Math.min(i0(t,o),a0(t,o));return r===n&&se(t,"node")&&ZC(t.node)||r<n?t:e})}function l0(e,t,n,r,o){var i=e1(r,e,qr,t,!o);do{if(!i||n(i))return}while(i=e1(i,e,qr,t))}function f0(e,t,n){function r(e){return!cn(e.node)&&!Qn(e.node)}var o,i,a,u=Yy(U(xe(e.getElementsByTagName("*")),Xs)),s=U(u,R(s0,n));if((a=c0(s,t,r))&&((a=c0(function(e,r,t){function n(t,e){var n=U(Yy([e]),function(e){return!t(e,r)});return o=o.concat(n),0===n.length}void 0===t&&(t=!0);var o=[];return o.push(r),l0(Gy.Up,e,R(n,Ou),r.node,t),l0(Gy.Down,e,R(n,Bu),r.node,t),o}(e,a,r(a)),t,r))&&Xs(a.node)))return{node:(o=a).node,before:i0(o,i=t)<a0(o,i)};return null}function d0(e,t){e.selection.setRng(t),nd(e,e.selection.getRng())}function m0(e,t,n){return ve.some(zb(e,t,n))}function g0(e,t,n,r,o,i){var a=t===sc.Forwards,u=Mc(e.getBody()),s=R(ac,a?u.next:u.prev),c=a?r:o;if(!n.collapsed){var l=Lu(n);if(i(l))return Mb(t,e,l,t===sc.Backwards,!1)}var f=oc(t,e.getBody(),n);if(c(f))return Fb(e,f.getNode(!a));var d=Cb(a,s(f)),m=jr(n);if(!d)return m?ve.some(n):ve.none();if(c(d))return Mb(t,e,d.getNode(!a),a,!1);var g=s(d);return g&&c(g)&&uc(d,g)?Mb(t,e,g.getNode(!a),a,!1):m?m0(e,d.toRange(),!1):ve.none()}function p0(t,e,n,r,o,i){var a=oc(e,t.getBody(),n),u=pe(a.getClientRects()),s=e===Gy.Down;if(!u)return ve.none();var c,l=U((s?QC:JC)(t.getBody(),r0(1),a),o0(1)),f=u.left,d=c0(l,f);if(d&&i(d.node)){var m=Math.abs(f-d.left),g=Math.abs(f-d.right);return Mb(e,t,d.node,m<g,!1)}if(c=r(a)?a.getNode():o(a)?a.getNode(!0):Lu(n)){var p=function(e,t,n,r){function o(e){return pe(e.getClientRects())}var i,a,u,s=Mc(t),c=[],l=0,f=1===e?(i=s.next,a=Bu,u=Ou,cs.after(r)):(i=s.prev,a=Ou,u=Bu,cs.before(r)),d=o(f);do{if(f.isVisible()){var m=o(f);if(!u(m,d)){0<c.length&&a(m,pe(c))&&l++;var g=Ru(m);if(g.position=f,g.line=l,n(g))return c;c.push(g)}}}while(f=i(f));return c}(e,t.getBody(),r0(1),c),h=c0(U(p,o0(1)),f);if(h)return m0(t,h.position.toRange(),!1);if(h=pe(U(p,o0(0))))return m0(t,h.position.toRange(),!1)}return 0===l.length?t1(t,s).filter(s?o:r).map(function(e){return zb(t,e.toRange(),!1)}):ve.none()}function h0(t,e,n){return t1(t,e).filter(n).exists(function(e){return t.selection.setRng(e.toRange()),!0})}function v0(e,t){var n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)}function b0(e,t){e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")}function y0(t,e,n){return oy(e,n).map(function(e){return v0(t,e),n})}function C0(e,t,n){return!!Ms(e)&&(o=t,i=n,a=(r=e).getBody(),u=cs.fromRangeStart(r.selection.getRng()),xy(i,R(bb,r),a,u).bind(function(e){return y0(r,o,e)}).isSome());var r,o,i,a,u}function x0(e,t,n){return!!Ms(t)&&(r=e,i=(o=t).selection.getRng(),a=r?cs.fromRangeEnd(i):cs.fromRangeStart(i),!!y(o.selection.getSel().modify)&&(r&&Ur(a)?jy(!0,o.selection,a):!(r||!zr(a))&&jy(!1,o.selection,a)));var r,o,i,a}function w0(g){var p=au(null),h=R(bb,g);return g.on("NodeChange",function(e){var n,r,o,t,i,a,u,s,c,l,f,d,m;!Ms(g)||xt.browser.isIE()&&e.initial||(i=h,a=g.dom,u=e.parents,Y($(s=U(A(yu(Et.fromDom(a.getRoot()),'*[data-mce-selected="inline-boundary"]'),function(e){return e.dom}),i),c=U(u,i)),R(b0,!1)),Y($(c,s),R(b0,!0)),f=p,(l=g).selection.isCollapsed()&&!0!==l.composing&&f.get()&&(d=cs.fromRangeStart(l.selection.getRng()),cs.isTextPosition(d)&&!1===(Ur(m=d)||zr(m))&&(v0(l,qs(f.get(),d)),f.set(null))),n=h,r=g,o=p,t=e.parents,r.selection.isCollapsed()&&Y(U(t,n),function(e){var t=cs.fromRangeStart(r.selection.getRng());gy(n,r.getBody(),t).bind(function(e){return y0(r,o,e)})}))}),p}function S0(n,t,r){if(Ms(n)){var e=t1(n,t).getOrThunk(function(){var e=n.selection.getRng();return t?cs.fromRangeEnd(e):cs.fromRangeStart(e)});return gy(R(bb,n),n.getBody(),e).exists(function(e){var t=hy(e);return oy(r,t).exists(function(e){return v0(n,e),!0})})}return!1}function N0(t,n){return function(e){return oy(n,e).exists(function(e){return v0(t,e),!0})}}function E0(r,o,i,a){var u=r.getBody(),s=R(bb,r);r.undoManager.ignore(function(){var e,t,n;r.selection.setRng((e=i,t=a,(n=document.createRange()).setStart(e.container(),e.offset()),n.setEnd(t.container(),t.offset()),n)),r.execCommand("Delete"),gy(s,u,cs.fromRangeStart(r.selection.getRng())).map(vy).map(N0(r,o))}),r.nodeChanged()}function k0(e,t,n){if(e.selection.isCollapsed()&&Ms(e)){var r=cs.fromRangeStart(e.selection.getRng());return o=t,a=n,u=r,s=(i=e).getBody(),c=Js(u.container(),s)||s,l=R(bb,i),(f=gy(l,c,u)).bind(function(e){return a?e.fold(J(ve.some(vy(e))),ve.none,J(ve.some(hy(e))),ve.none):e.fold(ve.none,J(ve.some(hy(e))),ve.none,J(ve.some(vy(e))))}).map(N0(i,o)).getOrThunk(function(){var t=Hc(a,c,u),e=t.bind(function(e){return gy(l,c,e)});return dn(f,e,function(){return yb(l,c,u).exists(function(e){return!!dn(rf(o=e),of(o),function(e,t){var n=Cb(!0,e),r=Cb(!1,t);return tf(o,n).forall(function(e){return e.isEqual(r)})}).getOr(!0)&&(Qm(i,a,Et.fromDom(e)),!0);var o})}).orThunk(function(){return e.bind(function(e){return t.map(function(e){return a?E0(i,o,u,e):E0(i,o,e,u),!0})})}).getOr(!1)})}var i,o,a,u,s,c,l,f;return!1}function _0(e){return 1===zt(e)}function A0(g,p){var t,e=Et.fromDom(g.getBody()),n=Et.fromDom(g.selection.getStart()),h=U(z(t=ym(n,e),go).fold(J(t),function(e){return t.slice(0,e)}),_0);return Z(h).exists(function(e){var t,n,r,o,i,a,u,s,c,l=cs.fromRangeStart(g.selection.getRng()),f=p,d=l,m=e.dom;return!(!dn(rf(m),of(m),function(e,t){var n=Cb(!0,e),r=Cb(!1,t),o=Cb(!1,d);return f?tf(m,o).exists(function(e){return e.isEqual(r)&&d.isEqual(n)}):nf(m,o).exists(function(e){return e.isEqual(n)&&d.isEqual(r)})}).getOr(!0)||Vc((t=e).dom)&&Mg(t.dom)||(n=p,o=e,0===(c=A(U(h,R(Wg,r=g)),function(e){return e.dom})).length?Qm(r,n,o):(a=o.dom,s=Vg(c,(u=Ug(!1)).dom),qt(Et.fromDom(a),u),In(Et.fromDom(a)),i=cs(s,0),r.selection.setRng(i.toRange())),0))})}function R0(e,t){return!!e.selection.isCollapsed()&&A0(e,t)}function D0(e,t,n){return e._selectionOverrides.hideFakeCaret(),Qm(e,t,Et.fromDom(n)),!0}function T0(e,t){return e.selection.isCollapsed()?(i=e,u=(a=t)?Zg:ep,s=a?sc.Forwards:sc.Backwards,c=oc(s,i.getBody(),i.selection.getRng()),u(c)?D0(i,a,c.getNode(!a)):ve.from(Cb(a,c)).filter(function(e){return u(e)&&uc(c,e)}).exists(function(e){return D0(i,a,e.getNode(!a))})):(r=t,o=(n=e).selection.getNode(),!!Qn(o)&&D0(n,r,o));var n,r,o,i,a,u,s,c}function O0(e){var t=parseInt(e,10);return isNaN(t)?0:t}function B0(e,t){return(e||"table"===kt(t)?"margin":"padding")+("rtl"===wn(t,"direction")?"-right":"-left")}function P0(e){var n,t=o1(e);return!e.mode.isReadOnly()&&(1<t.length||(n=e,j(t,function(e){var t=Sn(e,B0(Os(n),e)).map(O0).getOr(0);return"false"!==n.dom.getContentEditable(e.dom)&&0<t})))}function L0(e){return ho(e)||vo(e)}function I0(e,s){var c=e.dom,t=e.selection,n=e.formatter,r=e.getParam("indentation","40px","string"),l=/[a-z%]+$/i.exec(r)[0],f=parseInt(r,10),d=Os(e),o=ks(e);e.queryCommandState("InsertUnorderedList")||e.queryCommandState("InsertOrderedList")||""!==o||c.getParent(t.getNode(),c.isBlock)||n.apply("div"),Y(o1(e),function(e){var t,n=c,r=s,o=f,i=l,a=e.dom,u=B0(d,Et.fromDom(a));"outdent"===r?(t=Math.max(0,O0(a.style[u])-o),n.setStyle(a,u,t?t+i:"")):(t=O0(a.style[u])+o+i,n.setStyle(a,u,t))})}function M0(e,t){if(e.selection.isCollapsed()&&P0(e)){var n=e.dom,r=e.selection.getRng(),o=cs.fromRangeStart(r),i=n.getParent(r.startContainer,n.isBlock);if(null!==i&&ip(Et.fromDom(i),o))return I0(e,"outdent"),!0}return!1}function F0(e,t){e.getDoc().execCommand(t,!1,null)}function U0(e){return void 0===e.touches||1!==e.touches.length?ve.none():ve.some(e.touches[0])}function z0(e,t){return Ee(e,t.nodeName)}function H0(e){var t,n,r,o=e.dom,i=e.selection,a=e.schema,u=a.getBlockElements(),s=i.getStart(),c=e.getBody(),l=ks(e);if(s&&Hn(s)&&l){var f=c.nodeName.toLowerCase();if(a.isValidChild(f,l.toLowerCase())&&(d=u,m=c,g=s,!F(bm(Et.fromDom(g),Et.fromDom(m)),function(e){return z0(d,e.dom)}))){for(var d,m,g,p,h,v=i.getRng(),b=v.startContainer,y=v.startOffset,C=v.endContainer,x=v.endOffset,w=Cd(e),s=c.firstChild;s;)p=u,Vn(h=s)||Hn(h)&&!z0(p,h)&&!Qc(h)?function(e,t){if(Vn(t)){if(0===t.nodeValue.length)return 1;if(/^\s+$/.test(t.nodeValue)&&(!t.nextSibling||z0(e,t.nextSibling)))return 1}}(u,s)?(s=(n=s).nextSibling,o.remove(n)):(t||(t=o.create(l,_s(e)),s.parentNode.insertBefore(t,s),r=!0),s=(n=s).nextSibling,t.appendChild(n)):(t=null,s=s.nextSibling);r&&w&&(v.setStart(b,y),v.setEnd(C,x),i.setRng(v),e.nodeChanged())}}}function j0(e,t){t.hasAttribute("data-mce-caret")&&(Hr(t),e.selection.setRng(e.selection.getRng()),e.selection.scrollIntoView(t))}function V0(e,t){var n=br(Et.fromDom(e.getBody()),"*[data-mce-caret]").map(function(e){return e.dom}).getOrNull();if(n)return"compositionstart"===t.type?(t.preventDefault(),t.stopPropagation(),void j0(e,n)):void(Fr(n)&&(j0(e,n),e.undoManager.add()))}function q0(e,t,n){var r,o,i,a=Mc(e.getBody()),u=R(ac,1===t?a.next:a.prev);!n.collapsed||""===ks(e)||(r=e.dom.getParent(n.startContainer,"PRE"))&&(u(cs.fromRangeStart(n))||(i=e.dom.create(ks(e)),(!xt.ie||11<=xt.ie)&&(i.innerHTML='<br data-mce-bogus="1">'),o=i,1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse()))}function $0(t,e){return n=t,r=e?sc.Forwards:sc.Backwards,o=n.selection.getRng(),g0(n,r,o,rp,op,i1).orThunk(function(){return q0(n,r,o),ve.none()}).exists(function(e){return d0(t,e),!0});var n,r,o}function W0(t,e){return r=e?1:-1,o=(n=t).selection.getRng(),p0(n,r,o,function(e){return rp(e)||tp(e)},function(e){return op(e)||np(e)},i1).orThunk(function(){return q0(n,r,o),ve.none()}).exists(function(e){return d0(t,e),!0});var n,r,o}function K0(e,t){return h0(e,t,t?op:rp)}function X0(e){return T(["figcaption"],kt(e))}function Y0(e){var t=document.createRange();return t.setStartBefore(e.dom),t.setEndBefore(e.dom),t}function G0(e,t,n){(n?Ln:Wt)(e,t)}function J0(h,v){var b=Et.fromDom(h.getBody()),y=cs.fromRangeStart(h.selection.getRng()),C=ks(h),x=_s(h),e=y,t=R(je,b);return hr(Et.fromDom(e.container()),go,t).filter(X0).exists(function(){if(d=b,m=y,v?(p=d.dom,Zy(p,m).breakAt.isNone()):(g=d.dom,Qy(g,m).breakAt.isNone())){var e=(t=b,r=x,o=v,""===(n=C)?(l=o,G0(t,f=Et.fromTag("br"),l),Y0(f)):(i=t,a=o,u=r,s=Et.fromTag(n),c=Et.fromTag("br"),hn(s,u),Ln(s,c),G0(i,s,a),Y0(c)));return h.selection.setRng(e),!0}var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p;return!1})}function Q0(e,t){return!!e.selection.isCollapsed()&&J0(e,t)}function Z0(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return function(){return e.apply(null,t)}}function eC(e,t){return M((n=t,H(A(e,function(e){return _e({shiftKey:!1,altKey:!1,ctrlKey:!1,metaKey:!1,keyCode:0,action:te},e)}),function(e){return n.keyCode===e.keyCode&&n.shiftKey===e.shiftKey&&n.altKey===e.altKey&&n.ctrlKey===e.ctrlKey&&n.metaKey===e.metaKey?[e]:[]})),function(e){return e.action()});var n}function tC(t,e){var n=e?sc.Forwards:sc.Backwards,r=t.selection.getRng();return g0(t,n,r,Zg,ep,Qn).exists(function(e){return d0(t,e),!0})}function nC(t,e){var n=e?1:-1,r=t.selection.getRng();return p0(t,n,r,Zg,ep,Qn).exists(function(e){return d0(t,e),!0})}function rC(e,t){return h0(e,t,t?ep:Zg)}function oC(e,t,n,r,o){var i,a=yu(Et.fromDom(n),"td,th,caption").map(function(e){return e.dom}),u=U((i=e,H(a,function(e){var t,n={left:(t=Ru(e.getBoundingClientRect())).left- -1,top:t.top- -1,right:t.right+-2,bottom:t.bottom+-2,width:t.width+-1,height:t.height+-1};return[{x:n.left,y:i(n),cell:e},{x:n.right,y:i(n),cell:e}]})),function(e){return t(e,o)}),s=r,c=o;return L(u,function(e,r){return e.fold(function(){return ve.some(r)},function(e){var t=Math.sqrt(Math.abs(e.x-s)+Math.abs(e.y-c)),n=Math.sqrt(Math.abs(r.x-s)+Math.abs(r.y-c));return ve.some(n<t?r:e)})},ve.none()).map(function(e){return e.cell})}function iC(e,t,n){var r,o,i=e(t,n);return i.breakType===Sy.Wrap&&0===i.positions.length||!Kn(n.getNode())&&i.breakType===Sy.Br&&1===i.positions.length?(r=e,o=t,!i.breakAt.exists(function(e){return r(o,e).breakAt.isSome()})):i.breakAt.isNone()}function aC(t,e,n,r){var o,i,a,u=t.selection.getRng(),s=e?1:-1;return!(!Ks()||(o=e,i=n,a=cs.fromRangeStart(u),!jc(!o,i).exists(function(e){return e.isEqual(a)}))||(Mb(s,t,n,!e,!1).each(function(e){d0(t,e)}),0))}function uC(u,s,c){var e,t,n=(e=!!s,t=c.getNode(e),Hn(t)&&"TABLE"===t.nodeName?ve.some(t):ve.none()),r=!1===s;n.fold(function(){return d0(u,c.toRange())},function(a){return jc(r,u.getBody()).filter(function(e){return e.isEqual(c)}).fold(function(){return d0(u,c.toRange())},function(e){var n,r,o=s,i=a,t=c;(r=ks(n=u))?n.undoManager.transact(function(){var e=Et.fromTag(r);hn(e,_s(n)),Ln(e,Et.fromTag("br")),(o?$t:qt)(Et.fromDom(i),e);var t=n.dom.createRng();t.setStart(e.dom,0),t.setEnd(e.dom,0),d0(n,t)}):d0(n,t.toRange())})})}function sC(e,t,n,r){var o,i,a,u,s,c,l,f,d,m,g=e.selection.getRng(),p=cs.fromRangeStart(g),h=e.getBody();if(t||!s1(r,p))return!(!t||!c1(r,p))&&(o=h,d=i=n,uC(e,t,v=Z((m=a=p).getClientRects()).bind(function(e){return u1(d,e.left,e.top)}).bind(function(e){return Ky(rf(t=e).map(function(e){return[e].concat(Zy(t,e).positions)}).getOr([]),m);var t}).orThunk(function(){return Q(a.getClientRects()).bind(function(e){return Wy(t0(o,cs.after(i)),e.left)})}).getOr(cs.after(i))),!0);var v=(u=h,l=s=n,Q((f=c=p).getClientRects()).bind(function(e){return a1(l,e.left,e.top)}).bind(function(e){return Ky(of(t=e).map(function(e){return Qy(t,e).positions.concat(e)}).getOr([]),f);var t}).orThunk(function(){return Q(c.getClientRects()).bind(function(e){return Wy(e0(u,cs.before(s)),e.left)})}).getOr(cs.before(s)));return uC(e,t,v),!0}function cC(n,r,o){return ve.from(n.dom.getParent(n.selection.getNode(),"td,th")).bind(function(t){return ve.from(n.dom.getParent(t,"table")).map(function(e){return o(n,r,e,t)})}).getOr(!1)}function lC(e,t){return cC(e,t,aC)}function fC(e,t){return cC(e,t,sC)}function dC(e,t){var n,r,o=t,i=e.dom,a=e.schema.getMoveCaretBeforeOnEnterElements();if(t){!/^(LI|DT|DD)$/.test(t.nodeName)||(r=function(e){for(;e;){if(1===e.nodeType||3===e.nodeType&&e.data&&/[\r\n\s]/.test(e.data))return e;e=e.nextSibling}}(t.firstChild))&&/^(UL|OL|DL)$/.test(r.nodeName)&&t.insertBefore(i.doc.createTextNode(wo),t.firstChild);var u=i.createRng();if(t.normalize(),t.hasChildNodes()){for(var s=new Dr(t,t);n=s.current();){if(Vn(n)){u.setStart(n,0),u.setEnd(n,0);break}if(a[n.nodeName.toLowerCase()]){u.setStartBefore(n),u.setEndBefore(n);break}o=n,n=s.next()}n||(u.setStart(o,0),u.setEnd(o,0))}else Kn(t)?t.nextSibling&&i.isBlock(t.nextSibling)?(u.setStartBefore(t),u.setEndBefore(t)):(u.setStartAfter(t),u.setEndAfter(t)):(u.setStart(t,0),u.setEnd(t,0));e.selection.setRng(u),nd(e,u)}}function mC(e){return ve.from(e.dom.getParent(e.selection.getStart(!0),e.dom.isBlock))}function gC(e,t){return e&&e.parentNode&&e.parentNode.nodeName===t}function pC(e){return e&&/^(OL|UL|LI)$/.test(e.nodeName)}function hC(e){var t=e.parentNode;return/^(LI|DT|DD)$/.test(t.nodeName)?t:e}function vC(e,t,n){for(var r=e[n?"firstChild":"lastChild"];r&&!Hn(r);)r=r[n?"nextSibling":"previousSibling"];return r===t}function bC(e){e.innerHTML='<br data-mce-bogus="1">'}function yC(e,t){return e.nodeName===t||e.previousSibling&&e.previousSibling.nodeName===t}function CC(e,t){return t&&e.isBlock(t)&&!/^(TD|TH|CAPTION|FORM)$/.test(t.nodeName)&&!/^(fixed|absolute)/i.test(t.style.position)&&"true"!==e.getContentEditable(t)}function xC(e,t,n){return!1===Vn(t)?n:e?1===n&&t.data.charAt(n-1)===So?0:n:n===t.data.length-1&&t.data.charAt(n)===So?t.data.length:n}function wC(e,t){for(var n,r=e.getRoot(),o=t;o!==r&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(n=o),o=o.parentNode;return o!==r?n:r}function SC(e,t){var n=ks(e);n&&n.toLowerCase()===t.tagName.toLowerCase()&&function(e,o,t){var i=e.dom;ve.from(t.style).map(i.parseStyle).each(function(e){var t=Nn(Et.fromDom(o)),n=_e(_e({},t),e);i.setStyles(o,n)}),dn(ve.from(t.class).map(function(e){return e.split(/\s+/)}),ve.from(o.className).map(function(e){return U(e.split(/\s+/),function(e){return""!==e})}),function(t,e){var n=U(e,function(e){return!T(t,e)}),r=Ae(Ae([],t,!0),n,!0);i.setAttrib(o,"class",r.join(" "))});var n=["style","class"],r=ae(t,function(e,t){return!T(n,t)});i.setAttribs(o,r)}(e,t,_s(e))}function NC(a,e){function t(e){var t,n=m,r=l.getTextInlineElements(),o=e||"TABLE"===C||"HR"===C?c.create(e||p):b.cloneNode(!1),i=o;if(!1===a.getParam("keep_styles",!0))c.setAttrib(o,"style",null),c.setAttrib(o,"class",null);else for(;r[n.nodeName]&&(Vc(n)||Qc(n)||(t=n.cloneNode(!1),c.setAttrib(t,"id",""),o.hasChildNodes()?t.appendChild(o.firstChild):i=t,o.appendChild(t))),(n=n.parentNode)&&n!==F;);return SC(a,o),bC(i),o}function n(e){var t,n,r=xC(e,m,g);if(!Vn(m)||!(e?0<r:r<m.nodeValue.length)){if(m.parentNode===b&&s&&!e)return 1;if(e&&Hn(m)&&m===b.firstChild)return 1;if(yC(m,"TABLE")||yC(m,"HR"))return s&&!e||!s&&e;var o=new Dr(m,b);for(Vn(m)&&(e&&0===r?o.prev():e||r!==m.nodeValue.length||o.next());t=o.current();){if(Hn(t)){if(!t.getAttribute("data-mce-bogus")&&(n=t.nodeName.toLowerCase(),f[n]&&"br"!==n))return}else if(Vn(t)&&!$r(t.nodeValue))return;e?o.prev():o.next()}return 1}}function r(){u=/^(H[1-6]|PRE|FIGURE)$/.test(C)&&"HGROUP"!==x?t(p):t(),a.getParam("end_container_on_empty_block",!1)&&CC(c,y)&&c.isEmpty(b)?u=c.split(y,b):c.insertAfter(u,b),dC(a,u)}var o,u,i,s,c=a.dom,l=a.schema,f=l.getNonEmptyElements(),d=a.selection.getRng();Of(c,d).each(function(e){d.setStart(e.startContainer,e.startOffset),d.setEnd(e.endContainer,e.endOffset)});var m=d.startContainer,g=d.startOffset,p=ks(a),h=!(!e||!e.shiftKey),v=!(!e||!e.ctrlKey);Hn(m)&&m.hasChildNodes()&&(s=g>m.childNodes.length-1,m=m.childNodes[Math.min(g,m.childNodes.length-1)]||m,g=s&&Vn(m)?m.nodeValue.length:0);var b,y,C,x,w,S,p,N,E,k,_,A,R,D,T,O,B,P,L,I,M,F=wC(c,m);F&&((p&&!h||!p&&h)&&(m=function(e,t,n,r){var o,i,a,u,s,c,l=p||"P",f=e.dom,d=wC(f,n),m=f.getParent(n,f.isBlock);if(!m||!CC(f,m)){if(s=((m=m||d)===e.getBody()||(c=m)&&/^(TD|TH|CAPTION)$/.test(c.nodeName)?m:m.parentNode).nodeName.toLowerCase(),!m.hasChildNodes())return SC(e,o=f.create(l)),m.appendChild(o),t.setStart(o,0),t.setEnd(o,0),o;for(a=n;a.parentNode!==m;)a=a.parentNode;for(;a&&!f.isBlock(a);)a=(i=a).previousSibling;if(i&&e.schema.isValidChild(s,l.toLowerCase())){for(SC(e,o=f.create(l)),i.parentNode.insertBefore(o,i),a=i;a&&!f.isBlock(a);)u=a.nextSibling,o.appendChild(a),a=u;t.setStart(n,r),t.setEnd(n,r)}}return n}(a,d,m,g)),y=(b=c.getParent(m,c.isBlock))?c.getParent(b.parentNode,c.isBlock):null,C=b?b.nodeName.toUpperCase():"","LI"!==(x=y?y.nodeName.toUpperCase():"")||v||(y=(b=y).parentNode,C=x),/^(LI|DT|DD)$/.test(C)&&c.isEmpty(b)?(E=t,k=y,_=b,A=p,I=(N=a).dom,M=N.selection.getRng(),k!==N.getBody()&&(D=(A=pC(R=k)&&pC(R.parentNode)?"LI":A)?E(A):I.create("BR"),vC(k,_,!0)&&vC(k,_,!1)?gC(k,"LI")?(T=hC(k),I.insertAfter(D,T),(null===(L=(P=k).parentNode)||void 0===L?void 0:L.firstChild)===P?I.remove(T):I.remove(k)):I.replace(D,k):(vC(k,_,!0)?gC(k,"LI")?(I.insertAfter(D,hC(k)),D.appendChild(I.doc.createTextNode(" ")),D.appendChild(k)):k.parentNode.insertBefore(D,k):vC(k,_,!1)?I.insertAfter(D,hC(k)):(k=hC(k),(O=M.cloneRange()).setStartAfter(_),O.setEndAfter(k),B=O.extractContents(),"LI"===A&&(B.firstChild&&"LI"===B.firstChild.nodeName)?(D=B.firstChild,I.insertAfter(B,k)):(I.insertAfter(B,k),I.insertAfter(D,k))),I.remove(_)),dC(N,D))):p&&b===a.getBody()||(p=p||"P",Lr(b)?(u=Hr(b),c.isEmpty(b)&&bC(b),SC(a,u),dC(a,u)):n()?r():n(!0)?(u=b.parentNode.insertBefore(t(),b),dC(a,yC(b,"HR")?u:b)):((S=(w=d).cloneRange()).setStart(w.startContainer,xC(!0,w.startContainer,w.startOffset)),S.setEnd(w.endContainer,xC(!1,w.endContainer,w.endOffset)),(o=S.cloneRange()).setEndAfter(b),i=o.extractContents(),Y(qu(Et.fromDom(i),An),function(e){var t=e.dom;t.nodeValue=Eo(t.nodeValue)}),function(e){for(;Vn(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(i),u=i.firstChild,c.insertAfter(i,b),function(e,t){var n,r,o=u,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;Hn(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(n=i.length;n--;)!(o=i[n]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(r=o)&&"A"===r.nodeName&&e.isEmpty(r)&&e.remove(o)}}(c,f),function(e,t){t.normalize();var n=t.lastChild;n&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")}(c,b),c.isEmpty(b)&&bC(b),u.normalize(),c.isEmpty(u)?(c.remove(u),r()):(SC(a,u),dC(a,u))),c.setAttrib(u,"id",""),a.fire("NewBlock",{newBlock:u})))}function EC(e,t,n){var r=e.dom.createRng();n?(r.setStartBefore(t),r.setEndBefore(t)):(r.setStartAfter(t),r.setEndAfter(t)),e.selection.setRng(r),nd(e,r)}function kC(e,t){var n=Et.fromTag("br");qt(Et.fromDom(t),n),e.undoManager.add()}function _C(e,t){l1(e.getBody(),t)||$t(Et.fromDom(t),Et.fromTag("br"));var n=Et.fromTag("br");$t(Et.fromDom(t),n),EC(e,n.dom,!1),e.undoManager.add()}function AC(e){return e&&"A"===e.nodeName&&"href"in e}function RC(e){return e.fold(D,AC,AC,D)}function DC(e,t){t.fold(te,R(kC,e),R(_C,e),te)}function TC(e,t){var n,r,o,i=(r=R(bb,n=e),o=cs.fromRangeStart(n.selection.getRng()),gy(r,n.getBody(),o).filter(RC));i.isSome()?i.each(R(DC,e)):function(e,t){var n,r,o=e.selection,i=e.dom,a=o.getRng();Of(i,a).each(function(e){a.setStart(e.startContainer,e.startOffset),a.setEnd(e.endContainer,e.endOffset)});var u,s=a.startOffset,c=a.startContainer;1===c.nodeType&&c.hasChildNodes()&&(u=s>c.childNodes.length-1,c=c.childNodes[Math.min(s,c.childNodes.length-1)]||c,s=u&&3===c.nodeType?c.nodeValue.length:0);var l=i.getParent(c,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",m=!(!t||!t.ctrlKey);"LI"!==d||m||(l=f),c&&3===c.nodeType&&s>=c.nodeValue.length&&!function(e){for(var t,n=new Dr(c,l),r=e.getNonEmptyElements();t=n.next();)if(r[t.nodeName.toLowerCase()]||0<t.length)return 1}(e.schema)&&(n=i.create("br"),a.insertNode(n),a.setStartAfter(n),a.setEndAfter(n),r=!0),n=i.create("br"),fs(i,a,n),EC(e,n,r),e.undoManager.add()}(e,t)}function OC(e,t){return mC(e).filter(function(e){return 0<t.length&&ze(Et.fromDom(e),t)}).isSome()}function BC(e,t){return OC(e,e.getParam("no_newline_selector",""))}function PC(n){return function(e,t){return""===ks(e)===n}}function LC(n){return function(e,t){return mC(e).filter(function(e){return vo(Et.fromDom(e))}).isSome()===n}}function IC(n,r){return function(e,t){return mC(e).fold(J(""),function(e){return e.nodeName.toUpperCase()})===n.toUpperCase()===r}}function MC(e){return IC("pre",e)}function FC(n){return function(e,t){return e.getParam("br_in_pre",!0)===n}}function UC(e,t){return OC(e,e.getParam("br_newline_selector",".mce-toc h2,figcaption,caption"))}function zC(e,t){return t}function HC(e){var t=ks(e),n=function(e,t){for(var n,r=e.getRoot(),o=t;o!==r&&"false"!==e.getContentEditable(o);)"true"===e.getContentEditable(o)&&(n=o),o=o.parentNode;return o!==r?n:r}(e.dom,e.selection.getStart());return n&&e.schema.isValidChild(n.nodeName,t||"P")}function jC(e,t){return function(n,r){return L(e,function(e,t){return e&&t(n,r)},!0)?ve.some(t):ve.none()}}function VC(e,t){var n,r;n=e,r=t,iy([jC([BC],f1.none()),jC([IC("summary",!0)],f1.br()),jC([MC(!0),FC(!1),zC],f1.br()),jC([MC(!0),FC(!1)],f1.block()),jC([MC(!0),FC(!0),zC],f1.block()),jC([MC(!0),FC(!0)],f1.br()),jC([LC(!0),zC],f1.br()),jC([LC(!0)],f1.block()),jC([PC(!0),zC,HC],f1.block()),jC([PC(!0)],f1.br()),jC([UC],f1.br()),jC([PC(!1),zC],f1.br()),jC([HC],f1.block())],[n,!(!r||!r.shiftKey)]).getOr(f1.none()).fold(function(){TC(e,t)},function(){NC(e,t)},te)}function qC(e){return e.stopImmediatePropagation()}function $C(e){return e.keyCode===If.PAGE_UP||e.keyCode===If.PAGE_DOWN}function WC(e,t,n){n&&!e.get()?t.on("NodeChange",qC,!0):!n&&e.get()&&t.off("NodeChange",qC),e.set(n)}function KC(n,r){var e=r.container(),t=r.offset();return Vn(e)?(e.insertData(t,n),ve.some(cs(e,t+n.length))):ic(r).map(function(e){var t=Et.fromText(n);return(r.isAtEnd()?$t:qt)(e,t),cs(t.dom,n.length)})}function XC(i,a){return function(e){return r=i,(!Om(o=e)&&(n=o,nf((t=r).dom,n).isNone()||tf(t.dom,n).isNone()||ip(t,n)||ap(t,n)||_m(t,n)||km(t,n)||Dm(r,o)||Tm(r,o))?g1:p1)(a);var t,n,r,o}}function YC(e){var t,n,r=cs.fromRangeStart(e.selection.getRng()),o=Et.fromDom(e.getBody());if(e.selection.isCollapsed()){var i=R(bb,e),a=cs.fromRangeStart(e.selection.getRng());return gy(i,e.getBody(),a).bind((n=o,function(e){return e.fold(function(e){return nf(n.dom,cs.before(e))},function(e){return rf(e)},function(e){return of(e)},function(e){return tf(n.dom,cs.after(e))})})).bind(XC(o,r)).exists((t=e,function(e){return t.selection.setRng(e.toRange()),t.nodeChanged(),!0}))}return!1}function GC(e){var o,i,a,u,s,t,n,r,c,l,f,d,m,g,p=w0(e);return e.on("keyup compositionstart",R(V0,e)),g=p,(m=e).on("keydown",function(e){var t,n,r,o;!1===e.isDefaultPrevented()&&(t=m,n=g,r=e,o=dt().os,eC([{keyCode:If.RIGHT,action:Z0($0,t,!0)},{keyCode:If.LEFT,action:Z0($0,t,!1)},{keyCode:If.UP,action:Z0(W0,t,!1)},{keyCode:If.DOWN,action:Z0(W0,t,!0)},{keyCode:If.RIGHT,action:Z0(lC,t,!0)},{keyCode:If.LEFT,action:Z0(lC,t,!1)},{keyCode:If.UP,action:Z0(fC,t,!1)},{keyCode:If.DOWN,action:Z0(fC,t,!0)},{keyCode:If.RIGHT,action:Z0(tC,t,!0)},{keyCode:If.LEFT,action:Z0(tC,t,!1)},{keyCode:If.UP,action:Z0(nC,t,!1)},{keyCode:If.DOWN,action:Z0(nC,t,!0)},{keyCode:If.RIGHT,action:Z0(C0,t,n,!0)},{keyCode:If.LEFT,action:Z0(C0,t,n,!1)},{keyCode:If.RIGHT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:Z0(n1,t,n)},{keyCode:If.LEFT,ctrlKey:!o.isOSX(),altKey:o.isOSX(),action:Z0(r1,t,n)},{keyCode:If.UP,action:Z0(Q0,t,!1)},{keyCode:If.DOWN,action:Z0(Q0,t,!0)}],r).each(function(e){r.preventDefault()}))}),d=p,(f=e).on("keydown",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(n=d,r=e,eC([{keyCode:If.BACKSPACE,action:Z0(M0,t=f,!1)},{keyCode:If.BACKSPACE,action:Z0(Gb,t,!1)},{keyCode:If.DELETE,action:Z0(Gb,t,!0)},{keyCode:If.BACKSPACE,action:Z0(qb,t,!1)},{keyCode:If.DELETE,action:Z0(qb,t,!0)},{keyCode:If.BACKSPACE,action:Z0(k0,t,n,!1)},{keyCode:If.DELETE,action:Z0(k0,t,n,!0)},{keyCode:If.BACKSPACE,action:Z0(yg,t,!1)},{keyCode:If.DELETE,action:Z0(yg,t,!0)},{keyCode:If.BACKSPACE,action:Z0(Jb,t,!1)},{keyCode:If.DELETE,action:Z0(Jb,t,!0)},{keyCode:If.BACKSPACE,action:Z0(T0,t,!1)},{keyCode:If.DELETE,action:Z0(T0,t,!0)},{keyCode:If.BACKSPACE,action:Z0(Ib,t,!1)},{keyCode:If.DELETE,action:Z0(Ib,t,!0)},{keyCode:If.BACKSPACE,action:Z0(Bb,t,!1)},{keyCode:If.DELETE,action:Z0(Bb,t,!0)},{keyCode:If.BACKSPACE,action:Z0(R0,t,!1)},{keyCode:If.DELETE,action:Z0(R0,t,!0)}],r).each(function(e){r.preventDefault()}))}),f.on("keyup",function(e){var t,n;!1===e.isDefaultPrevented()&&(n=e,eC([{keyCode:If.BACKSPACE,action:Z0(Yb,t=f)},{keyCode:If.DELETE,action:Z0(Yb,t)}],n))}),(l=e).on("keydown",function(e){var t,n,r;e.keyCode===If.ENTER&&(t=l,(n=e).isDefaultPrevented()||(n.preventDefault(),(r=t.undoManager).typing&&(r.typing=!1,r.add()),t.undoManager.transact(function(){!1===t.selection.isCollapsed()&&t.execCommand("Delete"),VC(t,n)})))}),(c=e).on("keydown",function(e){var t;!1===e.isDefaultPrevented()&&(t=e,eC([{keyCode:If.SPACEBAR,action:Z0(YC,c)}],t).each(function(e){t.preventDefault()}))}),n=t=e,r=mu(function(){n.composing||Um(n)},0),d1.isIE()&&(n.on("keypress",function(e){r.throttle()}),n.on("remove",function(e){r.cancel()})),t.on("input",function(e){!1===e.isComposing&&Um(t)}),s=p,(u=e).on("keydown",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(n=s,r=e,eC([{keyCode:If.END,action:Z0(K0,t=u,!0)},{keyCode:If.HOME,action:Z0(K0,t,!1)},{keyCode:If.END,action:Z0(rC,t,!0)},{keyCode:If.HOME,action:Z0(rC,t,!1)},{keyCode:If.END,action:Z0(S0,t,!0,n)},{keyCode:If.HOME,action:Z0(S0,t,!1,n)}],r).each(function(e){r.preventDefault()}))}),o=e,i=p,m1.os.isOSX()||(a=au(!1),o.on("keydown",function(e){$C(e)&&WC(a,o,!0)}),o.on("keyup",function(e){var t,n,r;!1===e.isDefaultPrevented()&&(r=e,eC([{keyCode:If.PAGE_UP,action:Z0(S0,t=o,!1,n=i)},{keyCode:If.PAGE_DOWN,action:Z0(S0,t,!0,n)}],r)),$C(e)&&a.get()&&(WC(a,o,!1),o.nodeChanged())})),p}(Jy=Gy=Gy||{})[Jy.Up=-1]="Up",Jy[Jy.Down=1]="Down";var JC=R(n0,Gy.Up,Ou,Bu),QC=R(n0,Gy.Down,Bu,Ou),ZC=Gn,e1=Gs,t1=function(e,t){var n=e.selection.getRng(),r=e.getBody();if(t){var o=cs.fromRangeEnd(n),i=Zy(r,o);return Z(i.positions)}return o=cs.fromRangeStart(n),Q((i=Qy(r,o)).positions)},n1=R(x0,!0),r1=R(x0,!1),o1=function(e){return U(A(e.selection.getSelectedBlocks(),Et.fromDom),function(e){return!L0(e)&&!Ot(e).exists(L0)&&hr(e,function(e){return Yn(e.dom)||Gn(e.dom)}).exists(function(e){return Yn(e.dom)})})},i1=Gn,a1=R(oC,function(e){return e.bottom},function(e,t){return e.y<t}),u1=R(oC,function(e){return e.top},function(e,t){return e.y>t}),s1=R(iC,Qy),c1=R(iC,Zy),l1=function(e,t){return n=cs.after(t),!!Kn(n.getNode())||tf(e,cs.after(t)).map(function(e){return Kn(e.getNode())}).getOr(!1);var n},f1=ir([{br:[]},{block:[]},{none:[]}]),d1=dt().browser,m1=dt(),g1=R(KC,wo),p1=R(KC," "),h1=(v1.prototype.nodeChanged=function(e){var t,n,r,o=this.editor.selection;this.editor.initialized&&o&&!this.editor.getParam("disable_nodechange")&&!this.editor.mode.isReadOnly()&&(r=this.editor.getBody(),(t=o.getStart(!0)||r).ownerDocument===this.editor.getDoc()&&this.editor.dom.isChildOf(t,r)||(t=r),n=[],this.editor.dom.getParent(t,function(e){return e===r||void n.push(e)}),(e=e||{}).element=t,e.parents=n,this.editor.fire("NodeChange",e))},v1.prototype.isSameElementPath=function(e){var t,n=this.editor.$(e).parentsUntil(this.editor.getBody()).add(e);if(n.length===this.lastPath.length){for(t=n.length;0<=t&&n[t]===this.lastPath[t];t--);if(-1===t)return this.lastPath=n,!0}return this.lastPath=n,!1},v1);function v1(r){var o;this.lastPath=[],this.editor=r;var t=this;"onselectionchange"in r.getDoc()||r.on("NodeChange click mouseup keyup focus",function(e){var t=r.selection.getRng(),n={startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset};"nodechange"!==e.type&&kf(n,o)||r.fire("SelectionChange"),o=n}),r.on("contextmenu",function(){r.fire("SelectionChange")}),r.on("SelectionChange",function(){var e=r.selection.getStart(!0);!e||!xt.range&&r.selection.isCollapsed()||Pl(r)&&!t.isSameElementPath(e)&&r.dom.isChildOf(e,r.getBody())&&r.nodeChanged({selectionChange:!0})}),r.on("mouseup",function(e){!e.isDefaultPrevented()&&Pl(r)&&("IMG"===r.selection.getNode().nodeName?Ar.setEditorTimeout(r,function(){r.nodeChanged()}):r.nodeChanged())})}function b1(e){return Hn(e)&&po(Et.fromDom(e))}function y1(e){var t=e.getBoundingClientRect(),n=e.ownerDocument,r=n.documentElement,o=n.defaultView;return{top:t.top+o.pageYOffset-r.clientTop,left:t.left+o.pageXOffset-r.clientLeft}}function C1(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function x1(e,S){var N=Ar.throttle(function(e,t){S._selectionOverrides.hideFakeCaret(),S.selection.placeCaretAt(e,t)},0);return S.on("remove",N.stop),function(w){return e.on(function(e){var t,n,r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x=Math.max(Math.abs(w.screenX-e.screenX),Math.abs(w.screenY-e.screenY));if(!e.dragging&&10<x){if(S.fire("dragstart",{target:e.element}).isDefaultPrevented())return;e.dragging=!0,S.focus()}e.dragging&&(d=e,t={pageX:(p=w,h=(g=S).inline?y1(g.getBody()):{left:0,top:0},C=(y=g).getBody(),v=y.inline?{left:C.scrollLeft,top:C.scrollTop}:{left:0,top:0},(m={pageX:(b=function(e,t){if(t.target.ownerDocument===e.getDoc())return{left:t.pageX,top:t.pageY};var n,r,o,i,a,u=y1(e.getContentAreaContainer()),s=(r=(n=e).getBody(),o=n.getDoc().documentElement,i={left:r.scrollLeft,top:r.scrollTop},a={left:r.scrollLeft||o.scrollLeft,top:r.scrollTop||o.scrollTop},n.inline?i:a);return{left:t.pageX-u.left+s.left,top:t.pageY-u.top+s.top}}(g,p)).left-h.left+v.left,pageY:b.top-h.top+v.top}).pageX-d.relX),pageY:m.pageY+5},l=e.ghost,f=S.getBody(),l.parentNode!==f&&f.appendChild(l),n=e.ghost,o=e.width,i=e.height,a=e.maxX,u=e.maxY,c=s=0,n.style.left=(r=t).pageX+"px",n.style.top=r.pageY+"px",u<r.pageY+i&&(c=r.pageY+i-u),n.style.width=o-(s=a<r.pageX+o?r.pageX+o-a:s)+"px",n.style.height=i-c+"px",N(w.clientX,w.clientY))})}}function w1(e){function t(e){var t,n,r,o,i,a;0===e.button&&(t=M(c.dom.getParents(e.target),function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];return function(e){for(var t=0;t<n.length;t++)if(n[t](e))return!0;return!1}}(K1,X1)).getOr(null),i=c.getBody(),K1(a=t)&&a!==i&&(n=c.dom.getPos(t),r=c.getBody(),o=c.getDoc().documentElement,u.set({element:t,dragging:!1,screenX:e.screenX,screenY:e.screenY,maxX:(c.inline?r.scrollWidth:o.offsetWidth)-2,maxY:(c.inline?r.scrollHeight:o.offsetHeight)-2,relX:e.pageX-n.x,relY:e.pageY-n.y,width:t.offsetWidth,height:t.offsetHeight,ghost:function(e,t,n){var r=c.dom,o=e.cloneNode(!0);r.setStyles(o,{width:t,height:n}),r.setAttrib(o,"data-mce-selected",null);var i=r.create("div",{class:"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return r.setStyles(i,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:t,height:n}),r.setStyles(o,{margin:0,boxSizing:"border-box"}),i.appendChild(o),i}(t,t.offsetWidth,t.offsetHeight)})))}function n(u){i.on(function(e){var t,n,r,o,i,a;e.dragging&&((o=3===(a=(r=s).selection.getSel().getRangeAt(0).startContainer).nodeType?a.parentNode:a)===(i=e.element)||r.dom.isChildOf(o,i)||K1(o)||((n=e.element.cloneNode(!0)).removeAttribute("data-mce-selected"),t=n,s.fire("drop",{clientX:u.clientX,clientY:u.clientY}).isDefaultPrevented()||s.undoManager.transact(function(){C1(e.element),s.insertContent(s.dom.getOuterHTML(t)),s._selectionOverrides.hideFakeCaret()})),s.fire("dragend"))}),Y1(i)}var r,o,i,s,u,c,a=du(),l=eu.DOM,f=document,d=x1(u=a,c=e),m=(r=i=a,function(){r.on(function(e){e.dragging&&o.fire("dragend")}),Y1(r)});(o=s=e).on("mousedown",t),e.on("mousemove",d),e.on("mouseup",n),l.bind(f,"mousemove",d),l.bind(f,"mouseup",m),e.on("remove",function(){l.unbind(f,"mousemove",d),l.unbind(f,"mouseup",m)}),e.on("keydown",function(e){e.keyCode===If.ESC&&m()})}function S1(e){var n,i;function a(e){var t;e.isDefaultPrevented()||(t=e.dataTransfer)&&(T(t.types,"Files")||0<t.files.length)&&(e.preventDefault(),"drop"===e.type&&Qv(i,"Dropped file type is not supported"))}function u(e){pd(i,e.target)&&a(e)}function t(){var t=eu.DOM,n=i.dom,r=document,o=i.inline?i.getBody():i.getDoc(),e=["drop","dragover"];Y(e,function(e){t.bind(r,e,u),n.bind(o,e,a)}),i.on("remove",function(){Y(e,function(e){t.unbind(r,e,u),n.unbind(o,e,a)})})}w1(e),(n=e).on("drop",function(e){var t=void 0!==e.clientX?n.getDoc().elementFromPoint(e.clientX,e.clientY):null;!K1(t)&&"false"!==n.dom.getContentEditableParent(t)||e.preventDefault()}),e.getParam("block_unsupported_drop",!0,"boolean")&&(i=e).on("init",function(){Ar.setEditorTimeout(i,t,0)})}function N1(e,t){return bf(e.getBody(),t)}function E1(l){function f(e){return e!==x&&(J1(e)||Qn(e))&&y.isChildOf(e,x)}function c(e){return rp(e)||op(e)||Zg(e)||ep(e)}function d(e){e&&b.setRng(e)}function m(e,t,n,r){return void 0===r&&(r=!0),l.fire("ShowCaret",{target:t,direction:e,before:n}).isDefaultPrevented()?null:(r&&b.scrollIntoView(t,-1===e),i.show(n,t))}function t(e){return Mr(e)||Ao(e)||Ro(e)}function g(e){return t(e.startContainer)||t(e.endContainer)}function p(e,t){if(!e)return null;if(e.collapsed){if(!g(e)){var n=t?1:-1,r=oc(n,x,e),o=r.getNode(!t);if(Xs(o))return m(n,o,!!t&&!r.isAtEnd(),!1);var i=r.getNode(t);if(Xs(i))return m(n,i,!t&&!r.isAtEnd(),!1)}return null}var a=e.startContainer,u=e.startOffset,s=e.endOffset;if(3===a.nodeType&&0===u&&J1(a.parentNode)&&(a=a.parentNode,u=y.nodeIndex(a),a=a.parentNode),1!==a.nodeType)return null;if(s===u+1&&a===e.endContainer){var c=a.childNodes[u];if(f(c))return function(e){var t=e.cloneNode(!0),n=l.fire("ObjectSelected",{target:e,targetClone:t});if(n.isDefaultPrevented())return null;var r=function(e,t,n){var r=l.$,o=br(Et.fromDom(l.getBody()),"#"+w).fold(function(){return r([])},function(e){return r([e.dom])});0===o.length&&(o=r('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>').attr("id",w)).appendTo(l.getBody());var i=y.createRng();t===n&&xt.ie?(o.empty().append('<p style="font-size: 0" data-mce-bogus="all">\xa0</p>').append(t),i.setStartAfter(o[0].firstChild.firstChild),i.setEndAfter(t)):(o.empty().append(wo).append(t).append(wo),i.setStart(o[0].firstChild,1),i.setEnd(o[0].lastChild,0)),o.css({top:y.getPos(e,l.getBody()).y}),o[0].focus();var a=b.getSel();return a.removeAllRanges(),a.addRange(i),i}(e,n.targetClone,t),o=Et.fromDom(e);return Y(yu(Et.fromDom(l.getBody()),"*[data-mce-selected]"),function(e){je(o,e)||Cn(e,S)}),y.getAttrib(e,S)||e.setAttribute(S,"1"),v=e,N(),r}(c)}return null}function h(){v&&v.removeAttribute(S),br(Et.fromDom(l.getBody()),"#"+w).each(In),v=null}var v,n,e,o,b=l.selection,y=l.dom,C=y.isBlock,x=l.getBody(),i=Ws(l,x,C,function(){return Cd(l)}),w="sel-"+y.uniqueId(),S="data-mce-selected",r=b.getRng,N=function(){i.hide()};return xt.ceFalse&&!hh(l)&&(l.on("mouseup",function(e){var t=r();t.collapsed&&Nv(l,e.clientX,e.clientY)&&Ub(l,t,!1).each(d)}),l.on("click",function(e){var t=N1(l,e.target);t&&(J1(t)&&(e.preventDefault(),l.focus()),G1(t)&&y.isChildOf(t,b.getNode())&&h())}),l.on("blur NewBlock",h),l.on("ResizeWindow FullscreenStateChanged",i.reposition),l.on("tap",function(e){var t=e.target,n=N1(l,t);J1(n)?(e.preventDefault(),Fb(l,n).each(p)):f(t)&&Fb(l,t).each(p)},!0),l.on("mousedown",function(e){var t,n,r,o,i,a,u,s=e.target;s!==x&&"HTML"!==s.nodeName&&!y.isChildOf(s,x)||!1===Nv(l,e.clientX,e.clientY)||((t=N1(l,s))?J1(t)?(e.preventDefault(),Fb(l,t).each(p)):(h(),G1(t)&&e.shiftKey||yf(e.clientX,e.clientY,b.getRng())||(N(),b.placeCaretAt(e.clientX,e.clientY))):f(s)?Fb(l,s).each(p):!1===Xs(s)&&(h(),N(),(n=f0(x,e.clientX,e.clientY))&&(r=s,o=n.node,a=y.getParent(r,C),u=y.getParent(o,C),!K(a)&&(r!==u&&y.isChildOf(a,u)&&!1===J1(N1(l,a))||!y.isChildOf(u,a)&&(i=u,y.getParent(a,C)!==y.getParent(i,C))&&function(e){var t=e.firstChild;if(!K(t)){var n=cs.before(t);if(Kn(n.getNode())&&1===e.childNodes.length)return!c(n);var r=Mc(e).next(n);return r&&!c(r)}}(a))||(e.preventDefault(),d(m(1,n.node,n.before,!1)),l.getBody().focus()))))}),l.on("keypress",function(e){If.modifierPressed(e)||J1(b.getNode())&&e.preventDefault()}),l.on("GetSelectionRange",function(e){var t=e.range;v&&(v.parentNode?((t=t.cloneRange()).selectNode(v),e.range=t):v=null)}),l.on("SetSelectionRange",function(e){var t,n,r,o,i,a,u;e.range=(t=e.range,n=l.schema.getShortEndedElements(),r=y.createRng(),o=t.startContainer,i=t.startOffset,a=t.endContainer,u=t.endOffset,Ee(n,o.nodeName.toLowerCase())?0===i?r.setStartBefore(o):r.setStartAfter(o):r.setStart(o,i),Ee(n,a.nodeName.toLowerCase())?0===u?r.setEndBefore(a):r.setEndAfter(a):r.setEnd(a,u),r);var s=p(e.range,e.forward);s&&(e.range=s)}),l.on("AfterSetSelectionRange",function(e){var t=e.range,n=t.startContainer.parentNode;g(t)||"mcepastebin"===n.id||N(),y.hasClass(n,"mce-offscreen-selection")||h()}),l.on("copy",function(e){var t,n,r=e.clipboardData;e.isDefaultPrevented()||!e.clipboardData||xt.ie||(t=(n=y.get(w))&&n.getElementsByTagName("*")[0])&&(e.preventDefault(),r.clearData(),r.setData("text/html",t.outerHTML),r.setData("text/plain",t.outerText||t.innerText))}),S1(l),e=mu(function(){var e,t;n.removed||!n.getBody().contains(document.activeElement)||(e=n.selection.getRng()).collapsed&&(t=zb(n,e,!1),n.selection.setRng(t))},0),(n=l).on("focus",function(){e.throttle()}),n.on("blur",function(){e.cancel()}),(o=l).on("init",function(){o.on("focusin",function(e){var t,n,r=e.target;Qn(r)&&(t=bf(o.getBody(),r),n=Gn(t)?t:r,o.selection.getNode()!==n&&Fb(o,n).each(function(e){return o.selection.setRng(e)}))})})),{showCaret:m,showBlockCaretContainer:function(e){e.hasAttribute("data-mce-caret")&&(Hr(e),d(r()),b.scrollIntoView(e))},hideFakeCaret:N,destroy:function(){i.destroy(),v=null}}}function k1(a){function e(e,t){try{a.getDoc().execCommand(e,!1,t)}catch(e){}}function u(e){return e.isDefaultPrevented()}function t(){a.shortcuts.add("meta+a",null,"SelectAll")}function n(){a.inline||b.bind(a.getDoc(),"mousedown mouseup",function(e){var t;e.target===a.getDoc().documentElement&&(t=y.getRng(),a.getBody().focus(),"mousedown"===e.type?Mr(t.startContainer)||y.placeCaretAt(e.clientX,e.clientY):y.setRng(t))})}function r(){Range.prototype.getClientRects||a.on("mousedown",function(e){var t;u(e)||"HTML"!==e.target.nodeName||((t=a.getBody()).blur(),Ar.setEditorTimeout(a,function(){t.focus()}))})}function o(){a.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==b.getContentEditableParent(t)&&(e.preventDefault(),a.selection.select(t),a.nodeChanged()),"A"===t.nodeName&&b.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),y.select(t))})}function i(){a.on("keydown",function(e){if(!u(e)&&e.keyCode===h&&y.isCollapsed()&&0===y.getRng().startOffset){var t=y.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function s(){a.getParam("readonly")||a.on("BeforeExecCommand mousedown",function(){e("StyleWithCSS",!1),e("enableInlineTableEditing",!1),Ps(a)||e("enableObjectResizing",!1)})}function c(){a.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function l(){a.inline||a.on("keydown",function(){document.activeElement===document.body&&a.getWin().focus()})}function f(){a.inline||(a.contentStyles.push("body {min-height: 150px}"),a.on("click",function(e){var t;"HTML"===e.target.nodeName&&(11<xt.ie?a.getBody().focus():(t=a.selection.getRng(),a.getBody().focus(),a.selection.setRng(t),a.selection.normalize(),a.nodeChanged()))}))}function d(){xt.mac&&a.on("keydown",function(e){!If.metaKeyPressed(e)||e.shiftKey||37!==e.keyCode&&39!==e.keyCode||(e.preventDefault(),a.selection.getSel().modify("move",37===e.keyCode?"backward":"forward","lineboundary"))})}function m(){a.on("click",function(e){var t=e.target;do{if("A"===t.tagName)return void e.preventDefault()}while(t=t.parentNode)}),a.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function g(){a.on("init",function(){a.dom.bind(a.getBody(),"submit",function(e){e.preventDefault()})})}var p=Nt.each,h=If.BACKSPACE,v=If.DELETE,b=a.dom,y=a.selection,C=a.parser,x=xt.gecko,w=xt.ie,S=xt.webkit,N="data:text/mce-internal,",E=w?"Text":"URL",k=te;return hh(a)?(S&&(n(),o(),g(),t(),xt.iOS&&(l(),f(),m())),x&&(r(),s(),c(),d())):(a.on("keydown",function(e){if(!u(e)&&e.keyCode===If.BACKSPACE){var t,n=(t=y.getRng()).startContainer,r=t.startOffset,o=b.getRoot(),i=n;if(t.collapsed&&0===r){for(;i&&i.parentNode&&i.parentNode.firstChild===i&&i.parentNode!==o;)i=i.parentNode;"BLOCKQUOTE"===i.tagName&&(a.formatter.toggle("blockquote",null,i),(t=b.createRng()).setStart(n,0),t.setEnd(n,0),y.setRng(t))}}}),a.on("keydown",function(e){var t,n,r,o,i=e.keyCode;u(e)||i!==v&&i!==h||(t=a.selection.isCollapsed(),n=a.getBody(),t&&!b.isEmpty(n)||!t&&(r=R(a.selection.getRng()),(o=b.createRng()).selectNode(a.getBody()),r!==R(o))||(e.preventDefault(),a.setContent(""),n.firstChild&&b.isBlock(n.firstChild)?a.selection.setCursorLocation(n.firstChild,0):a.selection.setCursorLocation(n,0),a.nodeChanged()))}),xt.windowsPhone||a.on("keyup focusin mouseup",function(e){If.modifierPressed(e)||y.normalize()},!0),S&&(n(),o(),ks(a)&&a.on("init",function(){e("DefaultParagraphSeparator",ks(a))}),g(),i(),C.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"===e[t].attr("class")&&e[t].remove()}),xt.iOS?(l(),f(),m()):t()),11<=xt.ie&&(f(),i()),xt.ie&&(t(),e("AutoUrlDetect",!1),a.on("dragstart",function(e){var t,n,r;(t=e).dataTransfer&&(a.selection.isCollapsed()&&"IMG"===t.target.tagName&&y.select(t.target),0<(n=a.selection.getContent()).length&&(r=N+escape(a.id)+","+escape(n),t.dataTransfer.setData(E,r)))}),a.on("drop",function(e){var t,n,r,o;u(e)||(t=e.dataTransfer&&(o=e.dataTransfer.getData(E))&&0<=o.indexOf(N)?(o=o.substr(N.length).split(","),{id:unescape(o[0]),html:unescape(o[1])}):null)&&t.id!==a.id&&(e.preventDefault(),n=Ef(e.x,e.y,a.getDoc()),y.setRng(n),r=t.html,a.queryCommandSupported("mceInsertClipboardContent")?a.execCommand("mceInsertClipboardContent",!1,{content:r,internal:!0}):a.execCommand("mceInsertContent",!1,r))})),x&&(a.on("keydown",function(e){if(!u(e)&&e.keyCode===h&&a.getBody().getElementsByTagName("hr").length&&y.isCollapsed()&&0===y.getRng().startOffset){var t=y.getNode(),n=t.previousSibling;if("HR"===t.nodeName)return b.remove(t),void e.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(b.remove(n),e.preventDefault())}}),r(),a.on("keypress",function(e){var t;if(!u(e)&&(8===e.keyCode||46===e.keyCode)&&A())return t=_(),a.getDoc().execCommand("delete",!1,null),t(),e.preventDefault(),!1}),b.bind(a.getDoc(),"cut",function(e){var t;!u(e)&&A()&&(t=_(),Ar.setEditorTimeout(a,function(){t()}))}),s(),a.on("SetContent ExecCommand",function(e){"setcontent"!==e.type&&"mceInsertLink"!==e.command||p(b.select("a"),function(e){var t=e.parentNode,n=b.getRoot();if(t.lastChild===e){for(;t&&!b.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}b.add(t,"br",{"data-mce-bogus":1})}})}),c(),d(),i())),{refreshContentEditable:k,isHidden:function(){if(!x||a.removed)return!1;var e=a.selection.getSel();return!e||!e.rangeCount||0===e.rangeCount}};function _(){var e=b.getAttribs(y.getStart().cloneNode(!1));return function(){var t=y.getStart();t!==a.getBody()&&(b.setAttrib(t,"style",null),p(e,function(e){t.setAttributeNode(e.cloneNode(!0))}))}}function A(){return!y.isCollapsed()&&b.getParent(y.getStart(),b.isBlock)!==b.getParent(y.getEnd(),b.isBlock)}function R(e){var t=b.create("body"),n=e.cloneContents();return t.appendChild(n),y.serializer.serialize(t,{format:"html"})}}function _1(e){return ae(e,function(e){return!1===b(e)})}function A1(e){var t=e.settings;return _1({block_elements:t.block_elements,boolean_attributes:t.boolean_attributes,custom_elements:t.custom_elements,extended_valid_elements:t.extended_valid_elements,invalid_elements:t.invalid_elements,invalid_styles:t.invalid_styles,move_caret_before_on_enter_elements:t.move_caret_before_on_enter_elements,non_empty_elements:t.non_empty_elements,schema:t.schema,self_closing_elements:t.self_closing_elements,short_ended_elements:t.short_ended_elements,special:t.special,text_block_elements:t.text_block_elements,text_inline_elements:t.text_inline_elements,valid_children:t.valid_children,valid_classes:t.valid_classes,valid_elements:t.valid_elements,valid_styles:t.valid_styles,verify_html:t.verify_html,whitespace_elements:t.whitespace_elements,padd_empty_block_inline_children:t.format_empty_lines})}function R1(e){var t=e.settings,n=e.editorUpload.blobCache;return _1({allow_conditional_comments:t.allow_conditional_comments,allow_html_data_urls:t.allow_html_data_urls,allow_svg_data_urls:t.allow_svg_data_urls,allow_html_in_named_anchor:t.allow_html_in_named_anchor,allow_script_urls:t.allow_script_urls,allow_unsafe_link_target:t.allow_unsafe_link_target,convert_fonts_to_spans:t.convert_fonts_to_spans,fix_list_elements:t.fix_list_elements,font_size_legacy_values:t.font_size_legacy_values,forced_root_block:t.forced_root_block,forced_root_block_attrs:t.forced_root_block_attrs,padd_empty_with_br:t.padd_empty_with_br,preserve_cdata:t.preserve_cdata,remove_trailing_brs:t.remove_trailing_brs,inline_styles:t.inline_styles,root_name:e.inline?e.getElement().nodeName.toLowerCase():void 0,validate:!0,blob_cache:n,document:e.getDoc(),images_dataimg_filter:t.images_dataimg_filter})}function D1(e){var t,u,n;e.bindPendingEventDelegates(),e.initialized=!0,e.fire("Init"),e.focus(!0),n=(u=e).dom.getRoot(),u.inline||Pl(u)&&u.selection.getStart(!0)!==n||rf(n).each(function(e){var t,n,r,o,i=e.getNode(),a=cn(i)?rf(i).getOr(e):e;xt.browser.isIE()?(t=u,n=a.toRange(),r=Et.fromDom(t.getBody()),o=(cd(t)?ve.from(n):ve.none()).map(ld).filter(sd(r)),t.bookmark=o.isSome()?o:t.bookmark):u.selection.setRng(a.toRange())}),e.nodeChanged({initial:!0}),e.execCallback("init_instance_callback",e),(t=e).settings.auto_focus&&Ar.setEditorTimeout(t,function(){var e=!0===t.settings.auto_focus?t:t.editorManager.get(t.settings.auto_focus);e.destroyed||e.focus()},100)}function T1(e){return(e.inline?e.ui:e.dom).styleSheetLoader}function O1(e){function t(){o.unloadAll(a),e.inline||e.ui.styleSheetLoader.unloadAll(i)}function n(){e.removed?t():e.on("remove",t)}var r,o=T1(e),i=Bs(e),a=e.contentCSS;0<e.contentStyles.length&&(r="",Nt.each(e.contentStyles,function(e){r+=e+"\r\n"}),e.dom.addStyle(r));var u,s,c,l,f,d,m,g,p,h=_r.all((u=e,s=a,c=i,l=[new _r(function(e,t){return T1(u).loadAll(s,e,t)})],u.inline?l:l.concat([new _r(function(e,t){return u.ui.styleSheetLoader.loadAll(c,e,t)})]))).then(n).catch(n);return e.settings.content_style&&(d=(f=e).settings.content_style,m=Et.fromDom(f.getBody()),g=jt(Pn(m)),pn(p=Et.fromTag("style"),"type","text/css"),Ln(p,Et.fromText(d)),Ln(g,p),f.on("remove",function(){In(p)})),h}function B1(e){var t;!0!==e.removed&&(hh(t=e)||t.load({initial:!0,format:"html"}),t.startContent=t.getContent({format:"raw"}),D1(e))}function P1(t,e){var n=t.settings,r=t.getElement(),o=t.getDoc();n.inline||(t.getElement().style.visibility=t.orgVisibility),e||t.inline||(o.open(),o.write(t.iframeHTML),o.close()),t.inline&&(Q1.addClass(r,"mce-content-body"),t.contentDocument=o=document,t.contentWindow=window,t.bodyElement=r,t.contentAreaContainer=r);var u,i,a,s,c,l,f,d,m,g,p,h,v=t.getBody();v.disabled=!0,t.readonly=!!n.readonly,t.readonly||(t.inline&&"static"===Q1.getStyle(v,"position",!0)&&(v.style.position="relative"),v.contentEditable=t.getParam("content_editable_state",!0)),v.disabled=!1,t.editorUpload=cb(t),t.schema=oo(A1(t)),t.dom=eu(o,{keep_values:!0,url_converter:t.convertURL,url_converter_scope:t,hex_colors:n.force_hex_style_colors,update_styles:!0,root_element:t.inline?t.getBody():null,collect:function(){return t.inline},schema:t.schema,contentCssCors:t.getParam("content_css_cors",!1,"boolean"),referrerPolicy:Ds(t),onSetAttrib:function(e){t.fire("SetAttrib",e)}}),t.parser=((i=cv(R1(u=t),u.schema)).addAttributeFilter("src,href,style,tabindex",function(e,t){for(var n,r,o=e.length,i=u.dom,a="data-mce-"+t;o--;)(r=(n=e[o]).attr(t))&&!n.attr(a)&&0!==r.indexOf("data:")&&0!==r.indexOf("blob:")&&("style"===t?((r=i.serializeStyle(i.parseStyle(r),n.name)).length||(r=null),n.attr(a,r),n.attr(t,r)):"tabindex"===t?(n.attr(a,r),n.attr(t,null)):n.attr(a,u.convertURL(r,t,n.name)))}),i.addNodeFilter("script",function(e){for(var t=e.length;t--;){var n=e[t],r=n.attr("type")||"no/type";0!==r.indexOf("mce-")&&n.attr("type","mce-"+r)}}),u.settings.preserve_cdata&&i.addNodeFilter("#cdata",function(e){for(var t=e.length;t--;){var n=e[t];n.type=8,n.name="#comment",n.value="[CDATA["+u.dom.encode(n.value)+"]]"}}),i.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t=e.length,n=u.schema.getNonEmptyElements();t--;){var r=e[t];r.isEmpty(n)&&0===r.getAll("br").length&&(r.append(new jd("br",1)).shortEnded=!0)}}),i),t.serializer=dv((s=(a=t).settings,_e(_e(_e({},R1(a)),A1(a)),_1({url_converter:s.url_converter,url_converter_scope:s.url_converter_scope,element_format:s.element_format,entities:s.entities,entity_encoding:s.entity_encoding,indent:s.indent,indent_after:s.indent_after,indent_before:s.indent_before}))),t),t.selection=Fh(t.dom,t.getWin(),t.serializer,t),t.annotator=zl(t),t.formatter=mb(t),t.undoManager=pb(t),t._nodeChangeDispatcher=new h1(t),t._selectionOverrides=E1(t),m=t,g=du(),p=au(!1),h=gu(function(e){m.fire("longpress",_e(_e({},e),{type:"longpress"})),p.set(!0)},400),m.on("touchstart",function(n){U0(n).each(function(e){h.cancel();var t={x:e.clientX,y:e.clientY,target:n.target};h.throttle(n),p.set(!1),g.set(t)})},!0),m.on("touchmove",function(e){h.cancel(),U0(e).each(function(i){g.on(function(e){var t=i,n=e,r=Math.abs(t.clientX-n.x),o=Math.abs(t.clientY-n.y);(5<r||5<o)&&(g.clear(),p.set(!1),m.fire("longpresscancel"))})})},!0),m.on("touchend touchcancel",function(t){h.cancel(),"touchcancel"!==t.type&&g.get().filter(function(e){return e.target.isEqualNode(t.target)}).each(function(){p.get()?t.preventDefault():m.fire("tap",_e(_e({},t),{type:"tap"}))})},!0),(f=l=t).on("click",function(e){f.dom.getParent(e.target,"details")&&e.preventDefault()}),(d=l).parser.addNodeFilter("details",function(e){Y(e,function(e){e.attr("data-mce-open",e.attr("open")),e.attr("open","open")})}),d.serializer.addNodeFilter("details",function(e){Y(e,function(e){var t=e.attr("data-mce-open");e.attr("open",X(t)?t:null),e.attr("data-mce-open",null)})}),hh(t)||(c=t).on("click",function(e){var t,n,r,o,i;3<=e.detail&&(r=(t=c).selection.getRng(),o=cs.fromRangeStart(r),i=cs.fromRangeEnd(r),!cs.isElementPosition(o)||b1(n=o.container())&&rf(n).each(function(e){return r.setStart(e.container(),e.offset())}),!cs.isElementPosition(i)||b1(n=o.container())&&of(n).each(function(e){return r.setEnd(e.container(),e.offset())}),t.selection.setRng(Cg(r)))});var b,y,C,x,w,S,N,E,k,_=hh(b=t)?au(null):GC(b);k=_,(E=t).addCommand("delete",function(){var e,t=k;M0(e=E)||Gb(e,!1)||qb(e,!1)||k0(e,t,!1)||Bb(e,!1)||yg(e)||Jb(e,!1)||T0(e,!1)||Ib(e)||R0(e,!1)||(F0(e,"Delete"),Sb(e))}),E.addCommand("forwardDelete",function(){var e,t=k;Gb(e=E,!0)||qb(e,!0)||k0(e,t,!0)||Bb(e,!0)||yg(e)||Jb(e,!0)||T0(e,!0)||Ib(e)||R0(e,!0)||F0(e,"ForwardDelete")}),ks(y=t)&&y.on("NodeChange",R(H0,y)),x=(C=t).dom,w=ks(C),S=C.getParam("placeholder",vc.getAttrib(C.getElement(),"placeholder"),"string"),N=function(e,t){var n,r,o;!function(e){if(hb(e)){var t=e.keyCode;return!vb(e)&&(If.metaKeyPressed(e)||e.altKey||112<=t&&t<=123||T(Ry,t))}}(e)&&(n=C.getBody(),r=!(hb(o=e)&&!(vb(o)||"keyup"===o.type&&229===o.keyCode))&&function(e,t,n){if(Kr(Et.fromDom(t),!1)){var r=""===n,o=t.firstElementChild;return!o||!e.getStyle(t.firstElementChild,"padding-left")&&!e.getStyle(t.firstElementChild,"padding-right")&&(r?!e.isBlock(o):n===o.nodeName.toLowerCase())}return!1}(x,n,w),""!==x.getAttrib(n,Dy)===r&&!t||(x.setAttrib(n,Dy,r?S:null),x.setAttrib(n,"aria-placeholder",r?S:null),C.fire("PlaceholderToggle",{state:r}),C.on(r?"keydown":"keyup",N),C.off(r?"keyup":"keydown",N)))},S&&C.on("init",function(e){N(e,!0),C.on("change SetContent ExecCommand",N),C.on("paste",function(e){return Ar.setEditorTimeout(C,function(){return N(e)})})});var A=vh(t);(function(t){var e=t.settings,n=t.getDoc(),r=t.getBody();t.fire("PreInit"),e.browser_spellcheck||e.gecko_spellcheck||(n.body.spellcheck=!1,Q1.setAttrib(r,"spellcheck","false")),t.quirks=k1(t),t.fire("PostRender");var o=t.getParam("directionality",lu.isRtl()?"rtl":void 0);void 0!==o&&(r.dir=o),e.protect&&t.on("BeforeSetContent",function(t){Nt.each(e.protect,function(e){t.content=t.content.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})})}),t.on("SetContent",function(){t.addVisual(t.getBody())}),t.on("compositionstart compositionend",function(e){t.composing="compositionstart"===e.type})})(t),A.fold(function(){O1(t).then(function(){return B1(t)})},function(e){t.setProgressState(!0),O1(t).then(function(){e().then(function(e){t.setProgressState(!1),B1(t)},function(e){t.notificationManager.open({type:"error",text:String(e)}),B1(t)})})})}function L1(e,t){var n,r,o,i,a=e.translate("Rich Text Area"),u=(n=e.id,r=a,t.height,o=e.getParam("iframe_attrs",{}),hn(i=Et.fromTag("iframe"),o),hn(i,{id:n+"_ifr",frameBorder:"0",allowTransparency:"true",title:r}),vu(i,"tox-edit-area__iframe"),i.dom);u.onload=function(){u.onload=null,e.fire("load")};var s=function(e,t){if(document.domain!==window.location.hostname&&xt.browser.isIE()){var n=ob("mce");e[n]=function(){P1(e)};var r='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+e.id+'");document.write(ed.iframeHTML);document.close();ed.'+n+"(true);})()";return Z1.setAttrib(t,"src",r),!0}return!1}(e,u);return e.contentAreaContainer=t.iframeContainer,e.iframeElement=u,e.iframeHTML=function(e){var t=e.getParam("doctype","<!DOCTYPE html>")+"<html><head>";e.getParam("document_base_url","")!==e.documentBaseUrl&&(t+='<base href="'+e.documentBaseURI.getURI()+'" />'),t+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';var n=Ns(e,"body_id","tinymce"),r=Ns(e,"body_class",""),o=e.translate(e.getParam("iframe_aria_text","Rich Text Area. Press ALT-0 for help.","string"));return Es(e)&&(t+='<meta http-equiv="Content-Security-Policy" content="'+Es(e)+'" />'),t+('</head><body id="'+n+'" class="mce-content-body '+r+'" data-id="'+e.id)+'" aria-label="'+o+'"><br></body></html>'}(e),Z1.add(t.iframeContainer,u),s}function I1(e){return e.replace(/^\-/,"")}function M1(e){return{editorContainer:e,iframeContainer:e,api:{}}}function F1(e){var t,n,r,o,i,a,u,s=e.getElement();return e.orgDisplay=s.style.display,X(Is(e))?e.theme.renderUI():y(Is(e))?(n=(t=e).getElement(),(r=Is(t)(t,n)).editorContainer.nodeType&&(r.editorContainer.id=r.editorContainer.id||t.id+"_parent"),r.iframeContainer&&r.iframeContainer.nodeType&&(r.iframeContainer.id=r.iframeContainer.id||t.id+"_iframecontainer"),r.height=r.iframeHeight||n.offsetHeight,r):(u=(o=e).getElement(),o.inline?M1(null):(i=u,a=ex.create("div"),ex.insertAfter(a,i),M1(a)))}function U1(e){var n,t,r,o,i,a,u,s;e.fire("ScriptsLoaded"),n=e,t=Nt.trim(Rs(n)),r=n.ui.registry.getAll().icons,ne(_e(_e({},Vv.get("default").icons),Vv.get(t).icons),function(e,t){Ee(r,t)||n.ui.registry.addIcon(t,e)}),a=Is(o=e),X(a)?(o.settings.theme=I1(a),i=Yv.get(a),o.theme=new i(o,Yv.urls[a]),o.theme.init&&o.theme.init(o,Yv.urls[a]||o.documentBaseUrl.replace(/\/$/,""),o.$)):o.theme={},s=[],Nt.each(Fs(u=e).split(/[ ,]/),function(e){tx(u,s,I1(e))});var c=F1(e),l=e,f=ve.from(c.api).getOr({}),d={show:ve.from(f.show).getOr(te),hide:ve.from(f.hide).getOr(te),disable:ve.from(f.disable).getOr(te),isDisabled:ve.from(f.isDisabled).getOr(D),enable:function(){l.mode.isReadOnly()||ve.from(f.enable).map(x)}};l.ui=_e(_e({},l.ui),d);var m,g,p,h={editorContainer:c.editorContainer,iframeContainer:c.iframeContainer};return e.editorContainer=h.editorContainer||null,nb(e),e.inline?P1(e):(p=L1(m=e,g=h),g.editorContainer&&(Z1.get(g.editorContainer).style.display=m.orgDisplay,m.hidden=Z1.isHidden(g.editorContainer)),m.getElement().style.display="none",Z1.setAttrib(m.id,"aria-hidden","true"),void(p||P1(m)))}function z1(e){return"-"===e.charAt(0)}function H1(t,e,n){return ve.from(e).filter(function(e){return 0<e.length&&!Vv.has(e)}).map(function(e){return{url:t.editorManager.baseURL+"/icons/"+e+"/icons"+n+".js",name:ve.some(e)}})}function j1(c,l){var e,t,f=ou.ScriptLoader,n=f,r=l,o=function(){var r,o,t,n,e,i,a,u,s;e=f,u=Ts(i=c),s=i.getParam("language_url","","string"),!1===lu.hasCode(u)&&"en"!==u&&(a=""!==s?s:i.editorManager.baseURL+"/langs/"+u+".js",e.add(a,te,void 0,function(){Zv(i,"LanguageLoadError",eb("language",a,u))})),t=f,Y(function(e){for(var t=[],n=function(e){t.push(e)},r=0;r<e.length;r++)e[r].each(n);return t}([H1(n=c,"default",l),ve.from(n.getParam("icons_url","","string")).filter(function(e){return 0<e.length}).map(function(e){return{url:e,name:ve.none()}}).orThunk(function(){return H1(n,Rs(n),"")})]),function(e){t.add(e.url,te,void 0,function(){Zv(n,"IconsLoadError",eb("icons",e.url,e.name.getOrUndefined()))})}),r=c,o=l,Nt.each(r.getParam("external_plugins"),function(e,t){Xv.load(t,e,te,void 0,function(){tb(r,e,t)}),r.settings.plugins+=" "+t}),Nt.each(Fs(r).split(/[ ,]/),function(e){var t,n;(e=Nt.trim(e))&&!Xv.urls[e]&&(z1(e)?(e=e.substr(1,e.length),t=Xv.dependencies(e),Nt.each(t,function(e){var t=Xv.createUrl({prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"},e);Xv.load(t.resource,t,te,void 0,function(){tb(r,t.prefix+t.resource+t.suffix,t.resource)})})):(n={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"},Xv.load(e,n,te,void 0,function(){tb(r,n.prefix+n.resource+n.suffix,e)})))}),f.loadQueue(function(){c.removed||U1(c)},c,function(){c.removed||U1(c)})},i=Is(e=c);X(i)?(z1(i)||Ee(Yv.urls,i)||((t=e.getParam("theme_url"))?Yv.load(i,e.documentBaseURI.toAbsolute(t)):Yv.load(i,"themes/"+i+"/theme"+r+".js")),n.loadQueue(function(){Yv.waitFor(i,o)})):o()}function V1(a){return function(i,e){return ve.from(e).map(Et.fromDom).filter(_n).bind(function(e){return n=a,t=i,r=e.dom,Tg(Et.fromDom(r),function(e){return Sn(t=e,n).orThunk(function(){return"font"===kt(t)?ue(rx,n).bind(function(e){return bn(t,e)}):ve.none()});var t},function(e){return je(Et.fromDom(t),e)}).or((o=e.dom,ve.from(eu.DOM.getStyle(o,a,!0))));var n,t,r,o}).getOr("")}}function q1(e){return rf(e.getBody()).map(function(e){var t=e.container();return Vn(t)?t.parentNode:t})}function $1(e,t){return n=e,r=a(ve.some,t),o=n,ve.from(o.selection.getRng()).bind(function(e){var t=o.getBody();return e.startContainer===t&&0===e.startOffset?ve.none():ve.from(o.selection.getStart(!0))}).orThunk(R(q1,n)).map(Et.fromDom).filter(_n).bind(r);var n,r,o}function W1(e,t){if(/^[0-9.]+$/.test(t)){var n=parseInt(t,10);if(1<=n&&n<=7){var r=Nt.explode(e.getParam("font_size_style_values","xx-small,x-small,small,medium,large,x-large,xx-large")),o=Nt.explode(e.getParam("font_size_classes",""));return o?o[n-1]||t:r[n-1]||t}return t}return t}var K1=Gn,X1=Yn,Y1=function(e){e.on(function(e){C1(e.ghost)}),e.clear()},G1=Yn,J1=Gn,Q1=eu.DOM,Z1=eu.DOM,ex=eu.DOM,tx=function(t,n,r){var o,i,a,u,e=Xv.get(r),s=Xv.urls[r]||t.documentBaseUrl.replace(/\/$/,"");if(r=Nt.trim(r),e&&-1===Nt.inArray(n,r)&&(Nt.each(Xv.dependencies(r),function(e){tx(t,n,e)}),!t.plugins[r]))try{var c=new e(t,s,t.$);(t.plugins[r]=c).init&&(c.init(t,s),n.push(r))}catch(e){i=r,a=e,Cf(o=t,"PluginLoadError",{message:u=lu.translate(["Failed to initialize plugin: {0}",i])}),wy(u,a),Qv(o,u)}},nx=eu.DOM,rx={"font-size":"size","font-family":"face"},ox=V1("font-size"),ix=i(function(e){return e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,",")},V1("font-family")),ax=Nt.each,ux=Nt.map,sx=Nt.inArray,cx=(lx.prototype.execCommand=function(t,n,r,e){var o,i,a=!1,u=this;if(!u.editor.removed){if("mcefocus"!==t.toLowerCase()&&(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(t)||e&&e.skip_focus?md(i=u.editor).each(function(e){return i.selection.setRng(e)}):u.editor.focus()),(e=u.editor.fire("BeforeExecCommand",{command:t,ui:n,value:r})).isDefaultPrevented())return!1;var s=t.toLowerCase();if(o=u.commands.exec[s])return o(s,n,r),u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0;if(ax(this.editor.plugins,function(e){if(e.execCommand&&e.execCommand(t,n,r))return u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!(a=!0)}),a)return a;if(u.editor.theme&&u.editor.theme.execCommand&&u.editor.theme.execCommand(t,n,r))return u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0;try{a=u.editor.getDoc().execCommand(t,n,r)}catch(e){}return!!a&&(u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0)}},lx.prototype.queryCommandState=function(e){var t;if(!this.editor.quirks.isHidden()&&!this.editor.removed){if(e=e.toLowerCase(),t=this.commands.state[e])return t(e);try{return this.editor.getDoc().queryCommandState(e)}catch(e){}return!1}},lx.prototype.queryCommandValue=function(e){var t;if(!this.editor.quirks.isHidden()&&!this.editor.removed){if(e=e.toLowerCase(),t=this.commands.value[e])return t(e);try{return this.editor.getDoc().queryCommandValue(e)}catch(e){}}},lx.prototype.addCommands=function(e,n){void 0===n&&(n="exec");var r=this;ax(e,function(t,e){ax(e.toLowerCase().split(","),function(e){r.commands[n][e]=t})})},lx.prototype.addCommand=function(e,o,i){var a=this;e=e.toLowerCase(),this.commands.exec[e]=function(e,t,n,r){return o.call(i||a.editor,t,n,r)}},lx.prototype.queryCommandSupported=function(e){if(e=e.toLowerCase(),this.commands.exec[e])return!0;try{return this.editor.getDoc().queryCommandSupported(e)}catch(e){}return!1},lx.prototype.addQueryStateHandler=function(e,t,n){var r=this;e=e.toLowerCase(),this.commands.state[e]=function(){return t.call(n||r.editor)}},lx.prototype.addQueryValueHandler=function(e,t,n){var r=this;e=e.toLowerCase(),this.commands.value[e]=function(){return t.call(n||r.editor)}},lx.prototype.hasCustomCommand=function(e){return e=e.toLowerCase(),!!this.commands.exec[e]},lx.prototype.execNativeCommand=function(e,t,n){return void 0===t&&(t=!1),void 0===n&&(n=null),this.editor.getDoc().execCommand(e,t,n)},lx.prototype.isFormatMatch=function(e){return this.editor.formatter.match(e)},lx.prototype.toggleFormat=function(e,t){this.editor.formatter.toggle(e,t),this.editor.nodeChanged()},lx.prototype.storeSelection=function(e){this.selectionBookmark=this.editor.selection.getBookmark(e)},lx.prototype.restoreSelection=function(){this.editor.selection.moveToBookmark(this.selectionBookmark)},lx.prototype.setupCommands=function(u){var o=this;function e(r){return function(){var e=u.selection,t=e.isCollapsed()?[u.dom.getParent(e.getNode(),u.dom.isBlock)]:e.getSelectedBlocks(),n=ux(t,function(e){return!!u.formatter.matchNode(e,r)});return-1!==sx(n,!0)}}this.addCommands({"mceResetDesignMode,mceBeginUndoLevel":te,"mceEndUndoLevel,mceAddUndoLevel":function(){u.undoManager.add()},mceFocus:function(e,t,n){var r,o;o=n,(r=u).removed||(o?zd:function(t){var e=t.selection,n=t.getBody(),r=e.getRng();t.quirks.refreshContentEditable(),void 0!==t.bookmark&&!1===Cd(t)&&md(t).each(function(e){t.selection.setRng(e),r=e});var o,i,a=(o=t,i=e.getNode(),o.dom.getParent(i,function(e){return"true"===o.dom.getContentEditable(e)}));if(t.$.contains(n,a))return yd(a),bd(t,r),zd(t);t.inline||(xt.opera||yd(n),t.getWin().focus()),(xt.gecko||t.inline)&&(yd(n),bd(t,r)),zd(t)})(r)},"Cut,Copy,Paste":function(e){var t,n,r=u.getDoc();try{o.execNativeCommand(e)}catch(e){t=!0}!(t="paste"===e&&!r.queryCommandEnabled(e)||t)&&r.queryCommandSupported(e)||(n=u.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead."),xt.mac&&(n=n.replace(/Ctrl\+/g,"\u2318+")),u.notificationManager.open({text:n,type:"error"}))},unlink:function(){var e;u.selection.isCollapsed()?(e=u.dom.getParent(u.selection.getStart(),"a"))&&u.dom.remove(e,!0):u.formatter.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(e){var t=e.substring(7);"full"===t&&(t="justify"),ax("left,center,right,justify".split(","),function(e){t!==e&&u.formatter.remove("align"+e)}),"none"!==t&&o.toggleFormat("align"+t)},"InsertUnorderedList,InsertOrderedList":function(e){var t;o.execNativeCommand(e);var n=u.dom.getParent(u.selection.getNode(),"ol,ul");n&&(t=n.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(t.nodeName)&&(o.storeSelection(),u.dom.split(t,n),o.restoreSelection()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){o.toggleFormat(e)},"ForeColor,HiliteColor":function(e,t,n){o.toggleFormat(e,{value:n})},FontName:function(e,t,n){var r,o;o=W1(r=u,n),r.formatter.toggle("fontname",{value:A(o.split(/\s*,\s*/),function(e){return-1===e.indexOf(" ")||Ge(e,'"')||Ge(e,"'")?e:"'"+e+"'"}).join(",")}),r.nodeChanged()},FontSize:function(e,t,n){var r;(r=u).formatter.toggle("fontsize",{value:W1(r,n)}),r.nodeChanged()},LineHeight:function(e,t,n){var r;(r=u).formatter.toggle("lineheight",{value:String(n)}),r.nodeChanged()},Lang:function(e,t,n){o.toggleFormat(e,{value:n.code,customValue:n.customCode})},RemoveFormat:function(e){u.formatter.remove(e)},mceBlockQuote:function(){o.toggleFormat("blockquote")},FormatBlock:function(e,t,n){return o.toggleFormat(n||"p")},mceCleanup:function(){var e=u.selection.getBookmark();u.setContent(u.getContent()),u.selection.moveToBookmark(e)},mceRemoveNode:function(e,t,n){var r=n||u.selection.getNode();r!==u.getBody()&&(o.storeSelection(),u.dom.remove(r,!0),o.restoreSelection())},mceSelectNodeDepth:function(e,t,n){var r=0;u.dom.getParent(u.selection.getNode(),function(e){if(1===e.nodeType&&r++===n)return u.selection.select(e),!1},u.getBody())},mceSelectNode:function(e,t,n){u.selection.select(n)},mceInsertContent:function(e,t,n){var r,o,i,a;r=u,o=function(e){if("string"==typeof e)return{content:e,details:{}};var t=Nt.extend({paste:e.paste,data:{paste:e.paste}},e);return{content:e.content,details:t}}(n),i=o.content,a=o.details,bh(r).editor.insertContent(i,a)},mceInsertRawHTML:function(e,t,n){u.selection.setContent("tiny_mce_marker");var r=u.getContent();u.setContent(r.replace(/tiny_mce_marker/g,function(){return n}))},mceInsertNewLine:function(e,t,n){VC(u,n)},mceToggleFormat:function(e,t,n){o.toggleFormat(n)},mceSetContent:function(e,t,n){u.setContent(n)},"Indent,Outdent":function(e){I0(u,e)},mceRepaint:te,InsertHorizontalRule:function(){u.execCommand("mceInsertContent",!1,"<hr />")},mceToggleVisualAid:function(){u.hasVisual=!u.hasVisual,u.addVisual()},mceReplaceContent:function(e,t,n){u.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,u.selection.getContent({format:"text"})))},mceInsertLink:function(e,t,n){"string"==typeof n&&(n={href:n});var r=u.dom.getParent(u.selection.getNode(),"a");n.href=n.href.replace(/ /g,"%20"),r&&n.href||u.formatter.remove("link"),n.href&&u.formatter.apply("link",n,r)},selectAll:function(){var e,t=u.dom.getParent(u.selection.getStart(),Yn);t&&((e=u.dom.createRng()).selectNodeContents(t),u.selection.setRng(e))},mceNewDocument:function(){u.setContent("")},InsertLineBreak:function(e,t,n){return TC(u,n),!0}}),o.addCommands({JustifyLeft:e("alignleft"),JustifyCenter:e("aligncenter"),JustifyRight:e("alignright"),JustifyFull:e("alignjustify"),"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return o.isFormatMatch(e)},mceBlockQuote:function(){return o.isFormatMatch("blockquote")},Outdent:function(){return P0(u)},"InsertUnorderedList,InsertOrderedList":function(e){var t=u.dom.getParent(u.selection.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),o.addCommands({Undo:function(){u.undoManager.undo()},Redo:function(){u.undoManager.redo()}}),o.addQueryValueHandler("FontName",function(){return $1(t=u,function(e){return ix(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("FontSize",function(){return $1(t=u,function(e){return ox(t.getBody(),e.dom)}).getOr("");var t},this),o.addQueryValueHandler("LineHeight",function(){return $1(t=u,function(n){var e=Et.fromDom(t.getBody());return Tg(n,function(e){return Sn(e,"line-height")},R(je,e)).getOrThunk(function(){var e=parseFloat(wn(n,"line-height")),t=parseFloat(wn(n,"font-size"));return String(e/t)})}).getOr("");var t},this)},lx);function lx(e){this.commands={state:{},exec:{},value:{}},this.editor=e,this.setupCommands(e)}function fx(e,t,n){var r,o,i,a,u,s;bu(e,t)&&!1===n?(o=t,hu(r=e)?r.dom.classList.remove(o):(u=o,0<(s=U(pu(a=r,"class"),function(e){return e!==u})).length?pn(a,"class",s.join(" ")):Cn(a,"class")),0===(hu(i=r)?i.dom.classList:pu(i,"class")).length&&Cn(i,"class")):n&&vu(e,t)}function dx(e,t,n){try{e.getDoc().execCommand(t,!1,String(n))}catch(e){}}function mx(e,t){e.dom.contentEditable=t?"true":"false"}function gx(e,t){var n,r,o=Et.fromDom(e.getBody());fx(o,"mce-content-readonly",t),t?(e.selection.controlSelection.hideResizeRect(),e._selectionOverrides.hideFakeCaret(),ve.from(e.selection.getNode()).each(function(e){e.removeAttribute("data-mce-selected")}),mx(o,!(e.readonly=!0)),Y(yu(o,'*[contenteditable="true"]'),function(e){pn(e,vx,"true"),mx(e,!1)})):(mx(o,!(e.readonly=!1)),Y(yu(o,"*["+vx+'="true"]'),function(e){Cn(e,vx),mx(e,!0)}),dx(e,"StyleWithCSS",!1),dx(e,"enableInlineTableEditing",!1),dx(e,"enableObjectResizing",!1),(Cd(n=e)||(r=n,od(Pn(Et.fromDom(r.getElement()))).filter(function(e){return!(void 0!==(t=e.dom.classList)&&(t.contains("tox-edit-area")||t.contains("tox-edit-area__iframe")||t.contains("mce-content-body")))&&pd(r,e.dom);var t}).isSome()))&&e.focus(),e.selection.setRng(e.selection.getRng()),e.nodeChanged())}function px(e){return e.readonly}function hx(t){t.parser.addAttributeFilter("contenteditable",function(e){px(t)&&Y(e,function(e){e.attr(vx,e.attr("contenteditable")),e.attr("contenteditable","false")})}),t.serializer.addAttributeFilter(vx,function(e){px(t)&&Y(e,function(e){e.attr("contenteditable",e.attr(vx))})}),t.serializer.addTempAttr(vx)}var vx="data-mce-contenteditable",bx=Nt.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," "),yx=(Cx.isNative=function(e){return!!bx[e.toLowerCase()]},Cx.prototype.fire=function(e,t){var n=e.toLowerCase(),r=so(n,t||{},this.scope);this.settings.beforeFire&&this.settings.beforeFire(r);var o=this.bindings[n];if(o)for(var i=0,a=o.length;i<a;i++){var u=o[i];if(!u.removed){if(u.once&&this.off(n,u.func),r.isImmediatePropagationStopped())return r;if(!1===u.func.call(this.scope,r))return r.preventDefault(),r}}return r},Cx.prototype.on=function(e,t,n,r){if(t=!1===t?D:t){var o={func:t,removed:!1};r&&Nt.extend(o,r);for(var i=e.toLowerCase().split(" "),a=i.length;a--;){var u=i[a],s=this.bindings[u];s||(s=[],this.toggleEvent(u,!0)),s=n?Ae([o],s,!0):Ae(Ae([],s,!0),[o],!1),this.bindings[u]=s}}return this},Cx.prototype.off=function(e,t){var n=this;if(e)for(var r=e.toLowerCase().split(" "),o=r.length;o--;){var i,a=r[o],u=this.bindings[a];if(!a)return ne(this.bindings,function(e,t){n.toggleEvent(t,!1),delete n.bindings[t]}),this;u&&(t?(u=(i=B(u,function(e){return e.func===t})).fail,this.bindings[a]=u,Y(i.pass,function(e){e.removed=!0})):u.length=0,u.length||(this.toggleEvent(e,!1),delete this.bindings[a]))}else ne(this.bindings,function(e,t){n.toggleEvent(t,!1)}),this.bindings={};return this},Cx.prototype.once=function(e,t,n){return this.on(e,t,n,{once:!0})},Cx.prototype.has=function(e){return e=e.toLowerCase(),!(!this.bindings[e]||0===this.bindings[e].length)},Cx);function Cx(e){this.bindings={},this.settings=e||{},this.scope=this.settings.scope||this,this.toggleEvent=this.settings.toggleEvent||D}function xx(n){return n._eventDispatcher||(n._eventDispatcher=new yx({scope:n,toggleEvent:function(e,t){yx.isNative(e)&&n.toggleNativeEvent&&n.toggleNativeEvent(e,t)}})),n._eventDispatcher}function wx(e,t){if("selectionchange"===t)return e.getDoc();if(!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t))return e.getDoc().documentElement;var n=Ls(e);return n?(e.eventRoot||(e.eventRoot=Rx.select(n)[0]),e.eventRoot):e.getBody()}function Sx(e,t,n){var r,o,i,a;e.hidden||px(e)?px(e)&&(r=e,"click"!==(o=n).type||If.metaKeyPressed(o)||(i=Et.fromDom(o.target),a=r,yr(i,"a",function(e){return je(e,Et.fromDom(a.getBody()))}).bind(function(e){return bn(e,"href")}).each(function(e){var t,n;o.preventDefault(),/^#/.test(e)?(t=r.dom.select(e+',[name="'+(Ge(n=e,"#")?n.substring("#".length):n)+'"]')).length&&r.selection.scrollIntoView(t[0],!0):window.open(e,"_blank","rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes")}))):e.fire(t,n)}function Nx(i,a){var e,t;i.delegates||(i.delegates={}),i.delegates[a]||i.removed||(t=wx(i,a),Ls(i)?(_x||(_x={},i.editorManager.on("removeEditor",function(){i.editorManager.activeEditor||_x&&(ne(_x,function(e,t){i.dom.unbind(wx(i,t))}),_x=null)})),_x[a]||(_x[a]=e=function(e){for(var t=e.target,n=i.editorManager.get(),r=n.length;r--;){var o=n[r].getBody();o!==t&&!Rx.isChildOf(t,o)||Sx(n[r],a,e)}},Rx.bind(t,a,e))):(Rx.bind(t,a,e=function(e){Sx(i,a,e)}),i.delegates[a]=e))}function Ex(e,t,n,r){var o=n[t.get()],i=n[r];try{i.activate()}catch(e){return void console.error("problem while activating editor mode "+r+":",e)}o.deactivate(),o.editorReadOnly!==i.editorReadOnly&&gx(e,i.editorReadOnly),t.set(r),e.fire("SwitchMode",{mode:r})}function kx(e){var t,n={};Ox(Bx(e.toLowerCase(),"+"),function(e){e in Lx?n[e]=!0:/^[0-9]{2,}$/.test(e)?n.keyCode=parseInt(e,10):(n.charCode=e.charCodeAt(0),n.keyCode=Px[e]||e.toUpperCase().charCodeAt(0))});var r=[n.keyCode];for(t in Lx)n[t]?r.push(t):n[t]=!1;return n.id=r.join(","),n.access&&(n.alt=!0,xt.mac?n.ctrl=!0:n.shift=!0),n.meta&&(xt.mac?n.meta=!0:(n.ctrl=!0,n.meta=!1)),n}var _x,Ax={fire:function(e,t,n){if(this.removed&&"remove"!==e&&"detach"!==e)return t;var r=xx(this).fire(e,t);if(!1!==n&&this.parent)for(var o=this.parent();o&&!r.isPropagationStopped();)o.fire(e,r,!1),o=o.parent();return r},on:function(e,t,n){return xx(this).on(e,t,n)},off:function(e,t){return xx(this).off(e,t)},once:function(e,t){return xx(this).once(e,t)},hasEventListeners:function(e){return xx(this).has(e)}},Rx=eu.DOM,Dx=_e(_e({},Ax),{bindPendingEventDelegates:function(){var t=this;Nt.each(t._pendingNativeEvents,function(e){Nx(t,e)})},toggleNativeEvent:function(e,t){var n=this;"focus"!==e&&"blur"!==e&&(n.removed||(t?n.initialized?Nx(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(wx(n,e),e,n.delegates[e]),delete n.delegates[e])))},unbindAllNativeEvents:function(){var n=this,e=n.getBody(),t=n.dom;n.delegates&&(ne(n.delegates,function(e,t){n.dom.unbind(wx(n,t),t,e)}),delete n.delegates),!n.inline&&e&&t&&(e.onload=null,t.unbind(n.getWin()),t.unbind(n.getDoc())),t&&(t.unbind(e),t.unbind(n.getContainer()))}}),Tx=["design","readonly"],Ox=Nt.each,Bx=Nt.explode,Px={f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123},Lx=Nt.makeMap("alt,ctrl,shift,meta,access"),Ix=(Mx.prototype.add=function(e,n,t,r){var o=this,i=o.normalizeCommandFunc(t);return Ox(Bx(Nt.trim(e)),function(e){var t=o.createShortcut(e,n,i,r);o.shortcuts[t.id]=t}),!0},Mx.prototype.remove=function(e){var t=this.createShortcut(e);return!!this.shortcuts[t.id]&&(delete this.shortcuts[t.id],!0)},Mx.prototype.normalizeCommandFunc=function(e){var t=this,n=e;return"string"==typeof n?function(){t.editor.execCommand(n,!1,null)}:Nt.isArray(n)?function(){t.editor.execCommand(n[0],n[1],n[2])}:n},Mx.prototype.createShortcut=function(e,t,n,r){var o=Nt.map(Bx(e,">"),kx);return o[o.length-1]=Nt.extend(o[o.length-1],{func:n,scope:r||this.editor}),Nt.extend(o[0],{desc:this.editor.translate(t),subpatterns:o.slice(1)})},Mx.prototype.hasModifier=function(e){return e.altKey||e.ctrlKey||e.metaKey},Mx.prototype.isFunctionKey=function(e){return"keydown"===e.type&&112<=e.keyCode&&e.keyCode<=123},Mx.prototype.matchShortcut=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},Mx.prototype.executeShortcutAction=function(e){return e.func?e.func.call(e.scope):null},Mx);function Mx(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;var n=this;e.on("keyup keypress keydown",function(t){!n.hasModifier(t)&&!n.isFunctionKey(t)||t.isDefaultPrevented()||(Ox(n.shortcuts,function(e){if(n.matchShortcut(t,e))return n.pendingPatterns=e.subpatterns.slice(0),"keydown"===t.type&&n.executeShortcutAction(e),!0}),n.matchShortcut(t,n.pendingPatterns[0])&&(1===n.pendingPatterns.length&&"keydown"===t.type&&n.executeShortcutAction(n.pendingPatterns[0]),n.pendingPatterns.shift()))})}var Fx=eu.DOM,Ux=Nt.extend,zx=Nt.each,Hx=Nt.resolve,jx=xt.ie,Vx=(qx.prototype.render=function(){!function(t){var e=t.id;lu.setCode(Ts(t));var n,r,o,i,a=function(){nx.unbind(window,"ready",a),t.render()};ci.Event.domLoaded?t.getElement()&&xt.contentEditable&&(n=Et.fromDom(t.getElement()),r=L(n.dom.attributes,function(e,t){return e[t.name]=t.value,e},{}),t.on("remove",function(){O(n.dom.attributes,function(e){return Cn(n,e.name),0}),hn(n,r)}),t.ui.styleSheetLoader=Rr.forElement(n,{contentCssCors:(o=t).getParam("content_css_cors"),referrerPolicy:Ds(o)}),t.getParam("inline")?t.inline=!0:(t.orgVisibility=t.getElement().style.visibility,t.getElement().style.visibility="hidden"),(i=t.getElement().form||nx.getParent(e,"form"))&&(t.formElement=i,t.getParam("hidden_input")&&!jn(t.getElement())&&(nx.insertAfter(nx.create("input",{type:"hidden",name:e}),e),t.hasHiddenInput=!0),t.formEventDelegate=function(e){t.fire(e.type,e)},nx.bind(i,"submit reset",t.formEventDelegate),t.on("reset",function(){t.resetContent()}),!t.getParam("submit_patch")||i.submit.nodeType||i.submit.length||i._mceOldSubmit||(i._mceOldSubmit=i.submit,i.submit=function(){return t.editorManager.triggerSave(),t.setDirty(!1),i._mceOldSubmit(i)})),t.windowManager=Gv(t),t.notificationManager=Ev(t),"xml"===t.getParam("encoding")&&t.on("GetContent",function(e){e.save&&(e.content=nx.encode(e.content))}),t.getParam("add_form_submit_trigger")&&t.on("submit",function(){t.initialized&&t.save()}),t.getParam("add_unload_trigger")&&(t._beforeUnload=function(){!t.initialized||t.destroyed||t.isHidden()||t.save({format:"raw",no_events:!0,set_dirty:!1})},t.editorManager.on("BeforeUnload",t._beforeUnload)),t.editorManager.add(t),j1(t,t.suffix)):nx.bind(window,"ready",a)}(this)},qx.prototype.focus=function(e){this.execCommand("mceFocus",!1,e)},qx.prototype.hasFocus=function(){return Cd(this)},qx.prototype.execCallback=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r,o=this.settings[e];if(o)return this.callbackLookup&&(r=this.callbackLookup[e])&&(o=r.func,r=r.scope),"string"==typeof o&&(r=(r=o.replace(/\.\w+$/,""))?Hx(r):0,o=Hx(o),this.callbackLookup=this.callbackLookup||{},this.callbackLookup[e]={func:o,scope:r}),o.apply(r||this,t)},qx.prototype.translate=function(e){return lu.translate(e)},qx.prototype.getParam=function(e,t,n){return i=t,a=n,l=(o=e)in(r=this).settings?r.settings[o]:i,"hash"===a?(c={},"string"==typeof(s=l)?Y(0<s.indexOf("=")?s.split(/[;,](?![^=;,]*(?:[;,]|$))/):s.split(","),function(e){var t=e.split("=");1<t.length?c[Nt.trim(t[0])]=Nt.trim(t[1]):c[Nt.trim(t[0])]=Nt.trim(t[0])}):c=s,c):"string"===a?xv(X,r,o).getOr(i):"number"===a?xv(N,r,o).getOr(i):"boolean"===a?xv(v,r,o).getOr(i):"object"===a?xv(h,r,o).getOr(i):"array"===a?xv(S,r,o).getOr(i):"string[]"===a?xv((u=X,function(e){return S(e)&&j(e,u)}),r,o).getOr(i):"function"===a?xv(y,r,o).getOr(i):l;var r,o,i,a,u,s,c,l},qx.prototype.hasPlugin=function(e,t){return!(!T(Fs(this).split(/[ ,]/),e)||t&&void 0===Xv.get(e))},qx.prototype.nodeChanged=function(e){this._nodeChangeDispatcher.nodeChanged(e)},qx.prototype.addCommand=function(e,t,n){this.editorCommands.addCommand(e,t,n)},qx.prototype.addQueryStateHandler=function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},qx.prototype.addQueryValueHandler=function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},qx.prototype.addShortcut=function(e,t,n,r){this.shortcuts.add(e,t,n,r)},qx.prototype.execCommand=function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},qx.prototype.queryCommandState=function(e){return this.editorCommands.queryCommandState(e)},qx.prototype.queryCommandValue=function(e){return this.editorCommands.queryCommandValue(e)},qx.prototype.queryCommandSupported=function(e){return this.editorCommands.queryCommandSupported(e)},qx.prototype.show=function(){this.hidden&&(this.hidden=!1,this.inline?this.getBody().contentEditable="true":(Fx.show(this.getContainer()),Fx.hide(this.id)),this.load(),this.fire("show"))},qx.prototype.hide=function(){var e=this,t=e.getDoc();e.hidden||(jx&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable="false",e===e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(Fx.hide(e.getContainer()),Fx.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},qx.prototype.isHidden=function(){return!!this.hidden},qx.prototype.setProgressState=function(e,t){this.fire("ProgressState",{state:e,time:t})},qx.prototype.load=function(e){var t=this.getElement();if(this.removed)return"";if(t){(e=e||{}).load=!0;var n=jn(t)?t.value:t.innerHTML,r=this.setContent(n,e);return e.element=t,e.no_events||this.fire("LoadContent",e),e.element=t=null,r}},qx.prototype.save=function(e){var t,n,r=this,o=r.getElement();if(o&&r.initialized&&!r.removed)return(e=e||{}).save=!0,e.element=o,e.content=r.getContent(e),e.no_events||r.fire("SaveContent",e),"raw"===e.format&&r.fire("RawSaveContent",e),t=e.content,jn(o)?o.value=t:(!e.is_removing&&r.inline||(o.innerHTML=t),(n=Fx.getParent(r.id,"form"))&&zx(n.elements,function(e){if(e.name===r.id)return e.value=t,!1})),e.element=o=null,!1!==e.set_dirty&&r.setDirty(!1),t},qx.prototype.setContent=function(e,t){return mv(this,e,t)},qx.prototype.getContent=function(e){return t=this,r=(n=void 0===(n=e)?{}:n).format||"html",o=n,bh(t).editor.getContent(o,r);var t,n,r,o},qx.prototype.insertContent=function(e,t){t&&(e=Ux({content:e},t)),this.execCommand("mceInsertContent",!1,e)},qx.prototype.resetContent=function(e){void 0===e?mv(this,this.startContent,{format:"raw"}):mv(this,e),this.undoManager.reset(),this.setDirty(!1),this.nodeChanged()},qx.prototype.isDirty=function(){return!this.isNotDirty},qx.prototype.setDirty=function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!==t&&this.fire("dirty")},qx.prototype.getContainer=function(){return this.container||(this.container=Fx.get(this.editorContainer||this.id+"_parent")),this.container},qx.prototype.getContentAreaContainer=function(){return this.contentAreaContainer},qx.prototype.getElement=function(){return this.targetElm||(this.targetElm=Fx.get(this.id)),this.targetElm},qx.prototype.getWin=function(){var e;return this.contentWindow||(e=this.iframeElement)&&(this.contentWindow=e.contentWindow),this.contentWindow},qx.prototype.getDoc=function(){var e;return this.contentDocument||(e=this.getWin())&&(this.contentDocument=e.document),this.contentDocument},qx.prototype.getBody=function(){var e=this.getDoc();return this.bodyElement||(e?e.body:null)},qx.prototype.convertURL=function(e,t,n){var r=this.settings;return r.urlconverter_callback?this.execCallback("urlconverter_callback",e,n,!0,t):!r.convert_urls||n&&"LINK"===n.nodeName||0===e.indexOf("file:")||0===e.length?e:r.relative_urls?this.documentBaseURI.toRelative(e):this.documentBaseURI.toAbsolute(e,r.remove_script_host)},qx.prototype.addVisual=function(e){var t;t=e,yh(this).editor.addVisual(t)},qx.prototype.remove=function(){var e,t,n,r,o;(e=this).removed||(t=e._selectionOverrides,n=e.editorUpload,r=e.getBody(),o=e.getElement(),r&&e.save({is_removing:!0}),e.removed=!0,e.unbindAllNativeEvents(),e.hasHiddenInput&&o&&Ov.remove(o.nextSibling),e.fire("remove"),e.editorManager.remove(e),!e.inline&&r&&Ov.setStyle(e.id,"display",e.orgDisplay),e.fire("detach"),Ov.remove(e.getContainer()),gv(t),gv(n),e.destroy())},qx.prototype.destroy=function(e){var t,n,r,o,i,a,u;n=e,a=(t=this).selection,u=t.dom,t.destroyed||(n||t.removed?(n||(t.editorManager.off("beforeunload",t._beforeUnload),t.theme&&t.theme.destroy&&t.theme.destroy(),gv(a),gv(u)),(o=(r=t).formElement)&&(o._mceOldSubmit&&(o.submit=o._mceOldSubmit,o._mceOldSubmit=null),Ov.unbind(o,"submit reset",r.formEventDelegate)),(i=t).contentAreaContainer=i.formElement=i.container=i.editorContainer=null,i.bodyElement=i.contentDocument=i.contentWindow=null,i.iframeElement=i.targetElm=null,i.selection&&(i.selection=i.selection.win=i.selection.dom=i.selection.dom.doc=null),t.destroyed=!0):t.remove())},qx.prototype.uploadImages=function(e){return this.editorUpload.uploadImages(e)},qx.prototype._scanForImages=function(){return this.editorUpload.scanForImages()},qx.prototype.addButton=function(){throw new Error("editor.addButton has been removed in tinymce 5x, use editor.ui.registry.addButton or editor.ui.registry.addToggleButton or editor.ui.registry.addSplitButton instead")},qx.prototype.addSidebar=function(){throw new Error("editor.addSidebar has been removed in tinymce 5x, use editor.ui.registry.addSidebar instead")},qx.prototype.addMenuItem=function(){throw new Error("editor.addMenuItem has been removed in tinymce 5x, use editor.ui.registry.addMenuItem instead")},qx.prototype.addContextToolbar=function(){throw new Error("editor.addContextToolbar has been removed in tinymce 5x, use editor.ui.registry.addContextToolbar instead")},qx);function qx(e,t,n){var r,o,i,a,u,s,c,l,f,d,m,g,p,h,v,b,y,C,x=this;function w(n,r){return function(e,t){return n[e.toLowerCase()]=_e(_e({},t),{type:r})}}this.plugins={},this.contentCSS=[],this.contentStyles=[],this.loadedCSS={},this.isNotDirty=!1,this.editorManager=n,this.documentBaseUrl=n.documentBaseURL,Ux(this,Dx),this.settings=(d=(f=this).documentBaseUrl,m=n.defaultSettings,p=d,h=Fv,v=f,b={id:e,theme:"silver",toolbar_mode:bv(g=t,"floating"),plugins:"",document_base_url:p,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"<!DOCTYPE html>",visual:!0,font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,inline_styles:!0,convert_fonts_to_spans:!0,indent:!0,indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",entity_encoding:"named",url_converter:v.convertURL,url_converter_scope:v},y=_e(_e({},b),h?jv:{}),!1!==(C=Cv(Uv||zv,Uv,y,m,g)).deprecation_warnings&&pv(g,C),C),this.settings.suffix&&(n.suffix=this.settings.suffix),this.suffix=n.suffix,this.settings.base_url&&n._setBaseUrl(this.settings.base_url),this.baseUri=n.baseURI,this.settings.referrer_policy&&(ou.ScriptLoader._setReferrerPolicy(this.settings.referrer_policy),eu.DOM.styleSheetLoader._setReferrerPolicy(this.settings.referrer_policy)),fu.languageLoad=this.settings.language_load,fu.baseURL=n.baseURL,this.id=e,this.setDirty(!1),this.documentBaseURI=new nv(this.settings.document_base_url,{base_uri:this.baseUri}),this.baseURI=this.baseUri,this.inline=!!this.settings.inline,this.shortcuts=new Ix(this),this.editorCommands=new cx(this),this.settings.cache_suffix&&(xt.cacheSuffix=this.settings.cache_suffix.replace(/^[\?\&]+/,"")),this.ui={registry:{addAutocompleter:(u={},(r={addButton:w(o={},"button"),addGroupToolbarButton:w(o,"grouptoolbarbutton"),addToggleButton:w(o,"togglebutton"),addMenuButton:w(o,"menubutton"),addSplitButton:w(o,"splitbutton"),addMenuItem:w(i={},"menuitem"),addNestedMenuItem:w(i,"nestedmenuitem"),addToggleMenuItem:w(i,"togglemenuitem"),addAutocompleter:w(a={},"autocompleter"),addContextMenu:w(s={},"contextmenu"),addContextToolbar:w(c={},"contexttoolbar"),addContextForm:w(c,"contextform"),addSidebar:w(l={},"sidebar"),addIcon:function(e,t){return u[e.toLowerCase()]=t},getAll:function(){return{buttons:o,menuItems:i,icons:u,popups:a,contextMenus:s,contextToolbars:c,sidebars:l}}}).addAutocompleter),addButton:r.addButton,addContextForm:r.addContextForm,addContextMenu:r.addContextMenu,addContextToolbar:r.addContextToolbar,addIcon:r.addIcon,addMenuButton:r.addMenuButton,addMenuItem:r.addMenuItem,addNestedMenuItem:r.addNestedMenuItem,addSidebar:r.addSidebar,addSplitButton:r.addSplitButton,addToggleButton:r.addToggleButton,addGroupToolbarButton:r.addGroupToolbarButton,addToggleMenuItem:r.addToggleMenuItem,getAll:r.getAll},styleSheetLoader:void 0,show:te,hide:te,enable:te,disable:te,isDisabled:D};var S,N,E,k,_,A=(k=au("design"),_=au({design:{activate:te,deactivate:te,editorReadOnly:!1},readonly:{activate:te,deactivate:te,editorReadOnly:!0}}),(N=S=this).serializer?hx(N):N.on("PreInit",function(){hx(N)}),(E=S).on("ShowCaret",function(e){px(E)&&e.preventDefault()}),E.on("ObjectSelected",function(e){px(E)&&e.preventDefault()}),{isReadOnly:function(){return px(S)},set:function(e){return function(e,t,n,r){if(r!==n.get()){if(!Ee(t,r))throw new Error("Editor mode '"+r+"' is invalid");e.initialized?Ex(e,n,t,r):e.on("init",function(){return Ex(e,n,t,r)})}}(S,_.get(),k,e)},get:function(){return k.get()},register:function(e,t){_.set(function(e,t,n){var r;if(T(Tx,t))throw new Error("Cannot override default mode "+t);return _e(_e({},e),((r={})[t]=_e(_e({},n),{deactivate:function(){try{n.deactivate()}catch(e){console.error("problem while deactivating editor mode "+t+":",e)}}}),r))}(_.get(),e,t))}});this.mode=A,this.setMode=A.set,n.fire("SetupEditor",{editor:this}),this.execCallback("setup",this),this.$=Ya.overrideDefaults(function(){return{context:x.inline?x.getBody():x.getDoc(),element:x.getBody()}})}function $x(t){var n=t.type;Jx(ow.get(),function(e){switch(n){case"scroll":e.fire("ScrollWindow",t);break;case"resize":e.fire("ResizeWindow",t)}})}function Wx(e){e!==ew&&(e?Ya(window).on("resize scroll",$x):Ya(window).off("resize scroll",$x),ew=e)}function Kx(t){var e=nw;delete tw[t.id];for(var n=0;n<tw.length;n++)if(tw[n]===t){tw.splice(n,1);break}return nw=U(nw,function(e){return t!==e}),ow.activeEditor===t&&(ow.activeEditor=0<nw.length?nw[0]:null),ow.focusedEditor===t&&(ow.focusedEditor=null),e.length!==nw.length}var Xx,Yx=eu.DOM,Gx=Nt.explode,Jx=Nt.each,Qx=Nt.extend,Zx=0,ew=!1,tw=[],nw=[],rw="CSS1Compat"!==document.compatMode,ow=_e(_e({},Ax),{baseURI:null,baseURL:null,defaultSettings:{},documentBaseURL:null,suffix:null,$:Ya,majorVersion:"5",minorVersion:"10.9",releaseDate:"2023-11-15",editors:tw,i18n:lu,activeEditor:null,focusedEditor:null,settings:{},setup:function(){var e,t="",n=nv.getDocumentBaseUrl(document.location);/^[^:]+:\/\/\/?[^\/]+\//.test(n)&&(n=n.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(n)||(n+="/"));var r=window.tinymce||window.tinyMCEPreInit;if(r)e=r.base||r.baseURL,t=r.suffix;else{for(var o,i=document.getElementsByTagName("script"),a=0;a<i.length;a++)if(""!==(o=i[a].src||"")){var u=o.substring(o.lastIndexOf("/"));if(/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(o)){-1!==u.indexOf(".min")&&(t=".min"),e=o.substring(0,o.lastIndexOf("/"));break}}!e&&document.currentScript&&(-1!==(o=document.currentScript.src).indexOf(".min")&&(t=".min"),e=o.substring(0,o.lastIndexOf("/")))}this.baseURL=new nv(n).toAbsolute(e),this.documentBaseURL=n,this.baseURI=new nv(this.baseURL),this.suffix=t,this.on("AddEditor",R(hd,this)),this.on("RemoveEditor",R(vd,this))},overrideDefaults:function(e){var t=e.base_url;t&&this._setBaseUrl(t);var n=e.suffix;e.suffix&&(this.suffix=n);var r=(this.defaultSettings=e).plugin_base_urls;void 0!==r&&ne(r,function(e,t){fu.PluginManager.urls[t]=e})},init:function(r){function u(e){var t=e.id;return t||(t=ue(e,"name").filter(function(e){return!Yx.get(e)}).getOrThunk(Yx.uniqueId),e.setAttribute("id",t)),t}function s(e,t){return t.constructor===RegExp?t.test(e.className):Yx.hasClass(e,t)}var n,c=this,l=Nt.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option table tbody tfoot thead tr th td script noscript style textarea video audio iframe object menu"," "),f=function(e){n=e},t=function(){function n(e,t,n){var r=new Vx(e,t,c);a.push(r),r.on("init",function(){++i===o.length&&f(a)}),r.targetElm=r.targetElm||n,r.render()}var o,e,i=0,a=[];Yx.unbind(window,"ready",t),(e=r.onpageload)&&e.apply(c,[]),o=Ya.unique(function(t){var n=[];if(xt.browser.isIE()&&xt.browser.version.major<11)return wy("TinyMCE does not support the browser you are using. For a list of supported browsers please see: https://www.tinymce.com/docs/get-started/system-requirements/"),[];if(rw)return wy("Failed to initialize the editor as the document is not in standards mode. TinyMCE requires standards mode."),[];if(t.types)return Jx(t.types,function(e){n=n.concat(Yx.select(e.selector))}),n;if(t.selector)return Yx.select(t.selector);if(t.target)return[t.target];switch(t.mode){case"exact":var e=t.elements||"";0<e.length&&Jx(Gx(e),function(t){var e=Yx.get(t);e?n.push(e):Jx(document.forms,function(e){Jx(e.elements,function(e){e.name===t&&(t="mce_editor_"+Zx++,Yx.setAttrib(e,"id",t),n.push(e))})})});break;case"textareas":case"specific_textareas":Jx(Yx.select("textarea"),function(e){t.editor_deselector&&s(e,t.editor_deselector)||t.editor_selector&&!s(e,t.editor_selector)||n.push(e)})}return n}(r)),r.types?Jx(r.types,function(t){Nt.each(o,function(e){return!Yx.is(e,t.selector)||(n(u(e),Qx({},r,t),e),!1)})}):(Nt.each(o,function(e){var t;(t=c.get(e.id))&&t.initialized&&!(t.getContainer()||t.getBody()).parentNode&&(Kx(t),t.unbindAllNativeEvents(),t.destroy(!0),t.removed=!0)}),0===(o=Nt.grep(o,function(e){return!c.get(e.id)})).length?f([]):Jx(o,function(e){var t=e;r.inline&&t.tagName.toLowerCase()in l?wy("Could not initialize inline editor on invalid inline target element",e):n(u(e),r,e)}))};return c.settings=r,Yx.bind(window,"ready",t),new _r(function(t){n?t(n):f=function(e){t(e)}})},get:function(t){return 0===arguments.length?nw.slice(0):X(t)?M(nw,function(e){return e.id===t}).getOr(null):N(t)&&nw[t]||null},add:function(e){var n=this;return tw[e.id]===e||(null===n.get(e.id)&&("length"!==e.id&&(tw[e.id]=e),tw.push(e),nw.push(e)),Wx(!0),n.activeEditor=e,n.fire("AddEditor",{editor:e}),Xx||(Xx=function(e){var t=n.fire("BeforeUnload");if(t.returnValue)return e.preventDefault(),e.returnValue=t.returnValue,t.returnValue},window.addEventListener("beforeunload",Xx))),e},createEditor:function(e,t){return this.add(new Vx(e,t,this))},remove:function(e){var t,n,r=this;if(e){if(!X(e))return n=e,l(r.get(n.id))?null:(Kx(n)&&r.fire("RemoveEditor",{editor:n}),0===nw.length&&window.removeEventListener("beforeunload",Xx),n.remove(),Wx(0<nw.length),n);Jx(Yx.select(e),function(e){(n=r.get(e.id))&&r.remove(n)})}else for(t=nw.length-1;0<=t;t--)r.remove(nw[t])},execCommand:function(e,t,n){var r=this.get(n);switch(e){case"mceAddEditor":return this.get(n)||new Vx(n,this.settings,this).render(),!0;case"mceRemoveEditor":return r&&r.remove(),!0;case"mceToggleEditor":return r?r.isHidden()?r.show():r.hide():this.execCommand("mceAddEditor",!1,n),!0}return!!this.activeEditor&&this.activeEditor.execCommand(e,t,n)},triggerSave:function(){Jx(nw,function(e){e.save()})},addI18n:function(e,t){lu.add(e,t)},translate:function(e){return lu.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!==e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e},_setBaseUrl:function(e){this.baseURL=new nv(this.documentBaseURL).toAbsolute(e.replace(/\/+$/,"")),this.baseURI=new nv(this.baseURL)}});function iw(e,t,n){var r=t.x,o=t.y,i=e.w,a=e.h,u=t.w,s=t.h,c=(n||"").split("");return"b"===c[0]&&(o+=s),"r"===c[1]&&(r+=u),"c"===c[0]&&(o+=gw(s/2)),"c"===c[1]&&(r+=gw(u/2)),"b"===c[3]&&(o-=a),"r"===c[4]&&(r-=i),"c"===c[3]&&(o-=gw(a/2)),"c"===c[4]&&(r-=gw(i/2)),uw(r,o,i,a)}function aw(){}ow.setup();function uw(e,t,n,r){return{x:e,y:t,w:n,h:r}}var sw,cw,lw,fw,dw=Math.min,mw=Math.max,gw=Math.round,pw={inflate:function(e,t,n){return uw(e.x-t,e.y-n,e.w+2*t,e.h+2*n)},relativePosition:iw,findBestRelativePosition:function(e,t,n,r){for(var o,i=0;i<r.length;i++)if((o=iw(e,t,r[i])).x>=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n=mw(e.x,t.x),r=mw(e.y,t.y),o=dw(e.x+e.w,t.x+t.w),i=dw(e.y+e.h,t.y+t.h);return o-n<0||i-r<0?null:uw(n,r,o-n,i-r)},clamp:function(e,t,n){var r=e.x,o=e.y,i=e.x+e.w,a=e.y+e.h,u=t.x+t.w,s=t.y+t.h,c=mw(0,t.x-r),l=mw(0,t.y-o),f=mw(0,i-u),d=mw(0,a-s);return r+=c,o+=l,n&&(i+=c,a+=l,r-=f,o-=d),uw(r,o,(i-=f)-r,(a-=d)-o)},create:uw,fromClientRect:function(e){return uw(e.left,e.top,e.width,e.height)}},hw=(sw={},cw={},{load:function(r,o){var i='Script at URL "'+o+'" failed to load',a='Script at URL "'+o+"\" did not call `tinymce.Resource.add('"+r+"', data)` within 1 second";if(void 0!==sw[r])return sw[r];var e=new _r(function(e,t){var n=function(e,t,n){function r(n){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o||(o=!0,null!==i&&(clearTimeout(i),i=null),n.apply(null,e))}}void 0===n&&(n=1e3);var o=!1,i=null,a=r(e),u=r(t);return{start:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o||null!==i||(i=setTimeout(function(){return u.apply(null,e)},n))},resolve:a,reject:u}}(e,t);cw[r]=n.resolve,ou.ScriptLoader.loadScript(o,function(){return n.start(a)},function(){return n.reject(i)})});return sw[r]=e},add:function(e,t){void 0!==cw[e]&&(cw[e](t),delete cw[e]),sw[e]=_r.resolve(t)}}),vw=Nt.each,bw=Nt.extend;aw.extend=lw=function(n){function r(){var e,t,n;if(!fw&&(this.init&&this.init.apply(this,arguments),t=this.Mixins))for(e=t.length;e--;)(n=t[e]).init&&n.init.apply(this,arguments)}function t(){return this}var o=this.prototype;fw=!0;var i=new this;return fw=!1,n.Mixins&&(vw(n.Mixins,function(e){for(var t in e)"init"!==t&&(n[t]=e[t])}),o.Mixins&&(n.Mixins=o.Mixins.concat(n.Mixins))),n.Methods&&vw(n.Methods.split(","),function(e){n[e]=t}),n.Properties&&vw(n.Properties.split(","),function(e){var t="_"+e;n[e]=function(e){return void 0!==e?(this[t]=e,this):this[t]}}),n.Statics&&vw(n.Statics,function(e,t){r[t]=e}),n.Defaults&&o.Defaults&&(n.Defaults=bw({},o.Defaults,n.Defaults)),ne(n,function(e,t){var n,r;"function"==typeof e&&o[t]?i[t]=(n=t,r=e,function(){var e=this._super;this._super=o[n];var t=r.apply(this,arguments);return this._super=e,t}):i[t]=e}),r.prototype=i,(r.constructor=r).extend=lw,r};var yw,Cw,xw,ww=Math.min,Sw=Math.max,Nw=Math.round,Ew={serialize:function(e){var t=JSON.stringify(e);return X(t)?t.replace(/[\u0080-\uFFFF]/g,function(e){var t=e.charCodeAt(0).toString(16);return"\\u"+"0000".substring(t.length)+t}):t},parse:function(e){try{return JSON.parse(e)}catch(e){}}},kw={callbacks:{},count:0,send:function(t){var n=this,r=eu.DOM,o=(void 0!==t.count?t:n).count,i="tinymce_jsonp_"+o;n.callbacks[o]=function(e){r.remove(i),delete n.callbacks[o],t.callback(e)},r.add(r.doc.body,"script",{id:i,src:t.url,type:"text/javascript"}),n.count++}},_w=_e(_e({},Ax),{send:function(e){var t,n=0,r=function(){!e.async||4===t.readyState||1e4<n++?(e.success&&n<1e4&&200===t.status?e.success.call(e.success_scope,""+t.responseText,t,e):e.error&&e.error.call(e.error_scope,1e4<n?"TIMED_OUT":"GENERAL",t,e),t=null):Ar.setTimeout(r,10)};if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=!1!==e.async,e.data=e.data||"",_w.fire("beforeInitialize",{settings:e}),(t=new XMLHttpRequest).overrideMimeType&&t.overrideMimeType(e.content_type),t.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(t.withCredentials=!0),e.content_type&&t.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&Nt.each(e.requestheaders,function(e){t.setRequestHeader(e.key,e.value)}),t.setRequestHeader("X-Requested-With","XMLHttpRequest"),(t=_w.fire("beforeSend",{xhr:t,settings:e}).xhr).send(e.data),!e.async)return r();Ar.setTimeout(r,10)}}),Aw=Nt.extend,Rw=(Dw.sendRPC=function(e){return(new Dw).send(e)},Dw.prototype.send=function(e){var n=e.error,r=e.success,o=Aw(this.settings,e);o.success=function(e,t){(e=void 0===(e=Ew.parse(e))?{error:"JSON Parse error."}:e).error?n.call(o.error_scope||o.scope,e.error,t):r.call(o.success_scope||o.scope,e.result)},o.error=function(e,t){n&&n.call(o.error_scope||o.scope,e,t)},o.data=Ew.serialize({id:e.id||"c"+this.count++,method:e.method,params:e.params}),o.content_type="application/json",_w.send(o)},Dw);function Dw(e){this.settings=Aw({},e),this.count=0}try{var Tw,Ow="__storage_test__";(Tw=window.localStorage).setItem(Ow,Ow),Tw.removeItem(Ow)}catch(e){yw={},Cw=[],xw={getItem:function(e){return yw[e]||null},setItem:function(e,t){Cw.push(e),yw[e]=String(t)},key:function(e){return Cw[e]},removeItem:function(t){Cw=Cw.filter(function(e){return e===t}),delete yw[t]},clear:function(){Cw=[],yw={}},length:0},Object.defineProperty(xw,"length",{get:function(){return Cw.length},configurable:!1,enumerable:!1}),Tw=xw}var Bw={geom:{Rect:pw},util:{Promise:_r,Delay:Ar,Tools:Nt,VK:If,URI:nv,Class:aw,EventDispatcher:yx,Observable:Ax,I18n:lu,XHR:_w,JSON:Ew,JSONRequest:Rw,JSONP:kw,LocalStorage:Tw,Color:function(e){function t(e){var t;return"object"==typeof e?"r"in e?(u=e.r,s=e.g,c=e.b):"v"in e&&function(e,t,n){if(e=(parseInt(e,10)||0)%360,t=parseInt(t,10)/100,n=parseInt(n,10)/100,t=Sw(0,ww(t,1)),n=Sw(0,ww(n,1)),0!==t){var r=e/60,o=n*t,i=o*(1-Math.abs(r%2-1)),a=n-o;switch(Math.floor(r)){case 0:u=o,s=i,c=0;break;case 1:u=i,s=o,c=0;break;case 2:u=0,s=o,c=i;break;case 3:u=0,s=i,c=o;break;case 4:u=i,s=0,c=o;break;case 5:u=o,s=0,c=i;break;default:u=s=c=0}u=Nw(255*(u+a)),s=Nw(255*(s+a)),c=Nw(255*(c+a))}else u=s=c=Nw(255*n)}(e.h,e.s,e.v):(t=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(u=parseInt(t[1],10),s=parseInt(t[2],10),c=parseInt(t[3],10)):(t=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(u=parseInt(t[1],16),s=parseInt(t[2],16),c=parseInt(t[3],16)):(t=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(u=parseInt(t[1]+t[1],16),s=parseInt(t[2]+t[2],16),c=parseInt(t[3]+t[3],16)),u=u<0?0:255<u?255:u,s=s<0?0:255<s?255:s,c=c<0?0:255<c?255:c,n}var n={},u=0,s=0,c=0;return e&&t(e),n.toRgb=function(){return{r:u,g:s,b:c}},n.toHsv=function(){return e=u,t=s,n=c,o=0,(i=ww(e/=255,ww(t/=255,n/=255)))===(a=Sw(e,Sw(t,n)))?{h:0,s:0,v:100*(o=i)}:(r=(a-i)/a,{h:Nw(60*((e===i?3:n===i?1:5)-(e===i?t-n:n===i?e-t:n-e)/((o=a)-i))),s:Nw(100*r),v:Nw(100*o)});var e,t,n,r,o,i,a},n.toHex=function(){function e(e){return 1<(e=parseInt(e,10).toString(16)).length?e:"0"+e}return"#"+e(u)+e(s)+e(c)},n.parse=t,n},ImageUploader:function(n){var e=rb(),r=sb(n,e);return{upload:function(e,t){return r.upload(e,(t=void 0===t||t)?ub(n):void 0)}}}},dom:{EventUtils:ci,Sizzle:ca,DomQuery:Ya,TreeWalker:Dr,TextSeeker:Au,DOMUtils:eu,ScriptLoader:ou,RangeUtils:Lf,Serializer:dv,StyleSheetLoader:Sr,ControlSelection:Sf,BookmarkManager:Hl,Selection:Fh,Event:ci.Event},html:{Styles:ao,Entities:Zo,Node:jd,Schema:oo,SaxParser:iv,DomParser:cv,Writer:nm,Serializer:rm},Env:xt,AddOnManager:fu,Annotator:zl,Formatter:mb,UndoManager:pb,EditorCommands:cx,WindowManager:Gv,NotificationManager:Ev,EditorObservable:Dx,Shortcuts:Ix,Editor:Vx,FocusManager:Fd,EditorManager:ow,DOM:eu.DOM,ScriptLoader:ou.ScriptLoader,PluginManager:Xv,ThemeManager:Yv,IconManager:Vv,Resource:hw,trim:Nt.trim,isArray:Nt.isArray,is:Nt.is,toArray:Nt.toArray,makeMap:Nt.makeMap,each:Nt.each,map:Nt.map,grep:Nt.grep,inArray:Nt.inArray,extend:Nt.extend,create:Nt.create,walk:Nt.walk,createNS:Nt.createNS,resolve:Nt.resolve,explode:Nt.explode,_addCacheSuffix:Nt._addCacheSuffix,isOpera:xt.opera,isWebKit:xt.webkit,isIE:xt.ie,isGecko:xt.gecko,isMac:xt.mac},Pw=Nt.extend(ow,Bw),Lw=Pw;window.tinymce=Lw,window.tinyMCE=Lw,function(e){if("object"==typeof module)try{module.exports=e}catch(e){}}(Pw)}(); \ No newline at end of file diff --git a/groups.io/webfonts/fa-sharp-light-300.ttf b/groups.io/webfonts/fa-sharp-light-300.ttf new file mode 100644 index 0000000000000000000000000000000000000000..37d920adcef8f4b061568022f17b9b4686d493c6 GIT binary patch literal 896932 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%0D15UfNWwnTLt9<>Cs(Z?-O9iwM0(XG)J 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�}haN7(VrxI<iL0P!ab6=F(w+kVr}r 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 rvKao@&s=k?dV4tE+sb8Q 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 SWNbL{{_k43$<)93U;iIxy9fyY literal 0 HcmV?d00001 diff --git a/groups.io/webfonts/fa-sharp-light-300.woff2 b/groups.io/webfonts/fa-sharp-light-300.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0e1fc63cff9764e145905cb39eee8608cbbe502a GIT binary patch literal 362836 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 z%;le-569-�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 J;l2 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 TURgYNKsY#Q;KqWwT=MzPfCdU3r+9rYcLW zC@PvN9a7}me`!}0S(5}Iqly_tRYg%%6$`-nQW*V+eI&j-3Eq2X)il||SLPKt50ICY zRY}#996;`!3O_yO77i(L0iYl&hw@5fd%B#|RJng&Atw<xB+$ne#AN41kP~mFEd9b# zk@CY&aO8ogX5SIuz<C`rWNHM;UL^*`suJ>7MdP9lmE3&JO4RoFo45t5TML<;g&Z=^ zm%DV*wtyY`o^uzSOmxhL5NcNYn7~_l#OUB>ZyKdS*-*e}EPIz%f)O-$xaP%9F%x-< zzYgEHrMM-Hq1`@Eev{O<#qnhBADrkl>e5$0NFU8g)IvG0l3x|U{qt`GoCoW@dA9Rr zc{BoUvZ84n){|b(l<?f#kwhSmn}w48BGo*v_pZN7l1V;H8VQV%p3X^%At3VrUbVR# zma03n2mOV9-pvOgqb7Du2#|gP>T)(9uHS$dq8tR+m{!QGo8{Y;5wi{5f*3|IeBZgH z8_MlvbN$lc!@0(7v+2*y-qy&$4TkgZSxkSjRyeI?pWJHcM!E;V&&x7&E32I@)Smq0 zo8LTDI`uFAa;h}dzM*A%@KW>6JZMQ?(hmXCj&q~JK-Vurkpzl(n^4#4ZYSULAq6p+ zDK{c^T$Z>Ov7cd|ruJWY>7|zzuOdgO$Keg$YOM6Q_iD}~x;HNDzwVn}azFeeRW+c; z;SIC``9Q=~b`3qkFPO%ZpuNMYJ8UhZ)EdMR&#{$Dp~i}1ffWpG66y^rP;Ny@h@xs; zk?3TBmM2siR#RMFe3~MSUD08(I+EupmA?|XHYLHl7Sk0fu&yU^R-z0|y!^#CcYk+m zQkCcO(W6tIuhM|_y2!i^66$2T`|pxe+1mTwf4wN{x%cDC#uB%e<18jI*tw;pw$Sny z$98D>rO-mJzN!FFq1J||FPpSoXI`dq3;yx=EM?<Ms^DIJ<w0r_7xk7B_P2R&oAccg zGcCK^?@qvU2~mV#S0BMb?#f9K?@$=qQkktjX1mpOms(Jlx62A!4w{zTyT|!pMEqKe zMY>*SPjvEpV&}RDEY*>91Say{lBT`9cR=Z2K@zcg7Gptb`?u?ag(fPX_I|HTuk^YN zDY7DBc~(rabI|hsc+0ax+8A0Q4-&rL;yAn*-CGW|fDuA8P<Fgz`K|;MCdzU;<Q%^4 zPNyf}Ex~`}u|)TIx=lGS%2*eXkX9#3yr6+!9XTLn=&%Cu@S^%5sRdk%!<G#&>rl*V z&>H?r56AxUGp&ViO7bB0e9K^Z?<2`alJ(>x$w$(ESkRfi@cox&0cPd7B$;~&s(<m3 z&v*cy)LQUrZJimna{cCyzW?ysd1)?5=Hyv`*_Y1qvJMkP#eKSFn6lldE1*!|rjMt} zVkFrt8xg-~UlS0cV~ub{SO^5(po*6;l|U_1XsE=G7hxKd{gyJgXWTVW;nc?Z)D%EM zDfO#L9&%QtoS)X2F&(8sf=outzvxWIwm2`_cAYzpxY)?4lH@s_1IUV^><l}U28y(; z(-&0gu4EybEfl*@IJ+N~!qn9I#;K53)O@*O<sjcNm_A(uzeT6w(1g;%=MNw5OpDF# zUY|mtp=T5cW58I;N@}7?H$2Vdove1t9Eil!u!%9-G%{n`#%EF&k=j!0Mz$A)w&hu2 z%QB!uB1&7~-|{y=;0nOUB`fJt(oq<*Vtdo?w>N;<AjLjVh1T5XoCne#afum9L&Gur zlUZD6Lgm$seGU^5yqWQM+<q$r@y(NRcA0<D{+~p;q!;z#X`RVXmL!Vb&$G|@SXHz0 zwf;E@ZRwjuw3cT`%BDhJInHbJc0b7`ZeY7#69cGwDE6aGOyiabqZX9G(Dsq+2`baI zm9O)Je|=?*%Jf85+yntK->3<PO%eWZGD*>70w2Q}feZRqIsd9Ia3LdPe^tOdphHqs zu4G69j)h;%q~D;ycu47R9Pp(>X_{?SltTzwb_VQL9Qk=lxGxrY@PYKLa3uYCcwE!U zru?)WnD1^r^Gx&Iq9dmN%=!L{wBrHT#ZL)85dMIgf6^-X&qPCBgMQc__)pmVIgho= zYyEFO?WM443dbeQ<k0)x@2hrU6z)kHIMC~RE6@|6f4ERzlYUSBC(C2+m9HzWzyp#- zXC8GA{hZfF+8<i#G4fEiVF(ygI@#+=N@B|#lXu)Ja^v#t-fxil<Y$+7LTNgD#Oq4R z@4`pxWh^{bgbUS9{weLFfq1%OCPG`lgb!Ec!V`*c;9iL;YIE?A4_D>M-59Umb`5EG zJQ!@Z2rsVL1bvHKw%!tw&z;^R*G1C*(1@%^>SVTGS;#`mBZ%%2>Cs0evP*9b2i=E1 z_`!!~9{%75ABLgyhBrtw-KRhI0H<TOC?)wP5iJ|0fjmilR!|G}iNb?{Lf=Jgb+TO@ zX2SQv2FN(w^-8>4N96G}CtL{DhH!ugalJ9{wB|J3>1JK-l#0%2`242brlZkEo6Lc4 z(=TxT$)``%fH#6iE1gc??h)qHo0Reu?{b=az)q%-%VmT@yRG}uW-iyrG#(k9oxQiy zzl~GHG1{^n`zO1lla#LMLP+VF9Wbksa!!9se$tO(!BvO#1!v&#^ylG7`c_RVi%dB2 zly1icj<F*0<<uwm>w>1FL~Fw>OL5zeq#jKJb|F9lRu|PyG7VLtmW-&%!hgYt7nz#@ zePs-=;io8Ck55A>O8D~cBS~rvSJwhV&O^g>jl<iVZyz>X*9gaKdYW-QbfjcRf9o6W zss}{=TR{3h=Bifr$FD=ErPpIp!))Hx`0*Mc3Y*~#S!jE#7xNs22G$v}3m{}QczaFZ z$4P2H4&FYZE9I3qGvM+O=U=Z%9Mb#i8abibkMm_sAfFGcTNBPri<irEH;x}JJ@2Rw zc{zZpYI2DFN=Km=jgR|2MD2|T5ldXNoyNvZzoQsOM~o|>ScK-i(Xt)J!jXZtZ>|rz zFY?TZsO{UWiix$Qc&Wq~r73G=-|E0oWcDt(7?Lbc-m?@h#X5hO!;ha6{psm0kZ{td z0EV*B4bsstIb8rcy(efajd=Euw;t3!#ANqN1F7V45N8As8R&`vq)C)3Bg19D>S+S% z0xH~af){w$iP67ckx%$ry-rvA6X>nzqX@;(M(4B*V_BBNHsXa%=+ij_Q;=wv2%c(K zY1uZ8611G)^x#LW*PvasYFq2+PjXmf!4LhkZ<H(&fd)jU0R#xKs?sa?9xIX5EZhj^ zJc~Y^nd#{^fOzisNImwz5fIe_BJ{+{)Cq4SoG5Kg-tu9)H|BKey)x%`y$;)u^Ads{ zn#WX(Mfz48qL9agjJgt^4k(HSz(i&2j<!#$7%I6O{GlpTaydBN6*4b!C914Ur5|Y$ zQphQ)Eh|%SdBohG4O?xD+pTaonaVv#K6%-I9zQKU$GXq8Qw%L+KcTMeMlD;TE)MF0 zt#T0VAd{pxMdX;|cQTa9rRnJHk)Kd^UoSrPa3aOG2ZHK0v0>HHKK}5exq(=Z9`^lV zv#JRT;m!Ns0bIjO3pvMx^x8h`wk5Lyg81U2Ln=wc&?|v=`Dg!|(m#LYW0c-;rhU8Z zER47Lm~a1`SmsE3`kssEHe{s=qCgqDpy2V&4~f>nRKc^zJd!+1cPRw!VvCqRl|7pv zT+Po1UR%G}EkL!}efp;jHr<NQ9R74IpNGP)<leq@IVC@L*_h+wcr~{kIH0&?w_B~k z`wTYyy432_T+Sh%uT=|Qcny_Pt=MjQn?h+gl@GtreSS)HJgho0HsBOopv#~iM-f<n z_6sOY##GCb?kG<h^br{u_3QD1O92>3XRgMlGqlK6$7>jc<LoZ>qi_R<b_dAL<2u%$ zGLZ(qhpd?W(MV_e90+JZglQH;YnIye`e+b$yQ4N0NuDgZ^2Y@8O|Wnn)90$y<JNsT z*#s7|xMF(4CqA)aEZI`s0mNRzQ5VNm9B%JY)~r;_>~uey?N8sHdx>|JlVrKWhlQb8 z$xqbi+f|7QG2o*HQHmu(N=1bj>0M)Ht!HzbbDncvO8F~Hk9n}oVJ{EUpq^e9>E&o# zG{?||_yfbQ^(>6i8bzsoNT^8_tSVBxrlO$-5&9$^mxuKE#mPg{Eh;Av{VrXpXRK?1 zD1^aoIfB{cd(0y6K!r}r>2T27&F@a6_c)`m8at^Pz!+0g>u{qnAkuXF0VVrJ(7KCU z#|$r|UOxG~X%pn}kdVnf9h=zblPZMSY|Mxu_8FMcc*@XMHAd`V#?l`!_Aq0xz{ZcH zzxv4hjLwYd=`V+w2mXvVKXT5~2GeJzKl1a_#Rc9**$Wv3kYzr#Dn-l`!@G;}Rw7&u z#jZJgK$KVV#NtG!k9cwoO~!8FkIx``Hp=%ozlJ6>TFy!+O~w;IbkNF&3fYC!MvzE9 zX?^TQd|9OojoV}cBd4l!oP>_fCQtZa^-leG!iSS7iG8+^Qvn}6c+TOfY_U`3R@^S} zVn$T?{>w^o+o~|0lCp%3aW7l`&-qAi!$%_8JKw@*8^3zb<4?z!1QW)Ljby(oiy=~K z%s|)NG>1aI$g(bc6hWt2UW?={C|s*2=>aD4Y&WZ<3x_3P^zT$hV>iHoFKtqZ)20dE zAE{*LU5Yx|F9vYZfX|TNf;lUvqkC2exEueZ!o_Sx6-tYg!*Dp<TP=^j@rU4)J0t1% z<kL3<-@noPR@@(Otnu^g8IN?*9D<D--bjdIqq!^ub{PA_j~VF#@#75;2<>zlfHt=p z2FFUb@li5N)HCeN_xV56Zynm<qv6}ax4|H|t#phIlhGM=MorRJ-A^B9{E6^w;oDHX zC04f{p3z|>Bjyzm>VTNoyhg<)!fF>sRL#Wi0B1+QBmVRa2)*mFfniI2{3D<EKV0eX z$z(F(V>(EZ0o_vg|M|p69+x|Oq{0NcryUYu%}<ufN6p9CYzN7r+=lNTEiWbhn!uA_ zJ0V$$_}sVPzu2=`>hKQq5PC)j^+`K*(ML9@iCrU#ghnjgCUC3w-V&YWyhOI_!)Wik ztJ${W-~$Kly6eCJ>^SW#pDmZ#dPF|bQ3B#b$;D3%aiPeL9<t6+v3B>)S!%W2p1Uqy z#&|itZm!*~s#aruE<&{S@r&l?8s|7a_xV?i%Y-xrZyI0LQ4<wV2OaVdp>dRNh`^Au zmSPs#p3kV;a{VGwM>eT!S%HfdHz7!ISSZBtLUJi)dTl=<UL**~nf{FrbIxBTQH)!{ z(d7OUJXxXigKr(b>iHYt-<b1u>TplzcrCaIM{Zr`vy{G_!-YpU=l7eImj7NZN!r|V zV-M}Z1Zq!@!}wCwq{BQ>h9${--!bFi6#H~PlSOt@ZixVhEB7MH1>my}@3j^J(nZZ- z3sBkG71k%H&us{v>(LHyYi{JipVb{A%fzV<zgh9*AaZeO+oWBIqz_3#nX)1+mqO6R zfwUxwOj9!};prl$gLHh3)6qUqiO4bqpi=C(IIz`fDZs(1#Fz^?6iT+kZi+$|qsed> zyUW&&hC_H{U6*?kx7d$@v>S7la-m`2Y0oOMLf><{5XCODJ&0V}#X~+!lOg8}62i23 zK{j;c0(|HKPpw8jvd`)6E>-PVxKHU|MB7Z0a^;1vfg$p)^GN^O;0V9y+7Jqv3SH^w z9}C~RDWT9?L;3aIBHkmCe8tg7OEHuwg4m!`B6*$-xec9=$PY4NQ~SeC!G(myKI^`z z*uQxcu}>QH=<S-F5nP9N&CN4|>5S>jaOUO=N1vN>3`b{7cMNB4PG=*tJ?icA^Irnz z=H|XQH#awTWNvP5?&i6<xjErQq}xrw;h&wKf8jAlcix&tsz)VET;S+aTfJrOH%!Z$ zo~7$gv}OKh<q$*jXkSq<Cd3;CoI~_$mypbEj_~d#r45G|(R~^Wc$)A*us@lkKi)9f zyY>x_Pq?=MlQA2>m<|S4Ilnp}QM<Nrf#brS!7ps=Zf}p+g9Iefj-uPWB+<;gXNnEH z$$TNISWbyum4(Tqvyv4c{$`wZ8oq&vzXHB(xmH9zCrgE`B|{tPMup?TU-X7P)Qo7$ z7D=V3nC~%_V&%GLm0Ye^%;l6DXHL#+Q9G|zD(!ZqqULS7HFI*Nat&2rBIc4nHy$vw z(ltu2l{Di4Ll2Ui$n9(<leItIy4Xsxo-HkJ;boK7#a3}D{YS`672{b&^&8-qh?0{p z3F{Q6>FyCs!Qb>s#4_xYWbS_MLR{HP@IJCXM&|g(j~n-jn~@1PBGUPqc5AIDg5Zp2 zhiWK=m0!pbCi3nVf+Ksf?KFX1O4FoscyK@&PyUdikSlP!zX>>P^~vbY(DAq_hqkOS z8ulST$EWX@283JS;_;v;t%Bt0efNB<1uotnAXl{(E2Yo!F6@Yc9AR(Eim@}h1k>eU zdT0@winHdwSP=L{UIt%B6N#`X0q`t*jBTyqE23}>TP}(zCmwHHdQFiQF{9Lrw0JK_ zFd8k=BJ2HQMOvhtRb^`FA+#f8*H9TQnfZo41bh&dogq-a#m-AsK>G9eR&*D75Iv5l z8*0R!!^#*=OeP_z>kwg{OqSw!lQ-rQk6I@;+`u|Q^U!Pb?uO!N7;B!=I7n%=%6YX) z>8-2%VMEY7bygD^s#loDnj#2_hUdS`+g$Wso6k%a${zR1g=y+mDi)<yrQ&{E5%tQ2 z>D$WQbm6w9Z338flYf`j5|HbZQ;h%i{1}&p|C8qv--I6MzJOJYi<bpeBrt$iI3DF` z3H$rm*`DE^Za<+e6_pzF3HOVy^-1^NByP@n)74_ORw?JzY}JOm_vhJSb=u2J<-x9I z)qJ^9gHKHYP1?QCN!?%5U-NpIAGZz^v_5#(FY|JpU++O*D;%(n!yJ%3F>ItF6HOu1 z@?76&`97u=b1j#&7&#wbv<=t<obYsKcNez#kN@tya98@#_rl{%>icMdCi6rlV@NvR zRKV7wEqd0t<Ta0>x5Nb`zb5oiOUbq<PC3U#fIQF(j_V3~+9^93MYKeuuR@UzvdDpw zg{T&VmO55h1HCMjyVsxR2;0Nq;p^&#p7vor<PYDm_qv5z%_b2xsW%q*kS{dq@ZaoO zZQ<p7$a$KEk6nN+!)VN%f>BF%%4J7yB~@Dw!#N+@s4pxWc*TwR+WdUc<lHRI&#!$n z4lFFx>3EF0zf$bBs3%}1@QZZgu45?aS6HI%QcPUO7N$V3xJmY@E31nH57BKK!q<Yf zbzZA&I-+w<`uon@8CVsdaSb&<_%XGC-Sf|uOMrV&?_p>JwDsLcW)$Y~rC(NaU-?Q- ztpq{k0n>`7r(?@}^H(_kN@=#cbSjEYt@U~ZlKQ4G-JY|v(@u2W9j=9zXj38bU$ww0 z9F+OELKr7HecL4hz=aY)ilzYmaG&k5QAiRhKgA<JaFt1h`+d^DUP`z3@d$wyu1OtH z<nZOyhw}M)foop~orC8_t{``XEo#t2R+Or6g=CFVO{&XvMkXZ?6?rKAXBbU%L{^|$ zBU3dBEPd6C!cbHanU;(QG61d!veEP>X$D7)!c8h7vuefLM6_FZ%;p68tS!GPJDZ|d zBXK5&g?7PS+H9Of$*e+@QNq#m4Ux^}-o>eHjZEwypHzw3_qv<zMlPz@2M$YjiIe9Z z=GaT)f}mg6+LTEH4@V26Kx8kdxsQygm->T7xl}cDjERvcRJe!nRG-&e%&}YJ{V4%Y z@k$|M5CL?fS}GecXnIzbWjU*B5Z}lT@Bj&*)u<OrP%#+$mqgb^8E~UmZ&Y#_fmjyJ z1LUb?DL9j>H0s3$23gegf~Hq;6(|+zjn)hOPFE>6`R`?Pod|-Wl*{Ep)nR~(0v80s zh9i_70oxD+E)+2^r&=hNODe$v(G6qiOt<M34Mj1EO|N@q={NG4T99N#g-q7W<D8K* zGIh?24J?bQn$?U#eqpL*mr8bPY9U|9s99B&B-|)+Ue6dgBZu>5HUp|6O9f5MFHyRL z;Gv{k&1~)pLKgc(xb4T_8>akz(in%;_3_JervL9qXZqW90|-2(Gvj^4FJ6IRj9+Cq zM*81xG92UGh5@;{NK|iQs(}{Jk~AZ5SkEuPPe6R=2$f%;F~>K-piTxvVblW_y9|?# zdZuQjob~9GMv`{fZ5E5QpuyqC`y7V+%VapD+e7l@y-%cH`2?V<-alv6y5%x7s@Jet z2KuWB!@o?57#m;y#3w$n%?r7*K|ibnpABXn?5uhsJq#qwdRX8}!5-~eS5)8iA9B39 zc9UMaoyj%IlW`dFzH;EeEgj;2l+s%c98mh%;e-p-&})0~(9_X;kwH(%GLG}>#Pl$c zBx<CGH$m`e850r9a+GYst;ow(*ln+Uc;MY0eBXoRLvQ>GImKeJxcsIUJY`fA&ObJ~ zIk)lgZnxX_zwa%_IeqAxzT{nc=9~VLj(u`k9cwB{ewAdk#k4Qi{C1C#eBexGobR^B zVI+>HmL8jY{f86$%q!5X*Y(*(!_Yn=Hh53|d%v#i@?dYmy(^Oyz`Oo==ErcR(U{fh zjTwAn&vj*QHU`N(-VlGcSS%Kw#fLmmEEbDT{B0fEn98d}aZD;~ju<S30E9t=4iX;K z8rny%?gP5D)h?w2o?fLKwo^`ND35INbO)8q+Va7adJu})1zAenu{aUSN<)bxh-E0| zMR62wvlbt>Gz*KgRjHmt2YOBvh(??eA}Bsi5^tte;mX@*PKAC`xIg4|vYSw)+xeDX z>{NP!C^EiddJwX(GYY)B@T#DKU7U>QNSiQ)A(pAQ0KC1cFPJpch6IGKeGgK)49=XO zV+cVXL4VU}fG1)3z-xxJV0X#9HUi>nI#F2BEiKdrlZnsf`3wT(Oc4@<ZwM%6Ad}4+ zG|yOmYw^J0c!^hA8wXAwUmI5M?ANR1=@YP6mxRhnCcFHlK{j))3T=|F!2R5Lp2%`l z(_T{r;5?=Wrdj~}GxW2~MLJu5rrNov-mp`-TT|{zzxEDAeJ4y8uKmqNQH^>fa}u4i zP2oE6<1HnQ#ewos0Om-7-jy4Qj<%mh%!p)&Jd;t|XZ9d@_M2nleHad2^G55kH~q5B zhGBqVxXG0(iF@<6nMS_Unk|)Zy*7XF;>CmWwK^8IwqAZPdf2)#eFkh=^-IJ4=0>=) z*$+2%s?>&(57C9nrdTwxrm1GKW)+}nW;3d3W(`GR8HY8;O~=U=3R%Z#j@K$>^>{UU z-~E|fMt^Ol(0y$NkFb#);mm6dTzp2$<TCdcG6>0tUTCIv<kP;0PN6#xf~9?keNjTU zF2zf}iF@2k`Ti#LcBTQb*r6%i1nuFk*s>QE5}GbaP!XOCETJ2WIhf{DE6lcGsxoDo z@SRAO7hAJoI6DP;v(;+q>+AnhnZj)|Y)#cQ`>kOL{uoN7_PNI&ANZvb2<Ohf`qk&p z3A}aq@b%XpKHP%iCmwp}#Bl&_T9!$b8!iZnPA$t+9gLlGvV6`vB#MVhrCW4GxNw6) zP0KP(%c2LrG*v27*QMps)R)$qE`Zxy-)vZxWi_6hY19GgjhQDALLw6Ikc14ap(C95 zP<}tzyDD<+33iT!5RvTk6NWOeNuPl#z_3l>((n&cWIy)eP$uJgZ$7$iL$QhaM9X0M zuh(?hqHMO)@6Y$#>2ldLWenL|KS>T8m~jhsW1utrIyU=x)@ZnEGynFP<n1&M?HY4T zTiLj-SZwRe__gk;+i0-#KO1(zojGtIN&2}gVA(Xw<!QG!-|u&>)0sYSW*N0)y>>d8 zsv;z#wn#}vf=54t&QbKAKq}J+^GNNW_z38PE_prD11qLTmg1oEf@o4uct6~-A=m{< zxgl7VU?`esh=xc;|EJRswW1~pR4^#D|8zxkHM{yzt}id^Dq|{Vswyw)Z7ACF*7FRP z0@8&Ign0y}O!TrM7xz!<1nH}h*+R+s$9pop$(!4euEfttFLcWhv@0W~3bG(9^Mjv< z_>WGIJpP}b2&f#BKcp1;vKN~e0!pq3g0Ql^{YN2^_?S0L_vX<6VnCh0w3LL*4?xA5 zA9D@D*ozqXS{dw|p!o&12O4jC>ZwU!=Q!yXDTS49jdXu|dvP2E-{1eppbuSWttp#4 z7MW0HC1cw(=SMhp7)X&BDl74^oEF!-NRzEhhSdQDRFiRg+Lul^-}Ywxu4w=GfZq_G z-XbHO$6x686?MqZne^NKiqM_roZ~`&fvpI%^MFQ1j<Azy)@D79wcR%Mr}+H7h&x<W z9U{m?v+{s#O$1H14HE;#rfLGllyX&JM3712`2y68f=CpB5>r%&w6E>_0V-obDP|2_ zQYA?iFi4Up30N}H_u(ahP%49<l(L2)Ya&RJ03ZrdCFTP}E&v9Qd3UvsIY+&U4s8J> z`N)+*Mr)JylP#{NgW}|^;OtLOJ{?RMURg1qQNv);;?~wOplk*PB6y%r*^-tkSFCB6 zo_2|4d5yF+d2<$B(5`CCXY1E)0NKA+W#m9<g#M=5-q+Y&;dt3-#f*5+Lf6e>K=<D` zT-GS10%APlmvxC!`N(PDltZ-c?3XVnuK-lzt)oSKPU=XFF~4&F1v>v`^5tW2ApLCm zAe&(`Z2A>S{}sp7qF{*-UBi#~_tXRY3hDMo0_}`CXYYl%I5(Jxwj@ag6TQuC`PgNQ zvB$la;SG5MW8Y-#PZ|5>+aITJZ}6=f&KXQUf9AdE@4xqhj6FWoneo6^^^V7B@U0up z>&!Tp{^EPzi`F~6|C$AKL>q$0si=Vo<^If^@ad;ST;faq$>5?lHH_Ub8DG4Qvwzc> zaqfn11?h+A<L6(1_Iuw8Z>d&Ar(!szmCv<zU*$`u!SvzdtYt9${0-j<=;P<EfA4!A z3IauO`~{g_CSGM`Cg==$IeOC8Hl2R8I~B#9QCw!i4d{aDL4B23?15Wxi~9XeNR7lE z;>%<dt|IdN50NKHAHYpM*Ru;I4&$Ybco=fNXl|~dm9(ia+yHgo5PnB&hzeK#W4@i& zvcVNAT*3W?Q&;jKrmhM8mFY?a9M{g3Hq<q#A)U@$88=0bNy|CRX&VJ&wgjU!Oh9RH zgsNt(5l|XT@dur<Mi9PirNuB@ES>5v;M3)W)1_!(Au6p+i%_XdmyRAfbTrmrhDQz` zK2l-==)lsgH<+?|>s_Tfl&useu#Ki_rRmtzFDO${T#!=1t|j~^-7uGAd=ijUR0hX> zQ^2ThAj_L~`&QemcBZ4y_bb(`AP7RXTJilbn(kCh`z~;L`{#Mrch~3U>UGmJ&3b)q zZhf;iUw@nj0e`$c-`kX_#`XJ=V!5Rf0CRYwC`*!D<PC=bluE9pbl`M0d)ogqC|8;} zl4AH0xLTX)@!^p7rfOBp$Fs#Bk}S`r9weW9m*`-=UIqz@5MGD0XVC92HJ=&h{JOwk z^%7{z@AS32(oMfY^~29nW7!*3XjgAn5jA(F&DRvIksaj@=aw`TXN@N|IVt$_cwHCb z_r)D+<WN{UV&Zn*e+Jy$IaXx>e;uYZ6Nb}eQEBjQmp2rtd|QvXt(MDr?dK{qJ8F5h ze2G%E($1iXv@7Zst}|L1Pcs_<Q6A$qVzK8hgziEZgni^8#H!`l6l8HPgqL3C|GE3_ z?=}Dc0l;l(ay#6`|Aq|h5$$t9{)WQ@_}zE&+XUgZk@dO8(&=UeU50MuMcKx3jmfsE ziT`M9;x(WPS(?&v&dJRnTAXWslekwsFg-gU3^yVH8w_3d2!Lx}Y1qfNS0u`%KqLVj zP^lx5L2<e&5>Atj->mP~E7e(DJyT+8RU`=&xTKtG3~0%xydu&2(&@daHlg%sJLN<S zBs!p%h}e<p&5A_tEG@?;AU+9f^D>j;v$G)GQjzGgEOz9^K|1iK=_IA@HF<=i#%!R& z(d|Ja{<5fi$6t)8O6aSBC&2=e72;(h64p_kL}*i|e8=`8U*Q$Btb;jul0q9GkDZ=3 zEIED_K^g>XKm3t*2K=q;lq602QiUdTO`=b-gi4i)6m@57ixNF+vt&BGvk*mF6-lZj zRN^ApUX!>~kphu)yT848kBl#LKFu$kX;uV(g^1N@N=xe^8BnHDPQ)s%ilir&%F~M? z8PGS(M=LYUL*1_2sfvUWvHHjemsZwA@|=&;3K0XzO}~CjwBaSAU33Ty(98VWc=Abv zB!5$F;u?e!kOK+vBq{hh?g5BN%?}%;kMNHbDoCG@NhmEz3yp%eQAX_~K%z}vtR$|X z;C^9=N{L7k%2XWm&qx(2`TO?j@$AON4XeHXS}>zrs>IaiFSG#^=1Ubi9S52yr%!LP zL6Y#!u(d4HgouemX~R9gww_z-x-=UDDpgiNSo*G18N8{p+~D=6@r%un(s)`mzPREV zL(cb&VkY^VDd`AzF7i{>n+$(S_ln&&zf?-;N_;H@9_xFd`aGM9k<z##VixGH-oSEQ z{B-B4kZAwY6MmQ!-G$1fkva(?>Lu3Oq6cc3ND=u;>bZ>1(JRvVa)92Yh>hOGUsRnw zpMA9h>UF(1_PV_TQ9dWB_SDqeTx+VJiB=&xaAm=D=A3rHyOb6{OW~$O?9ht-Xhbp} zUUFG}c04K@Ix$1m&Ssnrh@~11Clj9(!w!KJ>YEqTWAwVE=)ltAmw>c8E-W?v^pZN9 z;+ucuKY>M}hvByM-+Y(RtG?u9wfSoD@}+F#LLeH>zP**)9YK*!t7)40-fs`DCTxSt z-=xPn<iqHCY1A@33u{l@15LjZJ&N9ne%hxY6B9OvTlD4V6ipx<VEk<!o21<LRT)<~ z8~G3{ZTh4XZ425zAY-RF4xU~<QfHbjR+~naYIRPi>I&6AnOF-HwRtSavYCH~e<r9} z+)H{5KB=gtsVX2z8j*>tNm7W=_!@vrh6(}(j73qB0Ys5zG63TS)bE}>-BQGccOYCq z+u$vbYVeVivzhd}`;ESF9a`(Oq%_K8_1nY8-ByaCfv#m#q9_?n2a~~i{ZOl9*@c`a zV2rUW$^<}?as}JsUs)cb{%7A1J%QeZK6-5DHUWh2ib=gxZ3)2>L((N~;w6SK4fl{& z@6t!jVgB>Pi`-+Ugntn229-p~q*M~jgO*?}%9d3qXqse;^jtwxB`IeW;7_4oS+b;Q zg#i_9NmK2DWyy=CU>!6CiBeM%CAuqb{r?1$Qb`m{Dq9DsB-;LZGQ%pIGeu|8Hk352 zP_Qi75zTXde%@7El;}ZArluf@CN<AL@b;s7ZQV*kqDhE2#`o5F`{8{vjrQ%Cj-QA2 z_G)-B&LKTk53itUw23aEhtR9hyU<6_XVB-+573_>BnlS_T;Y=>=m%c>CC~%{&IJ8H zb}qG`zXbQD?!|r-*ad}|i`@x{9(if0g;WsTNw?|ajCq+j@zPlhsR>b6AAYR`^r}Qe zu+Pl3;tMOn0Kn8ZP1>mF)!iU+GODpy`yyR(Q{nd@M?n+?41`c!0mzs|jXA|a1`8sQ zRf{<}i&7|4Q}yC4$)Y6m*Xj`N-A^KUMC^et?NN6s?6jchvTju)x@@Q#=hHKtLe9zs zv)@$dfr?^@4N3LPFRPxZ(gPJ@Ne$^**34N_$sQnJAhM+^usl8ABa;_fV@?qs^UN$L z1|<Z8C<<WZR#jOR1)M1q9i~w$$DG_p*8)*eHTj;3Ny{gX{Q*J6v?`|(>ybA<{i<7n zRwtZto!KB~<qDmdY0fpxAUe^iU9llqq;i0&rl(4u_f)YyZcqA)R&KIzrZ|iM!2~^; zD$C+=neXivP42%>r5%%`yxu0*4Z#GP(VzTNih8gqKIpy>lAG7^8<||4WeWgKz3u=M zvQ8tHQ3N@oh{S7sG>A$@7L>_D@0n!l-;nded|4&A5@$r$3FD<4QOo&dLjqBk<gA3T zWJ;1QV$oRsKac#u&)8_TcfY#SZD<=kir#~M5`7Nsp})QgbxA^%5@J;$%zKJq2Rr;G z`03f+*|EDzoF>-NVWQdW2jTud@Bhfof@@^S56OFyQE@Kdfb$)80K9+~^qoy`?0(_I z6107_1H9oK2FcmgRmaTRhmYKT`;o(T-gH)1&wdZ8(c+;)i&4$Ux@+qvPp+@IS>sY8 zdO%Zna_V{eV(+l)s_?8J{p>L$FMfZ!ZTt`=_uc;ule#4n&=<g9D_5je&S92HWYH;L zu2-(;Fb&2qH@AhwOUp6F@$w}RZ_Uj?`jyyq0bDmWWDu&ew5ATo##<9^ABnE(**7Nz zN?x1B`-$rM`Qt}4@NyOiqTU0}E6LPQAZxDX95!2YoLnobh_-w3J7>N%YM5b*bNkl; zu{6I-?9n*79!TMwno6A9cEs9~sS7Z|D~+Q;W}8+4rG2vndf}WLRg#quniP<_+d-Z- zqf9k1mrvaLw5(`3nK;+umzY<)7N*Hj646i@|L$JhG2<3$X$2(M_Nx`#q*ydA<%G8H zocX>jVrd^)ra@kA_a$u^=32JeGZveW%v!j`dK7P^<;B>SrirU#8;vxZ*g81JmhWSy zzg{c2OZ1R-l=N50-!ADQ`AM{+tbHwdw$#*Gw)6*m&|%CvggVl(&Gjx_)k5rx{FU&8 zg?1Q)aT~5<{!$n}tX1J)kzax?svN<HgEBo#A&+W8Gs{qct#tXd<p~8mpruO_e_)l% z7BxfeAM7Bau(bo*ec5X_Yqhz1jpcrnNwL`Isa^;~;GUdKnEL1ad(W4JBowI=|8|^a zq)gWuDxXjijzoHL7xt|rdHPMX!z4x){pc`~rYQz&sWEUN8fN?gl3G(c^8lMOIZM@% z{nwBv`m&B!f95z7giA60pVB{MR~6ajyBJ%XN5Yt%1)=_Be?T`rNu8N=^(<@g^a1*w zdAxvSp?cBYl)l~*k6&(0?0NFgMW}$27(3?BLncM7#-exRNw70!OTK_PSdGs37=<JF zaodz`A0zf|Q@YJWo27iqguL2nA9?&_`E7Gix4nMU-f$yi_VM{?NcIZA5tfHM$!3`? z5mqvn?a(tC9PrFqJtM%k()fW81SYQIbZ<5v7*HDQQBJS2cj)n33g!xUW@<Jn^QO{h zg?XO=DmE8<V-wh>IiCkCR+u<5<%y#Tjt`{I`1~c-XY_(Zw~07KS^t%d^IOyY$pzJW z16$6h3%!5re(cp827~<*eMT>egi^_)tnW6qrsb0hYG#?e!BZE0^s(+gz8WDNq4XNl zdL&*SCnn$PBZiE$O9pn$-rODy3FB~SfV2jr25!_9=qM^{J$N-6NTw2FER1CtILRCa z5O6w&IdD1;d^Dna9E$A1!y!!esQz0&b;I>Ad{})B^I&;JpAuN`jpIo=5GK@jbiPan zc`OE#+uuoO!bic*geS?>$DlRR?(|b{;A39LB82F&?Xyt~+K~1{!LN!`vHZ>$Wmb3X zu#uI96-I*TDg!)rrf0d97v(o);#E&U$TB<p#2=6(QNm*D<9!gMt%2i0GfcPP9!=<; zXlD=LG@&~%+JQkmBIn#groG`q`mUkx>W%?NSgXYt4?|7`6$$mLk@6%l?T!!6Buxg6 zacG%6g*P03zNg9nWoHUt%E^zE{rLt*kx*^%=Qxd%7n;OxoYam{$Q%~-(7Upv)NUU_ zF>Jh224fEMb_ICej$!}ytRH`@(P$nzcq?4z-vZov@KDp!Gv30&rgxkS*D^Z%#Bucz z;kf#^t6uoTahP-u_3Ub=+b!qqmFv3c{<vQ+KW+h7g+c-IA;*P6Aty<uuEPzAR+gmT z2JHq-(}p*oGUo6;^h)%2v<Bzr?LEEIx$H!adUGiX`tfvKoI7N8F8xQBZk7Jx<CtB+ ze_B?ApdYM2)DQYWlrrz)7f*LO4>$LZ!E{}O9rFmNL{&*s?yLtKa}{jY)zw^wOJSGt zN}yeLFTYE?OgnM?I4_Hb?EmfM<LHZDQgUnVh0@E8t+kRjl!`5AS>{r1hfDU-Cv!#8 z$~fOsi(W<#qSv5NpVTz#Bj^k0TL?)q)kwG&M?~q4S5K$=!iBhp9iN>e0%>#Xg1xYm z5fXb`!*&|5Rue)Ird+ktRv=ixKHj3y2E=ivn;X@kn?xqEzM9cGGTKB1CF{4t925L@ z3`gCm1P&#UjyGsFd##V_{?Eit3(E(IfU!W<u6)dxZ5fSw=6?B#=NtBboXa~*)1;zE zZ*eqDl5=^6VI@x_k>>J5$ek((Ia|N-Mbhi>_#P(y>{c=D8in1w+J96*f2ShM-~!RM zE*>hhOlsdZiKiUhkV!u8+(D%h$>$xW>k<fxSjbaJ5(+l4ud@kkfpdV%`~@fjLrNV4 zvkSGlQ^u=JwBSO*tNcMwr`|CC+HBN2AL0MWu}C|erKL`Xig@u*S=oUG6)wDOnG5v> zK%>53T5CH7;FGev{+sJg^yrs+^GKF;8Qw=L2d)gub+LCJp3;`{e^cFpu6&^?8TUYW zY_{ckke&ZBY@a>7Iy<lzWuLx3@A|T^`AgZBpxUcDp1Cxie<eMV7A+gZ3w!P!NYVQ# z&lS6qR}(3<a|D|qb3&_JB(@5{l<|TxX}@Pk$F!>8poEV`K@jlqc+v~4E)<LQW<nEM zp&~q?gCNkzJnwc8hE#Wx=$7Sqj^kqBdh)ns5lBR-1_=;;z*0>5n_v^35;q`G-1doO zZ-N#b(J;`Rd%~nFN6kE=CX~Wp<S<}ajO7Xdg&bp+1w?yOYY5NoQCWN|-`U^gPY8md z!j{=+)XTYCx!!1)Eki2S;c54Jgk{%laGL=zn>Spy{4z24-}x_nC4R#j=l^%cG#Ao8 z)y(5us5gzSESn|_H_f**N5g|f^o&=SN439r?E^R+=@IOg25w^8BEAWc6+71Q;e@=q z<xDZWkHG!&t(HV?ah4PQ+3HqR5rilB?*0yct0+I(EX3%Ww1>9(J}A$>wM=ra|1aU6 zn{W)WR3crYnf_^#EE-LyFPP@c|IWYh4e?jLH2=SW_|`qtuD=^CqB@#EsCNStO9jeJ zBR|oBrtE643AM3yQZT_Mr1=aSD?_Q=ZkNNrq(on;>svoAHSO12c;>#(eAX%zEeh6W zFVvf)1V<|^zf=Y&F9e1$)R}Q{>c`KJ`<}V*OyPe&OYrxxMeDN{V0va{Pz6QkI@C`q zaaaB92;m`(9<WVO<vx)Pi$mft%SFyeYFud^EFjH)Pyf2f_(|Ws%gA1T;joog&-~3@ zcKg+5l$>?=!u46>Il}b*0YKSo)>+_eN|9@`vo%SbV!Y4Fh9Rh>oD3o(goz;MN~!=8 z{$5QT-6KNgk(b`fAIX4t&q&oW<oE3m%vx=ZNRGF_DPtz@dyYireE;-M%E?N3dRdWk zB9MK-g28Z)mgb42M72I>>1Blm@6t*gb`;=SiD+s;pu3fTh+^rzGBS@pJ8nkzq1U5# zUH4iw!hr34v|tCt{ClFsC@26;tRl8b!G7F9U#c+XOsa<w@^Cu%vni>@;#?)M_}zao z6tWqpDi&;Whj?r{S&UCtkBo8FdCe|^$0SZxysocfl#4J@g${=%MiU63*Tk1ZF&FaH z-_SX9sKaMYFm_^we`q+|V@|s*0qfAA^q)Z3zhmkCP%f)Q&fA+&P^f9_AdJ~&4VdSx zaRQ16>G)&pHN3c;3*<<F;3@2+5xKU^k<$78cj;sJk-3LDzyIf4yIX%1C>H0lR3oAw z@(C9Ok!UnKUo28e>6^YNY1Nr~0Y-4|OjVPCKPEi<P;bmRUz(XIDN@GNG)gJeG&3V9 zrJ0!}&eMG}<C*>goIl{3UdBYIjrRH`d|l?1e7J3vz{D6L<5qzX#*6+YR!`HOn2|nw zvot1z9W)?M{7qm4Z#wf1bN*H9!wx}YH8m}HYxrN8lm4bO*J;gd*;a+{jGDIk<LBm{ zV{;7dapoPTdp*>FRc~Ef(|*L*H6+eWPtBchHLYn~2u)!Hw5Qs~9Y^+qg;oSL>_)EN zUI^C3O9TWAI%?v@*rBau=n~*@+8q~80T+}G#ER*Tg^dF4kw(&?bF^~ej0DT+02eOF zxH9Bu7A<%r!4XfQ%QP<tu~bIm&|z(#A+_Of;nriBxHFt_m@lXtAba!sgdX>d#<8DB znt)CiLwb!|U({!{J48tr15ua6JG5C{^zZoIp3wCU!nqQKZ@JSE=eu)dr$3N%yW6#O zY0!7dbA0soF$&#o!RWd}&6d3nO&KVUru+Rt=+kh6P4G=24*HAzGr?CT@Pa<s1V0&l z(_yQO{aR;_C(lC{_Ex^>b_RvlQr+0?{2F7c%=zXh;d?pg!Z%m;%-Va8!14U#BlEXz zplyc57H^ts2(<((xB?LZc*uE3(<iN%NPgb#&XN=H7lL;jyKw9Rz4PPew$tP!o`ww` z0%fU|ey=l}DCK1AM6#QHzEoCK|NGd5V;AaoE~WpuZOZWhLUA~7``pKWe%OKK<hi92 zy-r)aC5AcFLVbS!VUs(i0kL4Om?0nJJW3Yj)=VFxPgsj=0`xG2{QNsT!+Cb$LcL@# zy<B(B|N3b0^W$>if^$CoC~5XTg#mo#Ri44QaG_q-nNg~<^XdF}@$)PfF0k`@Q$;E* z<i7MmTIik%6|Mr3y_9UXZVLo{7dN0M)o??Q+LT1NiQh}Yh9C=+lUsh&kmR;5AWHH} zv^sq9>XJIJ<@rMn*0%CwTfoo{`VFEK%caKkuRXEwj3D1y%vTfv>ocA7*ROOPtlm>q zg75fDpF2+4D#|8aD)^F8_=((>im6z5qavNda6?vCYE_5XYVl8t`!bYeiz%8esQL}3 zu4u;<p-L(*;=GYbi}zd>`$T;NuUiIUoeJ?C)z@&$pf~ttV1hn^xPP5SWFmP!$zuwk z;wSfKiF~P2es=YcEHCHGOCotz6ri|K)3TZBfoA>Ux7XwE$nwp_@&Qc}g<_cg-D{4z zha~ByQt>S>oApl&ycXk5hF+|hAaFf<Ny2Y$Y?N&W%$co~(g`fg89)>@EWh<g-UMMb zV_r-@WDC{&4d2b;smQ}45TYb=9;R}G1x^&&?FLcG?-!qb+F<%?0_6^F`7fJSXU>d9 zFdpyh(30%KB&aR+4}=HfX{WhgY&7PDxROv`ikniEYrBB%Lr)>pYK*5Qdrg1qP{~nT zpy5y;f;?@vB_Lr>$ckRW!X?P2RY)OB#!y8Z3uX!onzxMj?Be2V<2$k3;72W$XGhr> zxhU%+_cA~x&pt#PmsM4MM7bM~%T<&YDgBD$e1*~%8$oY1zxl*gdqG3qLILCmv?h2Z z{cx6oQyk<=QFL3r4Q_NpY2@%II*V?TKV-JWn6bA^5A$t5a&`oHC4fv9C^W??Tu(O# zhz?cbn|o_}>1a<c>c*vlDqjl{B^|t?QtT`cdg2M}tOlI5$zwCXacDTkZ|wUDMMCW< z)yS{O5d7RN+K(Nto~?UYG8I6FEGyG1=w=uXOAU7gI7-*ci6D`BLdjXGWAHU$6vm(e zi(0!lhxHCsMRpP^^_LKLB(gmj!yYddwYS;)-GH6R)s|i?@-%Vl@>3=^J@PBO5vL@F zQapZ4(}{&MfD7FH$Fek*t|75hG^|{8<SL3h47Vf2Q7dWjwhkrEAL7kT>b*|jz$0WY z6wQaB95Qrj322FO`6h%7WIzu2B$mCV=XEBru8XTy8Dvj#Xh8ng9aH+|2IudFkbo?F zo3IWEHBCnkz%x_g0P-AuKiB-GCxFmy9#9&5#E0_g;-ODomT7ZQ+SmRk<QTdMJxELX zy;*3QMqT=SR4Haiqc?qt-uRz0%D3dLI@*Wua@1>0^(K(DnK9#B<z-mtU{V(T2oA_{ zUY+j{l-|>DxtH%8!LIJ->ZDYho-US1U2X6<<_#5g*+M-cO|OboKJ~z<D1A}Ktk>{f zBVQ_FTrA~{a=jr4je1<#q}YK>Qgz<4j2dVep*SR7w24Ea!^4f@HDI3K0NeA&`gynK zZFTKtzpr29h8rNPzT5a%nKWK)yyGixGd`L5saH4NVT{WkGv58FZyKL9KA0NExYe|h zoG&&2%8y;$DL%n>e%o;OiQ>-A&JGOIuU63cudl$-_I0@=LoRn{=@<g&S>@rNeg>VS zNCsfgX9XNMPIZq!c-H=Y(`)vd9+b4emgV-VfZWif7`Rm|S=p>pubZ->$Y#CnWV2SO zXr=quNRr!ZmSfJXNn&*IEB}y&HFaZgu{D*;dF{o;4P6IG{JR>-Tj!RRjAU`qeVMzs zm>5e-gIu1};c41#t*PqK>1jifjOpp4s=C%{)2AuD{n)XbDCUnIyPZ;@RO)uZu+uG- z@dtXVAm&!rE{KiB;$ovAURYbriLly32xt9(7CM1Y?AVT}Vqkxv(Etb{)>k$1LzqBo z57&VCkv9qI5VJko#qk5c^V?q2BT?+Q2PQN?Oz(eHF2xBKMKNQPPn?YM^?_&C>+UHY z=8sOd+m-SR(^-)(t-I6|#r}M=3-}#n2Y}B1dd?}^-GmF7!YrTVwOT$NRPE^InUb!{ z8QI-Ddt*OCvKihu;ucFrVP>w>nwsvkDwzeZ-fEPOBDsG0@SpPiFjdsDKm-}xt3YuL z=Zz+pKwpWV0N--$%z9)EgQ^2vtds*1bU1rdm^r}irTGhzG=i2~|8bPVM08-0^ojd; zqE=Hq0dQv|Cz2E52~Yl3ks&yR3?r53u!;9UUI!;aTt3q^1gMhB8EFlwijc4gKeFjc z1$IE%)8rhhrXYn-qy*eS#zV*DomwF^Q*t9)*Mbxx?2?jNf#iW=y{`Wf5Ez1NsvJxQ zjYyHCD%xw{Mi40c5-|rL`K@+|D`wpcuEh}m?A9!EmISFWzPzLX)F*hC-yfFL%#eer zD4fiP8Py8ezCrr80&5=UNu_n#uC*%3x&k3`_%xtcL;?!0P4JnrF>ZLwRJVraxQxYm zW2k;%Yiz;!qdRSNas9A2c>c^QOsl?j=M2#rm-7leapm9rl|C+Skp5cyv}xRA-#N$% z_DzQQbPT=gZs5^nE~5^jIgz*rQO#_qHbA6QiCXhr!CJ#sZ)=i(K2&eBx&heXizIZs z$0wW*#si*=I_M9QZB+v%bX)A|;x{stKR->R4be!3!)@#}$@Q@LXd9}XFSkxR1!u#i z-toju3jVLcmHHoXEb0sOwYMGY=?Q%QP}>J2kEzNL)bCVKrYCui0B9K6$dcSRv;`8y ztVIbOb;r0cS10PC3gm%`5xEP`WrxyFK4KUT>G~6NOkqF$mC+Xt|Nl4KoPMif@JJw- zTv_ls7=_yf9n(h){UO76)lXBJZYQG=H2&y|Z@4-A6DzfVINNwXR_|E-a!U@`hsG0c zpc1--9;G%FHx|aiCP0j)ANv#+FlM>n<5dGET!^FiN}Tb2xazjKP2Bajyps@B`9Sw| zls-$u1-M>P6h+y9j<IIVHh4ZB@o+q4THeHtKJx??M0wQZQXg&*$x)0CY_wSdx>a~h z>YeV=H4>U6mdnO&v?G3Bqz1AVdBpjSY=G@&$cJnD$|AP^rQB98?u{r@mc>cs`(r;w zO7}%cHxjd@=-Be7VgpbFZ~LRks@vQ5+}Y8y<h4%#mX%kH(p_7o=*U{I={u=8DCR_2 zw-Sw&#hA=XYJ5wWB8gnwNJUi_qd>OSZ2K}X%Q3**<RUUp%opd6%bmLcP-?b@GH9kX zRVlr-?3Z{^taz{_?=_a}$)Q`@OZz0=2-3f%FW=7v`s$8U7X_iPE>`Z%Em|wU2O5j{ znHqpqd7r6StO5r7=V<yYI2lI?(4n7r?AC)ANY#0mxI<iE@nHOZi6OQ!MS}5#MxD{a z?NMO7=PMvv;5CkHYlAyh7R(EQPT7kYKyyU=%Z|VyTAne`rcl~fH!+iKzx|l-MwXj) zGWm=|3*|<k07@O8<q4U@5T;rHbp`VI+AWQWJ5#HIUiXDeF(b76mS7Y!f?wC6R-bLx z92jLAR4r*@)`CKzAy{++;~(xA#?B8h-k=t#<?~<^3s9}ikdm|ZM;YUN?=v!gwC0qA z*?J91d4wc{uEqEYp7Hqw+C!%Gpx?v&U_RJj3w`IJ0s^K0$;{X)f@Uvg3m0i*aY=Iv z%pp=3GeUmOF9^H_V*R%Ii}hihs0)L^^#CA=;&n6A<cog2>%3SH#HJ)+xERjPHf}Bk zqWHcWgj~)8!AVd4^7;B%2qn$5CH*+1dQ;!fJ>AS4uT*w}U&p-T$1nbaUYlFnSlevp zFa|?lY}!4zAc{X|EX>V$l6dscKm3XQ+uSc<EuHf#X+tSWE?khvd^xCupIDGdkfsU{ z2%;4}h5?jWdJ|>u+c(G3t5jS3evpWxJxC`?<4<`4ZdTKYcKMlB&VvZs6VmN$*b-ra z#h2z7$WzT>UZ@%{f=9Z+t9X+#-nMmIz8=85a*nw0HJ6;blDz9gIym`GpUEE$?8?Er zTCph}ST})$XV#jIrZgxfD;%Tke9<(yO-0Yxy!l;5S#R<6>#dfUyM`=@|A&$P{Ul?o z`ok=+O3oh&s6L8A^}`%JiS9s;qUWMX4e`rDZTeSmc$vuVC1R|T@)I<LBuGuwzJOeH z6L^5{#`2-$Rudb)n(aT>x3_5&@F~4$!IdSCWWNpv{e&GE#uj>h4zdDTlcz#_yPxQ? z?s$)cp&Anhk&C7<zMOQEj7$<)XvV9^m9NtG0F$lij@<Au7H)U)mq61*vBZ*u1g5KN z*dPprH9r7%c@TNns411J&c<Vm^t`l;7#Sdb8V&jN90@p1c90JwN027D&g1Rvm1+eC zz0D*!5cGsfb>&G_eZVa+VcMTwSCsYX?;#XRJoU0yLG74=5)|J6@<M{qy#8~>_;P&g zrN@sWLeTN!FFiIc`CWuk)Gnr%rekCwWTEl&(zM9<l;bS@xbqFV^-RR&{GDHqi`<*I zcXOZQzQBE%`$_Jb+^=%K$#Go|kIS)CNJUwcQ|}%E!Z}JR3!H}{`%0i8!RgrbDG{gW zoi<UePuHiMU<(p`pd%Q%@*+{bVjFg=GkG(pihz=s=!_O69hd$7;N1199M9-11uPDn zKbLVbs7=B}ubNSu9E8GRjOTlCNDPi0^2ULakha??uy&ih!gD3TFm&x{*VA;v5G6)~ zfJPJ{8r}M)ctQ~y9<&|vxTC46_JD<Pqk*y2zK1j#j5QkMp7!`bO*aRxAu7ksH@zj^ zTpRz7d+z6)KOFTfw%pwTuOX<%O*dcGR8?aq`Wq?+IL7nG0I+4@B`mmsB4bGtu!LnL zaMw*uGcCIjMGf1!ecsKi@A<Hir2I45Z(j_rY-U-zon_6b+7BoV`s#G-MmLiU@V$P< zr`7w?G-&qTRV@7Q#P@K%{G8EbWBhJT&`wz$bE)3y*oJAU-Os(;ZVdcNs>vX)k(mm` z(j9LBNXp}CjJ6Wwi>`oO0M~kN1P3{{I%$xAam6X#moTAERG>|w?bI{60e&6)iC!3L z8jp0@YP8#(sPSwf;cgd8NozLU-JQ-_<GxYf(u<;AuPBOc6m^TD=+Sm$$~xjTEev~M z+-ZNO-HF53PI}N;-oqGU>eHT}c4W%%_P3RjahAp36h+bdv-neQ_amE8^7N=O9#4WL zs)t;1EzjqrGPNv$^9f8vTTlv6$M%F46rP-Zcu<K10+y3<^+wdvsa+)pfhiCocG$4f zoson2{ANjjvpWQz9bCKD_io&XN0PAoP_q485*H26%=R?G7&~0t2sWFe`@o8<8jBnA zd2r8OsjhL9I&FzM_551i2^xN{@Kv!C&_OMDbtS63mLy}_*GHDXfaj6syJ9wLx=sf- z-5p;m$Gi0rY1y_#=A3NXt$E8HG*6K1lRB6xS@PcNS}U6HA`I9|Ucz8bKA7}+!=H18 zy<YO>T+c2!A0g8xgioFP5W3O5PMJBiXCkjFYaMQ*t=x!M<kP}e;(@XWK0!M4jDRMv zEs~t?(&ZS^*|cakAE<)y)pbKj|9)0p8}A+)$KBx_<25A4s%^K(QBC%Z9kjiD>9+M~ zd1e(mw-}M@qWB^q2-tPx?rL_barq?-pyhjLZG1=I`>pn{*GoP~pp?GmT`Bw~ptbQG zY18ix_TaXb=K)Rn9?J9Kjebc%<s^tg1yNq6VyOebM|dRmMDggg77Wx`t-a@|ni+0> zL$7E2sr-#CCm%z+MS_r6092N#v*&(X17h*0b)$86xDdid4v61S3`41k@R8(=P`Ghd zcryu1^F^YGE%hZkdF2x`%^<mxxVRY9Xmp#tsVJu3gw~gQ52f8#<Y1}DHskpoZ!!nR z=^DA?gNzCjIAN={p2RTdPOeo2J{)twVYY>26wRuDv<q<nM<>p1KYUGr=}Xbh>dZ*J znt(mV4h0iBUTaXP?)sn6`EPS0X|+4HqsXpKG*OncR@!Mhwm6sHD)O4{Q_sbcjWs1w zBux(j*Ok?`%D?qu<*l0RxIv(6k`gHzwk7O()Ymm$e5*VcZKvHyTN+kGjp!a$9J|wQ zB?cUkIU#ehNwr$1TCG#6*BaGp?UPYvS+dq@bt7AobP~oL+fmeJv)xFu#CIG?()1t+ z<bqe5q3dE%QT;eeqbSW{UsXixx-?PwLJpc#*Cfetf@ao=+Rdh_ICduvi7sh&)NQpi z*|HeNrDKV1f`?|xNr9xeZS(q_vU2?n8Mb~5&LFCDJ?=DjpPbxcAR-wVB4I!2==6d| z5lHo7lxbh1<v0M9*QQmOC;%M-elblCoC{s^%Q5vu!jno0&tKm}lgV2x`%R}#0h~JZ zCfj=JWP)xyu@l=oAW@4)`#0@)=ZXDMtceJC==L4kO5SxPVArKK3(3vy_BsQ}b$RQ$ z<Y4^U2!NMlTl#+(JJNO0mf2#@{Wkpz-Yr=TRkyib`<Wl;KU+8P^Xa4kxjmWMP0Uuj zo$%Yjj*tqwXe3)f7&}r?T<k!}ifa=m$~F<iXrD>AC<E~N?{d!OY*`R&Iej3N9YNR@ z1Y2pHWb=dD?FU3rmTWhlzsr8WexR{^|MvZ?t~-MpYN?h?44-ao@tMzAq)ufjrzb4( z-~QOhiMG8H)YH0)hqDUEn+2Zgp%e53eer*%|6OMz;edN1ci3_<V36T&v*dNN95{#& zGCDyo3;>?F?Zd;9y`r6$XRDxB2%5dVJ}oauoLN}cM(vy0*z>EIOLW?^+v9dF;Q^}R zW0z=^O2Y}ER?Vg|Z8z&hFB(FleXpUef<{yoke(nU$UZ=#i}u4cj40}&o|UC*m}p*( z0sv5G;T9Q!5KzxF1MK^Wg>U@d6uyrG)9fJ#0opt?8eISgMkOJv%ydx~#n2)kNO}U` z%K}1)jzCq32FNtr5}ww1K{sqsFho6*v5K8m$B}ha4~YeU^aPbKFAd#U+<|(~XmmBL zxmrY69t8jpxt<c+Hh^u%iswcE5R7CT_g0&l)@?MPhZst91YnU+S9RIxv>dErInzZ$ z5N$&jk?!b5xi~C2ZkxqAWWzg4`Mfty@k>1poZlw-GnJczrtJJ&Bv&Yybd6Vm+RLdY z!gfP1Qd&+*>{k23H1j9fq#lo(-EjCiFG5XFj!2*3?&eq7Rov;^eRr>ouU>`v>ea;| z(pQHMUS3&I?Q|3p*VDvu@L+>Hs!1ac`idido|q*=t}%s8?+)sbVcQ6~L?5w7c(OO= zAK4>wwk`<Ne|j_!gmv}^ZxjlmHUBdm68@1}+(8+Z{0z^nA)GDZlWbp(X!UT~a!-`K z7RxY@2)Un62ZEnZ^BrLuc7Y#Ka62gkCZjXzs!-E&mYd<McwC2Wi-lC90S#+JhWzOR zau`BN{BmJIh64@{4t{m<LJ#gQOsER993gH9Mp?~1sV#0i(68CpGcu?T4mi6%CYddA zOaUO-0S59B%SAejyNa1n!redoNlpIb`h&#{vAjbu!NQt~g2jy$0wd>K&gLds;qIAS z5#m(?wPV00y)n+Wq~ge{a@lKgZq;oj?;3bq<RYfH7?02{nszPd79#ByBK2DSnpAWL zonEtTs#Sa(X?}Y-se`QHyX;i%DON&Y@dS{TClqo@M6myfhw9|wPYQUxw|L?h@A_Eq zd<=b0<~>j5y(d^0s%@>Et*&NmEz`n~!E5=myz;Clr&rT0dFwT>jn9*-sVsg-@7K@X z_t>9aed_8{Qy&YSk9qeA!Sk`;`S>rucA8Wn)|-yaKaV5uhUIi5Q_T<hn#&n!Wx<H| zRR4*}f?^6CfVKmD!LKtBsk*q>6_~)<sK8=DyI8Ec!4jdATQvoI@iJN0Uj1@oLW%A3 z{^_rcI1_M^YQ|9cvi~Rjz1rVuC`gr#Vs^~M^H#?a`L3M$$MK*1hjox)b@9DjctdCL z?<`T!bfQTj5>!S1BVJWCU6lCY+ko$zXgyw#q$IKgtd}Q2<O#T$GJl*m-Xtom52Q17 zHlL|8SHF_V(v#{V8~2}m{G*RudHe&*0<m;Wc=7fJHA&=oRngymR8e)kxtlk^H|?Lt zS=N0rbJ1wz+`3}bwa~y+uzV!SN9+t)LGx;&$7BholMrnamc5Pd-rg>9T?cP*1odh9 z7xWvybFffhS-J{86C4xH^uzk&Y))8j^~P5(nn(Bcj*c-37T7MwkA8z2a_70ny)YGi zCkc6UlH{L3*N2EI6_vG0mlI%|fvrv!QZW;xCwl^wbn6^ujj8Pb)gTe1hmPYDb@U36 ztQ?o)e4!k%$Z-_#d7WNzEmK-0WK}XPH@8IPx*}Tn9nbjts%YhxpwZ}-(YK<qTgO<9 zX#HXJP!-nA_VX`lt_%MXE^dZUzv#pL|JMK6#i5`9UM)PYX%2HV4JC?_pl@)=<8jpM zp^D)0_PRagiRJ#zCzSVl)stYXCwts3_W-Ub>v%5Ix)Q&XBoUJxW)}bm)T)w&qr5k{ z(v+8+J&4bUN`5ifLAjYwY@VQ}HQ;3NEteR}f)P&sU46I9Q~JjQ7$PKf!Y)sP+C=(% z_HReeT5XX%{8C81a{uHj|MQ9G;86N3yV|33$>Auw%08touJJ`3>wH~KYa0I5t54`c z9{A+4d_?Bt;DGdv<j%Kz9)mR6?PK4p8~SMOAg>1$Rd+(GV%$9G00Zqpio~KTW-m5r zP<01yc~;z|i6oT^LEmw3*H8MtsQ{k=lDJ||PVKv}w)lT=Zt<J^Kb_p{EuJjkGmBsJ z1nj%K>_K1lJOO(i53lF-4~cSmm8|5qTvHcbvn8J=S5sMdM&ZvMzwg=lG3V-2SD*Si z_Fts-geTk_;WW8dvuXF=;qBbZxM$)C2!9Xmq$0;crI0zO$ea*4HtS{;eUzf@Uv|)> z>fzn+?)w8FE`j?tS9&K8Ac`1^B7mi$%tgpmWd$DNI7L=}?J?)XL#@c_16Me$2L_-3 zyq&y<)Bh~)(u-~lkAV)FqN<7p763Zq+zO#(8KE94drmPd%h-6(Ie~6imhs4*=Evfc z<HCc3{wvBfAmO^G3Eah+E{IQnJ!B+hBijinWl6OaH86(<3UX<v$X@tLkS)okN7#mL z6?nOOVnk=d9pWi5)&$#WR%20=XXkDx5n(g7_+6!;o^#pWbXd}Io=A@N8D1~>eydC@ zPnIp;mnsEGvb1vtdQE8U8LmE$ZX1&M*)dsG@~b$PydP$Ao$N$|+Y2Jy$wkiF<?eK^ z`2XPc>PEZsA{<d=$i*BD@vjo!2vsDo4I0T-;Z&nn@K}dz_=_>_RVzlFReous;mR6` z0$gL~{?N(joe!Oi?i=t1qxVQ_&5EP_p_7c>Ba6Sy0In$g3T2Zkg*V#3UH14UKKvX^ z{JUQliy!V8DJ4Vy;@3iZ=wIv^>1XN4wa&>#<I3Fb$er8+9Or_4PA0I83c+wfIuzK? z%r+!41tLKq__%N^YY0KyR1+!<@nAZsw~KzI?f<hJfV~ST*!jO1zM~s8YmHw6zR$XJ zX*uXJ--mrxUt?v-uGMURUbFqRFC2bhZJ*V(p*y}YZn2uNj;?nYyw)~!r@On`Wxfy4 zoXwg5zR$XB{~+6K8?I}#ce8_i_IqD@^6^&d@h89bdtFC2>|M6FWeI`>09#SBxx$ib zb7>R-cDk@m02yJV-m;Wn0z3x17Py)zv;nU8Rcg~bwP*EO?mniwN93cBs6(cMQ`<~~ zBtg>OLCSOJcm*ME&s0A?Jirz=K&+gNuo$pHS=RIXblTh+_c-?qcZK_`56z%eK$=Ne z!ax;2oZhj6Dgj_d#qYFR(auG=m-LPHyj23K=<^hX)2C>;y$Bvs_Zn?GOG|dI*)%%{ zb<Ae7XD=-|-Ep<<hZ?dw{=#aIJTH02jw0LP%RDFd6@L9Kyu(|^n~DO4N>BuJPd!P~ zAg6KBFMt2oeZ_@Ssm5*6AW2eH9;Pokw7CKI3g3u3;`ehu*^7Vr*uT;d)^JH8%HWFg zT`jinP8Ioy7haX-QpQv3tR>Iwhhv*qnTq(k-Vda#^5n5`6j~1;9rag5jVaDFdJBre zH1Su}4z$KkQJYA=N*Pt%G<*uC;&+MXpUnoa+2Y?X%_Nt6i!JD+6&|~L&hcMWJGMUK zX<^x)pXqi-{k3sfCdHaUdg7^096K}bA591^IK{;l7$1Q$Z@J$2Y-s~O=fBs<%b8@; zrdFKm$y#|HE8BM`BRCh#a*8=hFE(4jaS9}}EQ>66MUMZf+UckR@xDZ_2xM!;*I1GT zCCu+_;uBR_Tz$v&zp8c+dB<*-!Ja4D^9Efdo5b9Ndzj<8nD+lwagtfUU<<KoBr}Uu zO1H0=L6jFJkmJI%AsC5Htp>!w^kRq2*av_gbjV60vfN;)$n)GaNOAGBi{YhZ-P216 zFFmb#yuhfhdrcm#n+-c%zbgvSU}YxtYWEtwOMTbc<UK1}Czxc4&<wl5h4H>3H2H%R zbO=cc!Q#8E6$Yhq5FR;nn?gCI^XSFdlSDA6vrKTtt`qWL4@n=+o&)pl(zoQ#b0RQj zbr;TVxwRc3ch}!IKe9;Ip|p3faK`O&`&^ie`s0kI65f>!I#GZT6$^`}I5jd1P7Szi zT2YO7Oy!E&phb!;Yyw)a;*oi!^Dd!q3`Qu|!k+&Q3uPiO1}%Ol3vw|r%|s+5{9CA4 zNK7*kIzh%9({vb9uxw}uG(`|aLD2wdhKw~`*Y5Ly6I@>O-1F=Sm46WpDLZw{M9hOM z3p)Ix9YP4{Jj!>1?A>4GUyo%OD`UgBu4o9};T=d_uA+B-azL6QilWG+#iN9axMgk) zYs|Qx+Xe3se!;7n>Er>T;*@U)L#IWATFCFDyhr9Y;vM}3{^NgS>_)N#KP~bJab{LC zQ&AS&^4^X6pN3vz@k@+dZonO1Y5WpnPx1zFyYGnpzaSYain%&ZNRzB^Mr$~<j(zcs zas@@+lv8jB;U$v8i(|7q!5y@VSa|GB1mhuoA}(WVwL4qRn7v`MY<bojZ4tgA9MFU0 zDC(e_;4$I|rWyJ%(IY?E3`6%La)1wszOS{(9uL}I<4B^#`g?@>#6*B*^tN<e*Ka>f z(nsj;&BbrNYS$+xfN-<0oyQaYBG=`1`O{%+xMl1MRuqRpXGWAFTBRoW`t(*&Ett_S z`o0M#I@Q$ea|gf<_KxrJ{FbUy&DZsfjqSVc+SW9G!X06{by|MyKc-P#9g8OzJ0TuB z@xc9ORE_GsrfuJK*Y?JSruorCCso#oE@%5Lz=;~^avV^XqJCK3TLTpuC|^~`)9|{u z)i#3r`P)Z=c9oF#t_vD5__ODcNeq7aZbGga{AkRxf+J(`eecuQCp7~eT%0$I|HX_y zfNvO_%*op>t90H{A1lYF{cp;tf(ezz1bcx3J&nbTIbMwbgM3v}fc?^VFgL>oq{cpP z_#x*dSyagBJN;-|GM+2`;dKq{ypA!zYafr4h398046&+4UirCi&j&V6gl~>MoXYG% z^jx_5-1i>MYj(tb?&DF1O&X<f-tzDzVr2lHu)M>N+ve_zg$z=-XI`*HP4tT1E{YSn zxmj*9C_+OIDo;L@6jTMGBn#S?Oop1|pf@qKrz0eMe<Eanwn$>5`TyR5?<fU<meo7f zaTLY(hFRc)3>^`%baf?)G|h24o!KxRps)=a3hVqG$lwRr&<zyD=^X1>EwK7Zr^A#D z$SE4c!&#@}I+_+mE2}9(B5>-^rkSUKu$8oPHeTu=2!iH$v%j*!Qh-LI+v$ualRW3` z=6W9Yped-gI70rf(>KpIg8-nrG-i1_*%EXwqxOo{cm6LSz^OtLdU3wqwD~-rOvar~ zx6uGd*~$vXah%A>???Lk7;os4Fth#GdfnFJ@~I}cMi46mT`56UWg9HMY)l{&PO81* zw~kI<UpF{geZyoy#Fe`BZN=#{&(RoMGahQ1qN2KN=hSFe#SQEx#}<`^M(n5n_TBG( z_q+f6&;MK$|NPHIv3RyP`R6&EEKYp)yC?qH{!bry<dH|7dhKg%=c%V0`;B(;_t_IW zdE}AgwI2mLKa>yTrNP0`LSRqnnV(Jr&l5eQ_Ws-i0-Ig-$%^I4@;9W%#%=vOr&fzF zBCXJ9vDGjuq*dS*qoQ!5Pe`8)n8j<qJ83jI>;L)ZiiK5yuRQd?J|Tbg$Rm$Da<IgL z*Z%uuBPUYi7YiHEjQZS&yMy~Ig&xXS9-KUPVdk`=(g<)1pn~oiR8e&;Too9TYv)R| z<T#+!W-wkR+!a?_PG;3)Q>aoX0vhC-$S=ob?ll81o{ZnUwp`Q?+y%Ocj^^_t%3GW{ zAuhjMj-E2j3!mqa*-UyxIWLP|(lmMg3l}~?+wH-i-KLiIFd(ebC<-);;9<==3y7E0 zz;y#f0v>_#R#`9cTL{>QqF!%2?)9R`5KqUI0YZwdyhVY7vOGjtwz86CX!uzj-X%%J zdjJHHEiE;h0L|udpGo3-iZ@!m#Jshpcz}2bK;jX2igr%vxjulRa}6}3eocVhKCm4H zb2J^>z)ll+99E+yk2u`1DTasQWt`_TWYbP}Tsr$1nY4=lIXf<KXZU=4IX=rqbiF1h z%((mYrStl^DjdBajac;-C(+EsbRh1^xV*w2lr1CD%19y5%=SSTX<Y8tFp9GL#wAx| z4{dFHt1wS{hM!-!18e!|WmWL7Z+NH8;#(VA56SUE=CylGydYJsTSVs+c6FgHYh{kR z$b)dGFe8y_9sqd)?pjr>=iM*F?0^>3o0MaEhPJK*%!l(OXA2sOF<MDaqwK{Gm%X@s z?}kKHHeiE~<APMf$I9~J1=cMt;G*I1wD0*rxZa<Z(D30-q2b?szQrHI3ak{32K?f; zW$=+)cq`4<d=<xay^sw8ck-mQebQPrtJat`rlS$%i1LJGCgub4xidX5#SS}yy$y>r zQL-0V(4_xYW_GUMZiXR(Mx&Rsk`_QnnQ7YQayujhAPACXd*dO)HqWxUW@k;?cxa>D zOo9M_kg&aE**vdlENrxrR?=%U0EJ<*-9N{EEBy^Zej|N`&9=&FW24t-fQ(hZ(x<&w z34$o<FS4ugWNo~*`oT>(mRG%{C2v)Z<;@SSu8r3w<B9Nf(XR{d%B#FjOR|b(Xf%2o z8&$bAW6!|obGzm<KSak%+|xRERLzMF?;_8HdEgE-S=Jg*54U~E>5U~f7IJfgF}CHV zo6(xLvryky%Oa<;cOxzu$E$=>J@G#~0%&AFx_fJB5NX6SO}?Qnp5Ktx9v?Inj&-I^ z6eB>Ob*$N~br0TUla^a$d~muB0RFMjJ+m1)s;B9@exdDI6~(jtuNCTed>J6=V(Z{= zKl6oL;X1B+t>XP`u6JDBS|!sDf|FMBXLh(#S1SuMkEPhmKRZ6BT|WR{K%l=XBe>4b z@rn~ef^fC`t$EqEnr}Wqk>SGpisgoNdadef|8{(J>bZcV$bjI>`1x9(pKh0B=}vE> z&Z2L(>HOyD5r4{1>u2G%$5b%T&aWmVYl4Hp)|Ge#x7P2W+WtVt`U0&jt9Ev;k`rQd zd|hUaoqe4@_B@DwsAuw!=j2<zgmZ)`=QUy*1}y`$w+T+8OT_aKuyDva!74n<jUW!I z2%Sd0e6}by7+U<KD&(k@7DcR@rW*GfMeN0K6x&x4BqUpY>ufO~EOg!5S>2`XS>-hy zZf{o`nXb1t+*!NP?JN(9e>h_#98=8+?)F&6zA$S!85W8v92aJo7dyVQdbgCQp<28C zwfuV{$+qLzwxvi8!)`YW<+DtR%_VL43P;g&09{iYQ*i_Li@C3_)=gzj*ZBijw_8Li zFMY5ax;;n_b3TAq;IYKo-94RBAl^$7xyocCID|`5CNc@`sx|-~Edq{hPL8%rV<cwq z>(1%{Ir46^cSOk1-gQD=UQi0O#uDoeRYKZnC5A*`l{!<mI6|&2w5=J7mX{{?%w}kh z5VE*&!_QKvMS(nre+f3&z-}>7VOKn{&}4NId8@Avc2yD5sbLQuAY`rzY@*pK?`Pm< zyMrUV`k{9AAX9eVmqaJj!buGQ2pr>(`#T@hDK<+S$N5`0@dtdu<_2dxJit(ahbg8a z-36RyJ7_|I>>cgxYY%To;L7Xlu-?B}*YGh_{m@UeZ*ebdN!_%@_Dg8AOVsnXvdf9c z$KN8I4=1>4DULx+A9828mvD!Es79oS5r=hhcci*vaj;2TNiA#VsHG@Fw3$LX-^7z~ zPbso5(jSrOw#sK^aPAi{$pI|HQq&adZKp|9z~lL>-;h*<kWM|Ge?dr<8a|$|(j$am zokL_bb;N4+(jYSDfYHLP^!mBHI!@oUM8`r)b^590h!!5J(tTU~>IjyxB-o*UjoilF zD{~1}$rJ8sI{sfTM?Bbc2ByeHbzMTZv$5(#vJv--*WSfF5SihcvkD{!A8@DFwKk&> z!3bRs_wHeo*M(%*lrt*5GBkx_I}h9$nkK~Y(wv;)ETZv9`1qcDua2m@>$9?FkF}0B za6jOIoyD(C(U0l@br9h-L^<iU9-mo{hL1PEapHgw{HM!x=3=!bq&%KqV#)u)iF(3K zk+%^lP-M2;FC1{osr@sW@RJ>0gGHn5oMxTa62aIt{7!%I(~Q9z7ti<MPR14=ew?vi zS0Rp<E&*Cv3kpg75y%LmZL!8cYApU(4`9)MX+X;U$y7y93-coEhWJvaJ5H=?9v8#v zsx|ny3VKTN^xoE1cbi-g{KuFA#^(}eocE_O*(KWV8zCC&<Mrv5-doW+Mq}~GfHrG$ z-bd-9bVwhiF9vx}@HqPe4SNZK|DLc!O<Mg{Ga38eLxW&7ps%*gql;C>%6=<R6QDtB zIx_$u>4mcGkozdFdoUkiil-7uIV3nu2xb*B7y^ru&RsV;LevO?FhtJO&Qk17H4>II zj-M;4T*j(iZe09)Ay-AAP{Tx#cJSY^U^=cqc{d%RYKGK2FM;bN4ur%472&@fj=nAs z)AXq-X{xP)Kxqy~(9Wis@5P#`+WTR;jRt5cQCw4sbBid6=hm-ZocaF_UDK3!trJHI z$KU$5TfYv!3g6_`^<)5xQE6bQ$lK)r-9ae76>Scq33h+FZf#YZ8?!LkQX~gHC^i6R zy`sXI=X+0=w$Te4e*cYkx<36YSr%ERn;~5;B?-m4E<1MXd5oWL*^aF1F~Yc%b!d0G zO#Fdff2q^yFZJ54wD^YPWFpk2E*X08(T@hYA?YUktSIs>AX`#vMdg>qX_9(D7RTmU zo<D2GaTa)Kl8%>nRjF0UM&R<xgh!r-crr}d?PU02p6}+VNvP+lr%tJ^M~Ru{U7qJS zPPcA@ejWZ1zQr-F<c`;{60Y7(7Zq+wy0||ZX(2dQERX4dKY&?<y&-|}KmH*NR8<|W zudn$?<q@TmwfiJ|&)Ql@d0s`{WPN@3A1BlG)z$UsMEw2hAd2t>6nHBucigqI;`snS zgK=AwsO;Z&=FG<C${^?Y-pa~Gb^7#ufkGv*eayyEno8I%mzKtFKDjpP_d8ipl<TLt z^H`X3BW_dgHNKrO3qx&`qz{?Af}IBv(yFAqq2PoCgQJOI`1P_m6i#>o*UJoNlR7?V z76*jIuJVryKe2VHIh$X@30sszV2$Vb!{$Lu4vGus&tL0fAFt_LY`GCqbW}b}$ZC-6 zfi`>(Lj^Z@6$mZ=U;0u}!GBRy)wHy4zw&*JtDhV+uY0Yg>i}7dKe}?Im92HVIy1_0 zYilq<8N5U@L{nAu|M*4!$JpQa0FK)fB6soW@B28`oir^^6g}6KFmyPMlQ=HjN7F~w za-&=~Zw-Y#HXj6l7<y?X2XTx>roS*Q;VReOec5FA#=_mN{I+J9s;a!tx=O%tn=S8p zbMVQpeKbR(!PZt;8cgqY*Rs}?mE&X_6c7G>;g0^JuBxVBYF}hO<~78o>j3zF!`SzA z086ghD^8SY>gf36wl*GvD`utN5$7~=;SS{7T}aUYRg(e>EZCN(bZ;1PCL_1r+y2yL z$GPluf41xV-1+k#d-hNu{tppjzTy!8_pH8myn_;ruKNfSQUO3*&K5rQ-Gn1<W^X1U zBdFjHLBMS&90#C%f)tv8c}}~RG7tr;)Vo5pnA8bp=yp}ibwV_mFl%12`W9C+BTHyp zC*-=ZbZ+*tS1Zb^R#yLPb?~3AvQ?{&kg-m*W;MGbX0agNkM9_D$4j!fnj(}QTVFp` zk2~bJ4u^DDk|0y#^0w{@oQt-i!H;pJ#IMJN6@4f7KJG)@)gCg!d_VVtQN_Ud`jr$+ z&fC!3H<k><Npf(=fMkSkA^KXmu#Z>B>$tH4lWD_T&1!^jYh6t|0<7DuI$$brWW<** z#talOWjjQ1)dE%gV>})PTLOf)vO(sf;JHOT%&VS?j{r*Q@jhoHl&_ewDVMS-n^)v; z6q(n~ydL;B7|iE$!kB!8Tp_P7n`Lu$g<K)z3b{g-%Vyd9!WD9bgpBR~!EhOVRiAH~ z=0(|%jr$DQkS~~~X<it0(nZs3e*TgFf~IWVYs#j4QGR?&dBHTBKhD^XfBy64#rQ(= z{`<&%<oJc=#rX3Vn-}6&+)M5y=P$$;n;-f7=gB{R{C(uUBG=}M!JGvTRy)IS!Az<) zp%ZgZ3#JufR{PTQ1OuA$DgK>R6N-zQcW-PMPdve%c*5A&xcimOZsxo2@)n_1efgU& zR_@y6;KTHh%bS<*`t;%xPh6a?<4f<a6s4jkptoCQ9DU0F8V)aCK9`J+xO4Wx!6-&> zBmKv`tO{icQgLkv+Vh)JzE@o3QGJPOP-UxCx)OJj1x!6{<B*Xz_7*>SU#@DAB59T5 z9UE;oo$k!1F<ul=5L+yYtgi3-J`0-KV6Zb@S!u!<X1hN4DQyDE{^&JA4vA&+MN8r? z4_hov`F!ISan|jCV<%S^?-vC^Vj_yBCGqN3w+kpvl6x$HH!Un+j5}fSE)UXmS2)u` zM8|1Q>^ik@5IsgSiAsQugej%GfKpQ!%-mvZhuXD@!Fo&HCj>mY;_O9HF|Z2sM=$l^ z#di$G+?@*mVEmT}`DM^_6|>~aFTJVafF_l;KEB{9bUz8taPP26Kh+RNSDrB{r1Pl7 zQ<-a|7P@MuLva+*p{B*u?3HXRo3p$3$W8fPY!Hd6xnir0L1msK9bX+5>9+~YTg^$F z&zQvgEPC%LaGd!1!&U1AF_6Tx^`Z8Oj<@P2swN*kpnR<h*=dp>L)rpFcB^MOV!dW4 zG8?%o3%WuCxlsFFWfJpM^<5P50dK(qw*uDebklDNgfwAoU=5tXuH~j&SN~C~Lu~*t z-xJHWU)*Es0?a&lv+TLps_;_ndAQ=rS>Ugy^X`=syk96J5UMD|TQI7AkF1OAd&T>^ zl=bI5c6>r1H0ZRp<kznbP^yj7`=t1wed322wrWcKtuLsf+dXr5n#WF|{)wL}66&x1 zB%I+cTP<N{&eI(_<|NLYZKy5x;OX_AULMKk$_4sJJ`3IhOC@n{&ajPi{Jd3eR|kys z?aKBkYoV4)iE}dQ^vR~UFvcK730wR`bI&iAr1Qr@Z7YdqhI?Sabl~efwErX>$`|&l zI!NCGyHDy@Ppd;lvVb?s+`}>V;qkwV`v~`W?nihqkz{X8B`}%d`nAChc-^Se3-;#D zn&dyI0yZTyi0J?lOB5PqYH8!Klpw4Pu~!THYW!3iO9@IvHg+KQML%zLQ2x$Nl^cqP z?vTLeti*RJId;t5={v+1^=;X)Y3}<uwH?{^?>k>)`~BSa^S*biiz5B5e({Di7_C&F zdq|Sx1cXpQ_ApknTmD7zCS0Ogxh37xb%-L+bx*(NPXdyn^P}|lb<GahhOOy`?(>-I zznWXW{>G)Q*)r?fn!e9MlLgfqG{Xr#rOklburT`Q<J<xFz1*S4!Sb(joaf{h_f#i{ zz=wzugnfQK6{k&Ej|||pk8%rs0YaN_y_!w1cVnF;%M-MX1abjScMz$V*ynw-YB~{H z%btcNel_4JHW(l9bizZ_njOG5$0mOMtS1U4K0_Q^gD$hw)k?j;TI6a9H}?1ECG5l~ zE9agCQG<iU>(wI1TkF1WZy|NIxcM4Pp894~*+19>9QFX`#`g87aB#@h>L@!rTxWV? z^+ZE9*EM@%ZRvwN+e*#W>mwW-9I&l`wiv8nTGP%sBHZMb;IWNEj+AtC@quliTu#NE z;a<UA;Xck?<9?p|RgSA9QH?k~f^kJt&{TT?Vw7-#-?<ni8V4o?DQf8~Sgl0(B3hS( zINDuD6a6GKz~vZsB@K7!*}L&>5dc+`sL)yK!fS9riRZL5Lr2r$2i0iA=Pdb@|Gy72 zdJCaeYiX(7Rv73;uek8=aHwaY%UD@4W|~3^$IV_RHpo-}kg=+Snqf7LnQ}zpIN&h` z-GqOywA)KdtrmhP$}$?@)OH3d7cLY%LkG6_Ln5_A$4=8wm9W<A^_nqm35La3wUM_S zJ&0ox$)>5h*96hf0gz~A?S8+}-~l0|sDh9U28GY^cH%4znn7g8vT5p0(BuGP$4=AH zx506Oz%&iR07(Ln71J~{{Pn!iur2J{Kj+JeAjyiaD~9?aUUvhDCxWVh3|}u>sbgbo zlUA$WFTag+LsoQ?2DSs=egTU=m1kKJ6Nv{N6T8vKzb@&zX{rj(<5v?wq^>T29K9BS zh-F#VJFX+jNwY9?8LP6uhq9#iL`kwbirD<H6u7zoN<?^$qXmp0vwpT*=APu<%zdJk z2-%*?gzx!S3iu0tfyW}(G_pRORU=SdIry9buP-Ua)Ye-eHL1?iB=qY_eH@`)VX0== zjw18;ZJ~MGjH32a$HCN^J%nDa8HUztw%g67n$3`^KY-4lxA~ia;OY8iXWb4FYWett z;JJx+`2_a7#Px(HJcL5qC_0<Eey=D_2`S9&M8hE*`f3JH^qbWWxmZ_ogYV<!+^f0w zanEyH7n@y$H<cZ*%*@^+VLC;tCDJ~_;eg@<wuNco;bMKdUQ_|aDL*rvRn}pyiw+ZJ z!xSXn^KoxlwXxsUe+amj({i%-_3)j9UsnzK_zRDRx=Jg-`mI(%Dc6>ewAkY>JkAc# zakJM$x34S{nzyaIFLE>7N4=(I9Y+U-rZ$`HcC)7$3oA}U(Z^ajg!w)r4h03LJjnX9 zljM4}pPcm>V@JBahQ5iecQ)I8;=1Aq>^Dz{uABHiKEB!MnRbYfr|Y$77KBX2dRtMG zK&+<u9B=Qx=KsPG1y6jrgl<1Ch0-s#cQ?CqnJmZa<BB<S&r->3i62yj#C0HqVi@GO zp#TW@|JlLSL^L(cwwD)ww`|**W{L@Gh?Z`6?uf(O4Mwh~8<yB$2VnR&@`&j5rV2Do zJMCW4?-#vxCrv4+o3&1ezA;f6dA__fTv^#Pbo6J~Tv-_|E$4YdnQZ6;B7f~sS<)BR za*q2b_oG~_D-UmQf6x7kUOFl%IG~9Sfm~?NpLK>78i6F2auQCJLAww=e`>ohi&O^G zZ_(tCSgMT0`<~EAtZtSCF6=pDm!FPMk9U(3?Tz@H6~S!i5Zoy;Mi-+i*45AYjN)b% zaI%a$MeiH%7p$i&K*X{&^@64vSPV=v5V4`C7gWu*2!aQ_T~&T}mM_YtqF&H6^5r@w z02=ib#oW}esAFDr9F@nqh_y{qQGBWa+=D<3JykZh^gsSI&9=3tE2}<L5#00aVWjIJ z{s5U<v-3MWQ4Ty&4!$gUfh>A~oXDbNn(|Qd866OFjHfdU4UVR~t2OU<P{POe61_(@ zZ{q*NkA?<t&l0j8wz}$AP))iyV7oW+#BR__l)w`e-xJb65j<ZJz1uZYN1$tl0id;I z)09Mch|1dNn#xeFwAw!r0bkTn7Ap5`<kN0XK~aJPn~`nMEsQHFC2+YsMI)Iuw9S+$ zig_b&Y%Czx<Z)`y;s%3rgaF2|&V?(CHQN(Ljn3i^+&mpRAK)W2>hd=racb9eTU7;> zwB$BD@isp6+~g?Qxef~&;=g~QzGjmZ37_M6F-$1K<W##PqtxBDFtuUb%FS>#LOITg zNs;6Ku9cebEhA+AUI$`)OSrc9iwPV|jLBywz#Sb-q6r+Si)F^(KdXyFmbPn$2M08n zYk>9RxD909f)q!rQ<fmX^1@Z-5sunZSC$?;*(XKgR3cw>tXKHSP~ws??eR)u$wD!I z5`JD4tHh1L@%?Ue4<9}Whl`^bvz5eDjjS8=m{7CDb1(M(54#>cT*(ehEjOnRUB8(7 ze#I8c!JaOx!r|gbowJTFqC&k8y8prI$gpV2@wPPY|I%l=INhukdIO5x?qTmy9o}vV zR~A9nD__%=%MZ#{hP|sW9nrzB={r?y4(<!sl?qozjB*<14}Ls|bBNnM$Q^QD<$jj? zEpVX;OI&(oavKuJ<z-uKV>InR*v<tW0l1F}Wr+!Vgts%z$64-obAM7arw3JMfYIIx zmQal4sA$dJF`@6VMm*$?6zeG&C$G@WZ5-P!T}AOG@Tq1T<>9j5fZu;7^ok0<ud+1I z0zHPl%s0sMvhesN0$9>QZFqLj&I3^i6*0)$gR?^|)Fg>qI~+{M{eCRR{r-45*t^AD zgZkk2E{MFS(y?Gj=*(svPy{T1poyX;fPjT2o2E}k>uG>gnQuPePX(kF+wLOUM##32 zn^>l4B}09S`fWa|b!W2<bl~=;Ad7#z6M>%n*@El|gb{}PzlDfGfFtS6WG+d1pqI#V z+ZeZ950!eLOX5q&KKY{t1b(;c2hiBs`i1#?aa(7qn$Ur(6Y^s!RC{id9*|+eN+<8~ z6YI?G`Ihbf3=25N;pE|w)-EUpfd~xQXv0^Yj@-$4$=SC3Xaggpt09>mZ{2tzr&*Ct zCscV9m7C<uqg-8CN!vg)H#>I?o)hKgVb3RW#(mX|rwS1F@Sh*NZ1Ev{90@KV0<((t z4q8T(!*kdHL(fY`2jtDjj|XwU{wDf7`9SWIhH*pf#5j+(+QaXY7tz}#{1^%JiYdz5 zxON#AK_4<7t0>hXDJS(Jr^8iTjeQlUUT}`d5XVes!LDIrSVoTGhN;|{fD<#$|M&S8 z5BhC(z}o&jzdc;_|IgUZSUCK3$@oLY{y@jSMjmgRoWc0LarB<~PU~Y(xe7kx4~b(q z2fjUP2Ha_RHO45XAWeu^L{m^mi80fOZ|-YLNrmC6_lU?%?fMay?0J#6LN1Z|NMw-= z@Uj$C{HS|KT&lZe<7(*<#Hd_sF}Hj!R=Gh>8PqFsz%LBwG-Zv`K5c9%ALN7KF-YTT zUO^O#XUFbeVOrfK-^8UK>+&gxZze#@V$9HzH4X6LNb4SG<6QhkV_ou~#HR~eqH7Q` zpDV@_bub}VK@pXi)X;th_2TG8?OTQPccW(Y!6VL6vx6HobV3JZQn}k>u5%~3+e+IC zBK;bEwPt?Kh}@@=w8XYz8>NsJ*ex6%2~P?vBZtBswGp%W)Mm`4sS=G}PwBT+NfR!# z%@>1_Ul9G%?RH_7et{$kB8+0gbNUJ)Pi_!h2QQdX3|p!{%OL$(_29w<j^h*#-@1WR z_%T`ka7*(twJCQp{Rk{vj7@oTrHZOzCc&^&d!`S#BvOx5?U^5TuBqzNKkF@SyMncJ z1??T(vc_K$K5?ihPdpbLVEKtphl}57V9)Xj=G>gpX~l`1l$QYU(&ld1l!{gPMV1Zc zDWm`uh?i{RRJcS9#G-)%-~`knr;4fdB#uxb_<5lyP97)ZfE^I>IMkh1iv~J?9?(|H z3_zz2!=-+e9%xkkrSNjRgwfh!O78BmTew9dSESJr@`Hu78;S&RYnQBrh2%<^|6|tZ zntiG0O^J`Xv-Ux~qKRo|R)+|P&A!9NQyZk%was*;A@P!=xjyiLE&>9i>C~`+=Piv` zHP9B0!!)%a@gi1zN+0+Cs)23<f+7o+LPSLot(W5JKS_v=1TD4<L()Z%WP#^pRTOzi zQVfj+oe&)aHL*+s8<K<t9$}27v+aXmeLw{RR^2Ii=DGh~z22!ESqUU-q20X4R-FF? zb$5i(L;cIwY8JP?_t?ttuTj@T7&+7o5K0*V6t#((13tGAvj&KQk|oNx+kWWWZ7r0| zuYFgcwuk&RP2?n~FK7O~496#)j+XnRE_1$To(~VLI#4_x>uLDrsBr5b$Z1jCTeAZo zq}7#^;iyD0(%}|Z?2Xs`i#?jn2p@mLk5{nK9x>rCz9E>{W}@(E2#ok}n0sUquU9J~ z<!mUKnPC^o3yPZY0TDe}Zgu?)3sbEnO%p!3+!0Ip-kn4Wa_nSHwE{^wY%u+By%UrV zz|X10O1OQB$18dJy{HswOsrhOV*WrpH+Mu;1Wmg(dqcLS0K1OcIZ*1|MnDcMwRY06 z0*TytSZBtedM96&VAcLv19UyQ8@)^b5D8GDCMht|bOD`JL~VK|JwDG_{CFW;2v0#M zbc_96Yx?mym$+Qn4;nZojP(V3Q652Ph>KvN$aE{Ot=rff78?uTi$)>YBtvU2bM9Yn zPW@a%f2AZiok!;Qih7J(PG`lHdWzT(4mQ@;sTk`DS)W(*)-ScZjr*OK)vU~>-nbx0 z^N)6XwueV`S$NSW-t&*8%n`%cNFzDIsluaOAzH)sQc%vMq&loNv^Q3EJb&>r@{Y!m zcClrs>96kaZQ+qOsD`q`ceeMp6-80_&?ha*cI3PGU`$hxj1bJluem4Ow8jCaG_cIk zL4bpNK!-^(mKdWa9m`nMzR18ibO51N<l3&ZVQ~PEI?_4Bwi~%IbsHttC?N%<z9C0A z5=lqfW6Blq*x(~h-M?^>(ml?HYI}RT#9WM0%8m69w+rZ4!v!9jNZzHY9%7-^9;wf2 z!T5^>UdKO;T_IW%HiXayd^WQGF=XI|*;(U?*{lIb%$@mw+36_1jdb{pTS~{q)Rf`q zQ&YP0gYbqy=^NhYQxzt!wSJ#={=`eKl>X5N{?&i0M?7GLk$;dZiMd@9OI*Yl&$SdK z1$IxV{L;spa*gmp^JzU0f)VA9>H76%KyuRc_uoY6f1GOUcJii24dbE#kF39VKZlWJ zf*HY0;D#Gs<TneT=n}Qw_62<j%Y!=Gx{E27&j1?(KO05L#8g!N#~{Sxv2*<Q&7Af8 zbF;^QyI<#&UW_8eZNk=BuM)$@NEDs@x(k2I74`7aQiDUf@4BC_=u{kAzt6wULC7V^ zO^25pGt@`ce2}hMcvfd&yd?|b@ILe)dNRJ8Mt9KvK_5q-Z;vk*U8>h2&$5D;x)(`; z-=K)a(XgT};6Iygd9D=-Yn(HHs|M;s)|5#D6v+cfx)3#7!#utf{jcvKK_xr!k6A+= zP`W!FOG~4+&$&KlI8jf!^ptzF>So=P<AwE1dqE?`$8gS5Nn=<KhD}k?RuPP7yT`o4 zPyi>&?lq$kZ`3z8dXg~F=`{)Gli^LqTW{Gd`AE3__!-Hg26`OnKB3bh&|VbCh9y<k z3kQ4q@3@X3Y*j1tLZ!p9q=v#RJmHw|QSG2UdMlFk{{0AIu<yLa3>IGe^_`Wf|3f&S zVz2+P5M3NEozeCj9zf3{Wb`L7-BDCX^mTD-z3@7PK;}l%Z+qc_o9#HvPKJ=3xW$Kl zvj?#eLe*A;;2(}igevr`+8tXw<#~KsVaWM-c%G1PI_|jF|BkMvresN0kYs_XL?jka zQxzpF6=YI1bO4MqN)`ZcMxiPJfmqly6-mNUURJ7u4t_m)O2$~IitL@SxJduzAcCMt znr_$%205FR1rb23hyWtSq9BQYu_S`1NSbC86anOHcKNg8-%$LbEhEjt7qzT}uSBnl zaw;Mh02e3pC@_Ahz4M$r0?~Rw1FWm`7k-^DSix<t8Tl~_l8h=lqtug4jX6v5P7fu$ zCJMuIc&5`f%N?)-;a|XbZS7Ktz50ii<#hZ-r$ET%Jjrl?+1V`+uaB28bSl~Qlf}}3 z{zBQ-HB+I2OoW`Of}rLhXQ{G;Wrrv{o5cX8W&*~hW@$<czidIxVX!P!k_E{j3jbVg zo&kv1>7q8rGc&8bmU&s7Iy|@j1%!aKRb?#lLIK<|>ZQz?tzJAmO(>Q6{S)hRho{u4 z1m(&scm!jyAp&45N}>dUEQz|T8`+{NfJ`Yt$Nt>v5`cuUD9929L6Rj^*7Yn?1uRpV zuSPzz?DT0}Nxe{(K}IwFVMcV=kboG3a`rg+<-_D2c#pe3q<+o$6bZe0l_qqX76M-O zN?5*6h6d56(HqcP(Yqn+lua@LU7eN{BBXXtBr@GLN_a>>18bg4ugUjW6rBkg5F*pj zZNreFEu9$f&iB1Q)C7MF@?*lQw@+fYSKnvYP#h-R29CwE^>ri$dUSyqj?TKWOQ|b& zneG^D;V8fBtK#{lJP<Q0*X5k$=@rca5HpY~V@WDxVayghBM#)|iZ{LN<W@fO9DUsj z6jttiurPUN`#*lyGqv|JJ-BaA6Vuy0?;D?@!3YV+zV=)2ckolFtjSCtf&820nGYPt z%2T4}9S;Hl{y0<HhtC{x4q;M@k7&%L|2*q9E>l~J{|V-=li<Q3=a8ST#s3Y`e-6dx zGhjCTeK7w{sGk^8R77pB3=Ujdc=(WR(gr3(LJw>=G6P7D?|KGJa^LwWq057DI>`~j zA>l;Mk8?kO$q#a#qV<!$zrQCcpa1v8`0G>>ev<Q_6eRlf^mUnc{J|f*Bl8W%|7Xts z*>^tlp=T0DaeN%Ke08r4m-+rH@iV*jWnuP(6Qp~ZxTK-^%_iSogdneFOMnOK4>%N> zVE8U3$E90y4w0gr%6_uGDi|G|T$&<*ek7WpY2p@r0a-tgr$Ox}%WJ}AGNCp+-k@g6 zq&Ao7kP3((QnaXaV7aY$sP#$&eC)^DbQol^_MFsymkyieJFqEHt9ZcHtFjEfl;e0# zCIb#@mhuI)NqdR4tSx*#ptCI7JbD5PrYM25Z_QrA8%kHIDQnkeX>%tv5JaCemE@rO zzw2P8lm$r00g$%^?t18kH^wvNf=uj;ja&;R^pO<a3dFpez6){47?)11!EB*WeMK+~ z_?QP{x^w;`_QUr4?DW(r_y!|7yrVIqq?u7qNi1H^qiYtEMXYxVhU`Wq65D3TydKXt zk_+NGp9FmGv|puKdlx2q+eme*6#TjHJR?5Lgy{&9XLYG!y~hVQn@Sy7%KO=9$&>$& zOEtSQ@7<N4QcjuC?&t6%Cr?NB6G)KbZTn4R5kpfgQet}mPq??qLff^%2869lq#)QW z?hkj9WH)vHFq7_by_=hK07jj$0pI7za36TA8g6C4!LJGVhi!qFD)J+lB=i#~F@iyB z(p35$uE7T6t7W-MSPvmxnMYZQeYRxwumRoH=#Wd1?Y{1JVXoQ-Sg6ba3}Lp?2k2Ml z;4h4M(HKnc^5(wEu2R0wcWFAg`IvR~?z_)eM{mCQXzuLYcc0B2z4_F$a7$cEkp43- zwt!Bf4<QuSfH};MP9Cj9CUNB2(gRP=@$J!)2I#%x(XzjW*>|yicEVx8x2LK*Y4Rl{ z)&ne*x5~Etv~j3fD;*iMQTcS=K=Pj{6n;njm3-z5?ni502?BeD3+9iq0%!D87S+%u z9X(3~-V~>f3sO_r6QR=p5)TlpO_9AQ8iH=5Y(IEM)tu9#2kk!L^>b#`X0-DIXNuE< zTBCZP59}Qab0vR!2cw;{t9nU0azra?t7msGQX1)ph!KpPDh>x9H_;jPrP>G9Mx$ef zojG?dV;jf%W==1Yo(xyf5p>Clfd@T>-h$qR-j6<veuC>k%RX!DAuUBMs>!g1yK-m) znhD{C6y`(tFJ6;Lha2WC8KDMxhx%BgF4$p2x}xMJpyMad71y*w62%5+crAtRNkh!U z{h(Vf0MS2?ta$*6p~ud|ILbK}xnpFQ@PP9u7b7a<>xro2k^c$3tIB0)0zT6C5(j!; z^7#(uTJ-X@Bpsh*Il;$ne-d;J$}l~z&c6~m%^RYK4qyjdc*Y<}hC{mkBXr1<gjxx^ z9u3weNut;@`ef5=(mp{hI*cx&&*nDge&H$>SF!}X3xhc!m|td+UV^9EnGNt<!kAQ2 z;zyn-Dx>~^oxM?KaljAX$cpHCatb{GS)|xR-(L}eCyuU&F&~O@6{6IzrSJ6FihwH+ zU4pNq6@w>X<?$H?RJ!lL4L2OPPoe`lK%IGoU=HqHJaJ<2?tux(t18uMB|}JNxcNzp z)yCbP0gGxjTPQGA$eUT!A^q+9zuU}zPa%7uOooumuVylYyu3(%hzX^1k0wOCvJS9* zMI=ezyy5JT4*MMF&YlU=cZUGs-P2(1?R>I~aamVYeK=R||1g`9mdOa=rIN|?k%d|B z_q5;KY}vm-2>0oZ+`);t{1y~92y58H!K9BHW1)jxe6WAQBL^Cj)ZGdSZ}Z?RS-<5U zq?Se1Y8aMFS$AV|C2kbEvm0x!AW2hGg~HU7Bnj^N`fRt@h*vh(o7qx146Et^D?itn zn&#C`R}f3(a!C}rohqN6>dfUWuVv`E(emKb>e||>n{Rr{OASGmE9GplJ4;QaxxTT` zuU7jD8|zJlnzP+vwp@`Vu^umb&AdC+nifSX?^ZQ^Zn`-&)trupLrrZm&lZHGE^RC? zEiE@F$8j8REWTOla9f8j{Ayb^N`n%Z*wd?IpRm0F1|Gv|^`b<qZ{Rx74FuU1%rOzi zQ6zySNu%N3q>6|o7LHLyZWiv3-z4N_3n{@(QjX>j{?qsjTx_dvSD0cdL^7bO##vqE z59TE>1vvE?;kO3vzPY$6s)E|nNxlyUs>+o0Vvzmg%`{`LiyD|Rqd}07u$$?6C1EJn z8`EiHeL0E&EjwPzadf&F8oa~K@tr&Gbg8cGA!~1jhU2t6XBj~pEkEx?W;X{q)lvZf zHgu|Ww38?2^OGmFjz;wj01#4*>I1I}wv!Yf@BSC4NE{ow9vqRyzeH<}vlgAft#q)F znYxp<dTHc!k8PiScTCBS&Tk*<dQsYIrH*c98-uik&pi7L2NL=0K%;tU5r7Si>iHwb zb`aV*_DHT%Z3BQ<sZO=QT36MU+HGpWvKKhkr|tHVrgqnGXxi{I|LT4x_bp*5h3>$} zZ!}PXfn=t;ZD}|R@`feKuxO3PVND#0#~da2=;`__Sd<y-Rj*i|=Jn|$=^9_})#-ZH zUq^s*?$!|?Ns|;qmJLPHBtZm>K@`USecT9$sv5H5f@ZaSANs|y?S6s4^V^mNt|A+% zN*)JS2R~pe@IiNhD6XhUI*LS1($rSEyqvaFP13{&>5?Y83W0;zaeypffBe^m6UgMx z{hz}C_&H(ZCj(K@FdWa4WheG5+hN(#v7!&qFODr`%&{#mc4XP|9K(=4D+r7_wDU%O zL8(KTAlTHAG||v>Xh@o<_rnH2Bkb#<CN)4;by1TXYM)0b=IA(74o6(+sc5#?or>KA zVPBC^W?D?GrfNuE>`uF)Ywti;Ou!b0;L~YgP*nqP;nQ81VjpQU$^q)59&n3e>|aIk zU&sGaUffvR00wNq=JRig;&xqczid8V+<$*@|NTX~r)BCR_uv1BnrXdz5xVy^=>GfB z{r4~a3lPHQb4C_7=ks^AS)0ufa@)S&c3Z5?+8ifxT>cbe3GVQwv@W43Y%r3Clq&-6 zA{f)q1-;Y#6F-5w5kJlRY!@<`QE%Uf<o*DBQ1tGgy}dmqw`l<V+Q0xGu=oxbrYEx$ z>^6HxaI~m}5-ydCbC(U?>_9dra0r$Kejd_Z9*~l;k{pB}G(~JL(o)mr^Bb(L>wF=f z?U|nA-phTA`#kp*?&rDR<T%mxi({UT{c9y8R+g<%$Ru5~k_jk75OPMD6lPXUkG%j3 z%NGY>l1+<D*SiyZ1Hi*I(JRVvwI|}L3<{W*Ksexw1u(Z<ah2s1SykkZWP)#Mf4#!R zPf%wPV4=y?U<7sOK?aoh3S$78;$qI1+iWxtisLv&_hzd+A0QNXLf`5ImbL+_FL(h$ z0ne{y_dYg?8jZv?jTiYc0b?uBF2PJ}+qM%E>JW5K({;_$p}aY`kTJ%hK&c>tFt|&M zvHXu<n7(g~`>hrdG9HfjOhBzxe{9kFa6RFugxHLtb~}o!2s$)Oy4`B9+;T9syl!_o z9;`HD7zPZW827r(M6nWKlQdnp#t>LA1haeF*|gjBER3Dj@}TN=laO{Gvfkm<nK6{t zdYR_9l)8?V^=@zYxD$qsCYJ}xQuOZ)z7V-$G55Y|tyV6ZmCE$=da>lKtazp3`t)?A zVwTIbTD3iSqKVeAHD>ef%oD;2ux$jt3zX6~8!+~EK590@ck`=~wgY2cPG1doq@Pte zJg?>hv)a>e@SII;K#UP{T2c*K%#EeXl8cNAKlCEcCU=avp6w%(h!kdY#F+ep^yD8* ztcI1W2;c8ekr?$2Xy_Qz$cFGA*N2~aD*X<(7ktY<g$N?0`gs&NgD7^(qvY~1!HST| z&*qiRxHxNswimTq1#p#vnJ?aVR^0O=`JbOC48X;OimuZ+qa*uN0Q7oTkiVeC{U08n zJ<magJkP6!ywojW{+j`YROK}*A!(hWC$YJw{>^zRNm}p~0kj+oy&Q9+W-{%1XwHUy zDJ33SezwdsX_>6Jf;aL*TEV}l$Ap3`Tse%dk&3}h7O?7@9!U7~A#ifE4e?#Byw7Pp z_M;T`pd^#U=k3!o?ePW4p9^Ldt=a4%R!s9&@Z;}X7YCSMA6L`k_xdn?#>dYz7lHOX zRoiyE>fha_PI^bvJ<ev(#_$5ElCn}G<tnL$Hw%6`=2;-nS?sAP<!bD+$dzf|p*BpN zHaC`}vpw#&DNIKjrzv`7fua$`)TDq9@S8lcB5twg5_tV~57>t432j)n{;ViLNtPFH z`&_GCEEO7!mbNWkW$8CcY_47`n&m}OAWkYh0>`(~+z+j>W!BeZ0#H!YMRoTI1utK< zEZmvi=y^MZDa^AO_O5BSvh?ckb^cq-&;Kl0h?8tlO$~Xr1;a=6kqmheYR|oGd=}AZ zr9muG18NWw*Cu{sCo$PBNk9^fJuASlIm>j1^1#!hF5~4A>4@_QB;)b(s``A&Kaz~C zUqW!{%w2dy)Mww8CyD*gL-zhBACTn-J_$(XG!`6PET7-FsBNb#x9Zu_26#0&+<@4T zIGEXCWJN+NYFVvCtZXQlqv#yy^EV3qBI1=x$~U>Ou(YOQ;c3aTxC_~OTpbyd7K~vg zPpQr`*~+SyYuj$W(t+(x`t<1dDE;!3rZ!mCWY*YIVm_br`%KauG`~{{^{aUsqBfk@ zI4!lapPYM{a9fmR(`gT0E+=FdQR#~MxN(AmU;GpQn2;^fy}g?R?K7l;F<zRn7Vf6K zu(F%1yLo=PliPG$$Yx-V(!C#TkjWOtl#a<hek#s~;IQVH!ZL+jG(w;7<?{R1q@J>y zM-t_rFbIRtVRBc90oj8Z=5>>f$0Ol}Ez3~2oAqMTl_9gMxJM|eJab)fm4bmur5qFh zXog_~l*YpwM8&nJilM6tjW%S7NfAQWz4tQWSpR31pfnm85LbCxC--HMaLR_Q^ZO*% z%~pGor0b3o@;4<WEXo+m@4YwQx>$1y8|#?N-_(w3^Z{<py^Z@)%quYg9cvh~n)~K^ z6PeC-5uVh>3UD`3M`uedS&;dNy5kj!PHCRq@Fi~0!$teb=ybq~!%<I#br$&Unk6_v z;zeAex+GL^GGJECsy&S^iOl0Qc1>Uys^wf@y3PdHH)xV{h%*3)288Uf(h>n*sy#vm z5x~G9og|?KGhElGS;^|hU;XOGYgR&|*K5E&G%XVWOOi$-Nf;n;;B4)>$*W(TxGumq z6|c9UP)1{~adDjysEgxEp7NIErlvKQ-(shJ;Hz3|z29tSb?43gdP`INz)$T(cY~;= zsgjMFv07cw12>qPBre+kq2nsEez5N~o1X6iD2m&8*R`&jz`XOf<xbo36!)_n2ip0m zj8H>60x<`zfa+w|4X_ECkbB~mr`&l0k*HfRfGz?^gg|tvAQSfvU^=-(_G!CV@f3fy z3BH|;4O**a<F#>FZ9;o|GuRYzo;YP5<@UY2EXr}d$-{X<DG7ohE*h7e#$2_bG|i{4 zanGHC1VHhO5Xb#yKy_74u<G{WaN`<L?-Zo%r3$9d_z!Hy(j|BbMBw!d!Exd%{q!M3 zT-d7l&1RrVYNBr<kfcogDApU@PD3||vAqEB=}9w$(!Zi5G<4VKSXa2|MaTL~cmM8w z(7PM1;hCoCwE=7=zPn8W*x|d|^`)StATbl(QcI2?cd3DpYTC_oD=(-3s?aZ!vf70o zwjn{(5Yj}$nzpYqE8CnumJr#ZWQkb0akc}k38)?%`=cOowAw4QGJgl-cqo%s6LNX1 z9EO2OGQLd6tBE{}V`wqb;QZsMR#qZGZMYZgt2@57)?%cgij9?(>YmvQ!M0AfK?Dl5 z-W%c&9hz=VvcR*lR%Kt$@Fgr2?NVev_t9wzJiFL}_4ul@lDGT%ZXJLagZf0^Xf@M- zwqj3i2ty0yJmq*+O@ql=<>#Q_49(NBZr*Iu)b+vgVPk<56Ipd`j&_)y%4~NpIm0GQ z*2lA$UK4DB&oowZiA{4QuO^8(PX}y6u3S`bEfo3mt-XR?p)gsKJkHk_qMN2nkI`ix zP<=!6j=%LvW;f7e097UmmLv>VGXg@eB*|Dag2V<%6L}CNQIa$(pdCVjfcKKXGO;8g zfMgY9;!#2($5s_A2>_;LnE-->71gmLLa1xYu$lk>h*&bMAn|!WAfyvOU}=&hN+R&0 zCV`y<hK2!45+)=tGz?ghutH=NK-Pk;Dd89mHHs>q!Z%yX%PsRi&*ZNgA_89U(sXGl zO+A4JWMBdDpr}4e*Vj|#t16EKY?$1;-s>h;)T{3_rirctfT1`bVjXnd1SUy0t~c)^ zRX23O)^$-dEuMja3|`j>u|<Rsiiyz5dkk#bb6wXI=EF-3h&Nr=^=unhFK-DXMhGF% zCPdeH0~x@0%K%Z-bz9I4LqR?dhM|KlNeoQ=<GkP~1_0=KLYoNNZ`pO7xaBl;y}75% z(lsppe*i)7ECOH=PY?hsUF1c>h|nB7X=E58FX~pl5eu#OLJGYtbczF7Tz-N~_S_iL zeJ&v3Xd13&RpDRLem;GA^W$3&efi4|ZEqpy{~Y?(uSevet&e}X4`^%qp)aT3er`vp z54q#H-%$=6xaGw1Ycb7k<0>0Z{KD<aCvG`#K>3~L_!}4PXR}DRYXYC&@bq;jAH(A< zh{EYnSBkp8k_Ql0G~_i1a5oOc!)V#pO@b4f_8dRJ><x!zNX}UI<&iND_;A-)*%?_D z$C}A_jB!B?t~}wt`7ox35MulS3KB3|*Gz{nHn>U1E<`-Xy7ji9H6HdyLpH<YRPz&C zY{E7nnr-N(leGV^J*9Mey_5)JI?zR0HzGAHzOoVj@6&~WC<97&sn#*-{{AVB&Fs@3 z*pBkV>OvGp_2Nu_O_nt4EZ=5!7cAenr*yu?j6j)Aylo5D9#&ri*pK|U&gh!tmPULu z9P;D@V<+}S61`uTNs>$`mgwh0gKOxSmG+q(&UenVSDpbB3{Eh1Vvz2EFr0sQwXM;^ zNphHK?W<p<Ph_F4CzIGd0KL${%-5+TLI_F9UxTW`K^P@?sM+6Yr1w#G2KXRy5a{jj zIi;7SIeN+#IILOrumvBwZtXAY+)ejk%u5_VMx^GkaLFP)GDwr2334Re*P)HzkwNNf zJ+*xS^0S}7@*HO&LF|&e0|Qb%(#E=(jK}2X9>sV#e6JK6qJneYL7Z;5MU`ArUo;6X zikb{+n<nJfCh%c81i7AHwiv_`IKmYdnf*WP37A$5=;}6@d6DqxBMthCp>Im2TOHOD zO`0D%+f;Q9J)>wx<4f3Y>=YED925_BHx#FQ3JeIbk=JveUcRY#C7bVk?3AP`lwY55 zZ1!=Dzfd&k7omhO(yx63KL%e%Yw`ABGH&1+grPH<?7<u0*%E0<ek<~9R~6L#zJ`%& zQK}5lpwK{U?nN&p`0$F1_Jr`5Hqsy9TLKTDrKP`>{+0%<fD2pv0ez%BCOn~K=I7@Z znv^yd;0t>8MNzsOM#6@8;Qf^cMQNMT;TLYJ-+p`jwl4%8j3FiQ!OHs|FoaIMby*T$ z%<8^>)2UPKVe>cIq;-^@$d)qysRuW9*7_q`2pm#J`9f&vKt;mS;Q~(gFBnWeb4F*z zg?-BR_hAxccecBR==4RM8K+MhOusm-ehqzf+m`fOnhNr{u?aU3l6-&M1zjC9%$U=j zVcal+$YpjI`L1U-a9D$?>Ci!}qWWbpMm(MTOy{kf4?3OvuV}*4G34hAQs*}K&rbgY z=fCt>&M8Q1PM7HDV0zcaJmCz!Oy@2P6IR;c$!7V3JmH)G3kAPUW%WE2Roq7h=z;cx zDpns+EkS<Hw4%@j+il1#bXyC|y0Nk4`VAn=C$YZ?WpUMoILntXM-<~&KZ2C4%oC=v zYv8TbJ3w9Iu$@k*8jqwCNOD<<0xu7S1G8OIU01EO&0XM)K$cuLsoYeOg9eA~g;qw< zsL<V~s+rb;&Vfkt-Y}+unLME|qUmvWIIhBptg5Et{VAc;Dim5JVQN`j7j2n(z1^<Y zGx-uzJ5Z})c3j7Bt(u`M>%V&6@I&OD-=fiy)L7xRpoKjDN_hP!ogDr&Cl=PUKIXy} z<#fmihQA{qD6}a`%U>Uo97_k+fojdvYopQVUQhtcnxMZViRz9l;3sQqrc7jFYBu8D zwDS1^wGo>-3~)YQ$OFy`@MxV{l$-q$vvoz)Y{pDD)`-b&DteyUx;F=hHC@ju76FQ{ z!l{$c)+0-n8O@%3IPkI!=OL2s_DO3}Xy*-2v_&}HfcybiGRxytqj2zmAtZC@Kfq8d zif~6;KOK5Pn;wygt8#89VLX0hj;+qdm?tCY0{HxDRSWyGxW*^nsvSiv<oGJO2|aLY zkae#;0qFUN3NCQ#-}*^S`$_0>nvSXXvp*|xM{Q|*QP;ni`xQFUcfKR(;w&0mo1g(o z`g{r^)383^T!@wiA^ezN57{QZivp0Ktir>4NXPV!ctVK=?)D)PP;hMm0}0c^UU&p> zel@ai?$cl$2E0WV_p0l%=|K*dJDda`iLb|d_Tfu;@V3ouiQ$zZGG*ciwH5=nqL>^} z3ZuYta~Mvyr<s+wj?^~<ogz#5A~15NGut0mOUbwdts|EZJZ&mDZ)0XlP1z^ey+J|` z#`CtZB{2oEU+i##Mktx?GIS|py-}V&kL<>$kE3}lL0IP!X5nr7xzTi|P7uqlo!I|; z5^caS*?A^ijJ-F>!Nt$}8$C$i3&vB@AY_YcPG4>c?dK3`F)Or~t1JeV&+{6*3`ki0 z#iVb0QBSAgs8q6&7fo<pNR?nhMX9A&rDuCfiF1COOn<IO@5PJw>Jn_GKUso@IZuCo z;Ze>zrGqz@Z+wjN>GI)QOAqh~=Pxev$z-&aSAbWfQ#>+%o*Z9d00RP*YB!iA_@zg> zS5cT_BTy=_cR6b|)V^04a-#`|5vMWqE~V)wOYm5FrgV(bxqC`KMd^F~@%fS}abmk@ z;&giAF}2n~%XQM=QV}xIgYcs7GTK#PD92A8c~Ka#&?a|0Kv>v>4Y7-#jNlU*0Y2h4 zxAI93;ALA8YlT9aWlvVRDKi?4lF^689h30#r=K%88I54V6H0du*LzX5G(t_wDVOzy z7UB8B8r{K8nSW&DR65GP=BgIH<#RREPw=3;a(^2k@Q9#)@F0xM0`DfkmLa_SUQyek z^uVK{BRuwpl>Rl0jr7f5Q~2*H2E5Nsi{xv$O)6p53dAEX(a8tnM+mp=nqb}dYfAs{ zF~JcZJwWM}Cf@sU;rF7*SzL66E(v3vK4>Vv%ayOetBv&icaBDplmE&ppQ6zvbP5d- zQY@09h)|s4NsJb{xvJb4vP^<6z@(^>*?zVh=1|y!;_YDAlI8W@^x90ny_h-unbn!z zx-6%J{_fx^%uFA-X>|?bwbh%BOwRzU=5ocjQ|oACs^6a?s$c8G#X{XN1gT=06-h9h zx<#^CV!@8Y=a_}NYe$wd&n3LJdefz~HN1CbeXXh<@N(K4Tv=N`b9riNL6NKN*w2;A z`A*!f%F4od(Kf7lR#CEb%dkbktX54NNA-QUdR@@0A`eBa5FJMU4(=lI<nHXs05}e7 zkBWHA_Xu;itV&4i6Uk?xH}Jk15B{*we)UE^zwzpJVSWAfi*?=f`RVJPUSEHDeZ4R< zbMc+$r>Cc<&rkpJ`RVC*&dgjK^1JHwyZCUp@yww^his+e6&^Xl4;^~u(4j+z4)G&L zU;&(*WjRb7LwBGjj`T8r4=RfCiQR4O3L~D=nxREDY@gUZMR82zo6zoH2>CcPdtP{8 zFJ;g4r_dga4EE;~l;fqi6xVISMAr0Y=Hu}+V<$3!_(VTLI(-DmC`l&SKHF@RIL%}z zFJ&k-%C~n?HYm-gDpe#&p^BiYg7W1|s;H{sc#<6yPTqa*z3&E0yTWP4PE0tToM3Ev zE=gW`>7|#F<fSa4L2w;ZY`bDtD$b3IfK#bBm8_y<<!n~|PW@@G!H<F+*46SgsH+wm z0suBl(wM5e#l8VlzG+3_POwNl%PCVcujjYFoG_;U&3~WLAM(#r`YHY<N?%=)>QXKJ zUwY>s`$_)BW)&prtK)A1O>0*dV%#_=9ROWzVm}sy=paS!dMtew0u&gpZgpk`@3gtg z0*nLZ^7d^#sDUzfa?9!}!0PHP!?$v^kav$<zI?>Z7ydYQpK}zeltLNlD2FF{`WCtl zT|hTRu33Zf7J6csZI=(0j3ijlyJ0=DBJ-?9(yFAjYssyTyY})H_$-(c`XscP=)pb- zeG+>O@JYy3bVw>WwEv-V>Z?dUlbxE%R!>Z2vr{LkxBpT<pDAZH8%d*)G~S&lXENnX z=8jA`bN<UjCR2tnuLnAP{rV^!u}esJmXL6p`_sks_2N2X>%&9XwtfHN;^Jb%wlCOr zWZNfy#Bq?-vM3Mry#<7uV3RKPqXvX-LW!iG5krmHh~f<hLbR0{pv?eVK%~Fatqi-% zlcc5Yr}(G3OOgc1?#|9GACEat42^V>a3&hA0ERm|Fv7VboFB>I?ZIFhhU3zF5ZvC> zZCh{N9t=1i3}9A8eU)5Zk<so3NQwYLN&9xFF#ch|Y&n+Yt>7ar_x}mc^<7K2<L*ZH z&<C>ui&gT@sH^7|frP#nOaFf?#KRvOrGKG8YmW{ozehN5ryRX$g<j1NOr;y7^-}F` zYrEfTs{kOs|HHs=5QAj(WwDoiXh&}1yHqMxt|2c4Bv@YLQ?riY2i!@J6PA#O%v@PA zE@Po@uK*vLE^x9!4fJlZDL7_jQZcigPIjgcIX5vsrN_}(UhZ&3ktVkWPZMKv(;y0C z%IN}eiH7pL^foV><2;x3Zrf9jNetG^n)ZpK=q`j*D#><i$0hc^NLm6gSF|;36X>li z3Vw;bvE=n2^gTapfG0GrZ-G!2Hd<BQqjWmidBse^HVJ74C1y^J`eB^DIopTTt_atk z7Rb}xC$$endh`FzG*p>+nF5m)+bIX?BASFZGNvpN_Y2E0KU@rI(Nxl1wTWD6Ph}%M z=76A_rA5%p&$wCEb)t>!y7a6-DMFV9fMM&(%yLFuDMvZyZ_}C4lWg`~fBh{VuD1^; zAuIB-#~y)aRqmnx$g+m$m+%OF0o~HxVasFa^#}o$IVQd^350VEyDQr9qVOoXLamK0 z(-k8Aahp+BjEd8ps5O^hX*1rKP|KHXG6`)rVr?0@Mu{uQWKA4#t&nJ5r?XB4s_Ttv zM<!IZRH0@R+L??=G%E+){fKjon3+twVAKTFk|`m6wV~@&q~YA`lr}jC|J^|{-KdwB zPGdj^vxc4ip>1T~b?LTM{RkiNk5nxoy&}LbsP$q|#ti`Md5tW_VlgOoii%QPrgZu9 zOHovmVy74sMU1lz&%=N@mW#!@ntm$?e#yueoViMO=GA(pSj^~;yQPvVvlqgm4M|Bo zDSTKuXdQWAGx4W^n)a46T`ca4UfEn+@qFgq^G@2l;+cwvGv~^<6r8o`UewG_9s5c4 zN8%GknAbSBe)#B7=g1LfC}pxd>Hg@^qYgqC>?_Sj!*ZergIbt8vb9o?u~29Wgaq`; zYx~#&g!0ITE>gWBVKGctB~O+t2Z85wq9qqd$ZBc83Eqwn2grz>WCkHbkZ|pL_%-k) zTC%v<7YFkRjm0w)2Fe~kmVD_(kSBOmSnoK9tXW~&7$ZxuLgnf~7_`m^x%(WUAM``9 z@=H}U@DZb6{P-6#1$a1K?)9eZ`Q#U7xzq5gq<-w|ZRgKzI4h@4-*{m8gXIcyoFbUH zY`wksJphIlf@@-PR)sGSJ2|{o`tz>DSi9J_v$j{{j`Nvf37X!9%O?!BX6$^iXy?-p ztGSkJ;AL#FNg&1Bs@vj}QwGi@NN#y96cwg)jKz*3RR-aR?vu&YY39c2BR-3Ll6M9Y zz2BIro^3&%XGv#%9EF8i4faP<yQirD4<7$b3erZHNnZ$ld$j`&)n$J)K}cnkum?X| z&IN2a0>?}PCh%3PPkIygmuf1}4SPQj_5h&VzQY^^v8!w@MLVtQCEI3uKtxAm<PktK z9;x5I@t~BwiDOvUwA8KvrF)ptcB?-0)TwTd5X4ZL?(L;1F!-Vn2=r-&Fs7_x<C-U; z=_sJ+uI%d4XtcCM>C)0@v{Y?xXW904B@a$>07w1zhvs5T0B;Ap1UQ6+AVhH>6z!tS zN09IqQW+cX(oOF4bYURodYc`XRbC3dg;IVSJy0pY#Gg)NG&=~YX+9mHZI});8YcXR z3V9o|#=*p!l;cTvMKBlBs@N2Yb^#DPr&pw~jiy!ch7WtT?ePED%4VT1hl0WgL}F<m z1h4my!=qqK5$^-!0!k$*wOXDB47H@TD<Kdf-niG7Vj{pLvPV+DP1&dwkk8!#f-e%% zm3%p@ibDBV2%aCso+<(l0DwTmrfC8o5M?KH36b6_h%z|@%L1@0fU-;(6t9SKOzJKb z<ga|xL=Xv{5Q@TzDBgXKjK@4L^Zb2^nj0oDT0#)8l8`dfiFG#`8lq@EqI>fm<^@^y zK0(M&rK57mko%HyF(e=fK7)39ddX~VEicEhfq4Xgc-52>3;;;dLoaFd_7E|}3ng1< zhl_zb&Z;)r`LWaoY`eyHi*%2k3_7?<qn;E@QEU<5K>T=ghIGVXF!Sf3M=-cD6@(-T zBRKaHvF?JhePczuOu0DL|F1#E0-}!wck{1xW)aAcCM(;DvaQG(Fd$Y|!|s=s9Z|qy zdhZm<7AL@QrQI93_0`4RBJhBH3ac*;u*Mtsp`fo}prL1d)<JQzt*NROI|kT1Z-e2) znyPB;W{jLi|7fu#$uN~iG@Girz`+sh6X$WjkkSbCTS@uVu`zt2tZP2FvCVN*yqb(H z1{LZ=)&2n$rq3hoV3P5HQ&Tn0kxTpSD6gqQ>7UR)b^kQ@6AE8#lylZLv`|;fjvEb1 z9ZF9+k=uC4P(N_*2bFtfGc<qhpA-D4`=?Y0IeR&qe_Wb44L5p|^1*vQpc->Do85y~ z8ReV2L3>J#0~{KVt5P0KkpwqgJd-1-w~JIk>LEi<+g%qzH5cT`%2S90OcusF9Z0@d zNX2=jHu2KPf%_?&PJFmUspPmWMTQYI2HiMzbeTu7t_Ojx$B378Cyu+zQKXxQx~?NF zp3oo6g4kbLK+`Ny_;~xE@yp)#d;s6`DKdYAF`$%AI~^}X%`lFQOmV%yGI>7RH3F*d zW;}0Nf#)ij5yxQ@g<hvK{ZJUkMq72gz%oV2PucP^OMOW+t-y1YA6o>=%g2u|F9#uN zI*Zy4&~hYg7(IXkZj*Zr)j?3I*aWgr-p<#8=uF{XL^>aaK1*?}0Kd(R?1D%waCDLY zZFgzb;#-h=d@(}#n{wTtwukOUw{QU5!qBI#Uk*Pgoa6ZeRb&E|W!BF-QG<6cnaF+A z3~+Es=R<_F$T60!-Tm1Pzc{i4)2$qYd_jB0;N6M>&S$gZG<L)MCbj-UyujAGU6~pt zIBpBh?eM~1$+DO<mzzJt3txHo1RTJIsMc6uB2YqH*>>EIxyBo^+kI_M6bjwb2$|2i z9cZEdUm#_@Es3RSyx{|?n1mru8wfcFIS4&~fMsh&5X4y{RR3EG!BQN-1E|k&9EUjW z)?c9-u5vkdFJ2XNR9D_EeiZsl3T7gQrxnLMosdWgV^$&)2_{2zqTW{HH_u50M0QOz zzxy_REwbV~3aToI@`yxh!kN2s)pW5!<VhkcxOMv|Y_K}DsYAWK=k-16P&=(zBOKk{ zl4UuGNep{}w$ZbDk3Q2dqLsXnoIRT~@|DPFJo9MJ?rmto$Y$--%&U{9&dD9Z)|=F! z(RviEN7SLsbw)b!xl<>r+)Ufdwk%HKxLZfaPZ><gl|6|k-|uB(1ne;=g{sJV)dWwd z_X_wFgMT?)k&x3+nA;h@Tgt6!s+j?ZCY`R-C-KsJa`33R;X01HVLm!oGtITzXTkWk z+s45R6N2G)$fpVU2zdt~&$8bDI@$>3Z1Km1i?_g7xOjoxV2c}EcI|HX(3Y`wqOMP@ z8Cwqxhi@LXPThb1sn(FrX7ul~vO}mBM>k~CBdcL~a{*dN_yQaMhjXTFq9uQ43py;_ zC$xtrlDK)?Y$>&?V^f?a23Ma|So%7G$>X_QZ`pPz*K%mvtvNK4UN30^YLPi<p^bBm zvi6T#d8hTF7g@S>?3ktBntxk7SF{AC<pe}f3_}sEz_Cmy#rr;|7kGqtLGO&FjEMPG zUM2N<QcG$yq}DBgpUQ^k3Ty6e?xi{-1Npim_E>LjdJ6hBo`Ij$JqWXI8{0Pq+F51s zDZk5)cs~NPFfRm18cj0p*vF6fUBuSDwMeT_8@NLQ>ctW0*5)u@9NsX)<uF_h&EbC$ z1Mxw?BjaE6^`=Q8N+a?w>WU)bG3L>{LAVMx-{z^za5=04p4Z>6aPZH+jcJl-bzBq? z52s4yxnltrS%#Hg?2@q!y;w0X?N>u9%+RR76-`tc`P~9FG_GdhWbVF8W%T=p-w0ma z>^<3*TpYLm!M!a~&0!whw)+p+i;dehFVF#?Qq-yTso>3hfcE05PBrnwgLm)J>FM(u zZw@~7Qh8_&SDLm6?`dLJYCqYF+yAh8Ta*t?HM-6HhivUOWAh=pd-sDUM2+g73f{bN z{`B;;Ms;xvFraOK{+okOE&f|F9GXK}v^h@Xv|GOn{|An^Cb!GIn0q_-agKv(R+W>0 z1`IV)ox?*4(s1qg*7kT_j%n(`pR8HFZZIo68I6>FnbO$;MQD(sO@U#Zu43-sO@M?V z9u$qJ8f0udW*JzP?-JtsTc{Z~o2Xv*Y~=aA4}fK5djCxhz;ILzAf)X$2t~<6qGE)a zEMcVIE((HX+SD)ri?Sw50x}HM@E0#wy7kR(TDtW|e{^d@cqrm|)$~2z8B40`|85%l zaU2GgMWZJmiu=X#&eAf#((+E8WkCS4Y-p;jst;S#cDzpDTTa}JK$HyCHZ?`&tv%B; z6-C#nV#u1I$r4f&Lm_XI66uaRq(pk~K`D{$xI;>$2Os2kj@>#!41R&rIh*ToT;)%8 zQHmy04d^x$xNwV#RusE5K?8mVRrN`@Y8Y4H<c%Azdiv?7pML*eJ{aD2U-;l(3gqTZ zB1Bv08-#oVZGpD<KU<&r)a~Fs={^3q_vGU5L~)OhJyGO1juW|K${e3t;qKvH!f|pW zKo30$XpvZU7P%8v&V|FnoAY)R$3A}oVFzL}_lVOf*N7BlzNXj&F)H2;0!1}tS(YtD zLDn|{9t2&D1~5h+cFqDmVTf*u=LK}Z2fZcOZ5|K{4!|lIP$NaK>sKmS#8NR<EkZ=k zG~f_yCu%gZ&F3~6kz>PxU5B&FU6-B<4oi_6U|qj%*~D1!MkY^zqst{Uxf9%_*nl+s zdF~6`*ST*}?lcYie9lj0K0+z<^CU2<Xm7f{DVAx1e3Ff~VN)o54_5)*0Z~K*Rom%@ z0AR~)s!KsB36Z=!$RC$u>f&zEuBa)a-$&bHS_4ddY_$uMO_)`AkwUNN`M3j!b6fQ_ z@F^>|!&A8NXuFLL>I2knKYAcY%@@6>DG5B^VY0TXc6)ujZL7klHvWGtvE^m9gds3u zXKQPjjVJJheKHuwSr(5M?>p6QpMKqN@kgh5(>(chQA|!8*LZ*lhzKM#=yoH+8g8!> z;$dx7#Rxw7h}UX0I*7+c)X9BS0)W3K1D}TWKB!9*=GN9eN2ZC^5Yj)@&jMKaW&`mc zc(nqWfqa?HzU(s3Uq&DR59qI-Lg=Y)pD<1S^x}_(uRGmtpRN$E9Y4{OgbBht$VSxd z2C6hs1|~CF_jmQ}PS|RBj{+}he%^_6i~!&=*|$UL;fQy{{g{t13s1hCdp~#8P7z2B zj(I3wv~(LlYNH(=LGCAeP?=+58^)6<UurPUbWxi_`=aa&W>s5*jMLGP0U8frM_j-{ z@D_pJeK9+^v?=U`SXgPV2sk8sx8w-x&eyUc;1UZfa3fk?n(_FqQ3>Tii5gv^$K8j^ zNj(pqiI{DXn%onZCaDh$!UuLEQw1*7WaS&oJQ4>3ksOpojUJGzMO3@lABf^$|8uKZ zW)jOgwte@8*g%AYwx;)7Cp*NKz3lKilKNMKe5B?Hp*|t!UO;bk`hd3I@}p^{9CtjU zJZRJ6#;I|;NlQvV#tHdfBhIR7GK9fI;znn`6>UHp0BtIiTZoF;N(z_me7^f@U@CU# z#sBY;cfOOj5kj+#y}gYYLXqg%b_r@^d1*LYS}sq$fNgu#-qovn70`y@hVvF<;(68& zwOzM8T0YJ9$d}>t@@U%Z^?IAdJ!_$17)H2uPqEqS^_uj86Ccgouz|q*1W$%DAsD5d z&uCVOMTW_k)H`6d<1m?mM)$X_S<U_%Y_P=@25&7Fhb3fUzyL;4G+B*Cv;(#;Sju3Z z?E~;}N7ixp!#d&eAcF(oc&HZ{X5yg)p@#6$phE|3PIgc>$f81}z<X|lv7^1K%-Vn| zSL@jISE;YH+O*%VzQ8`rK0JZZ#eT`=b7o8w#0NK|dR!=FVFh5fD9?3o{Thn-7U!XT zqxeN7k4a&D2POq<=wf8;V(NZzkL!+0d3<|u_?F;6EU_?f!Fh0blRUdg*u%m6>n`6L zFtNl!EtXhdL35K-n<R#%w+06SF2#=v&Vz@^=Cfq;=yEXsxJ)<}FaeihE#OjQK}<F) zve{hs1JGOG8dq^I=H89ZNC>ZO@7iRof+c_j>(I7Nw6H7InI<M{lQkMJl@v;unuk4@ zn+o+EdeNORz6Nq{K$U{m^OHqFkxk^}z7&&eGKK#eTNa>RvCZ?1z-cVcJeM>8bw-{u z%h~{)K^%c>dps(~=Yh9}fl;vdg;7)BMZxxt7}o$i9}@zsT->Y~1VIjQymV939M*?; zg+y=KuKqG#%9vVK4WxvtUaQsF?k@>4wVOhqX=)@o!{PSvRjb=68-dE(_U+>}UcuxV zYKtO|)Ht%WDDgZ1_Pu0})!jyf)w<Aj-7ySa%EV+tQ*o1|_~-$#DA-O|m)8?~K$~y$ z9CttWcJ7N7tp$LGHr|5SWEV!fKava(T2g)&X4PfJnh{h%<X!?O)@IYZv<`L3bSm}@ z?Jr>{_FpvPSD8)MfH=1>tzDN}cY088REDxa_F9Mjlm-54sGtlTXI0_pjLCi@@$xg8 zlx%G!qJAd#mX^Hyj4mdI#>h|+=!_W#n|)m~f9Dd=c3|txxRG%^_m|=r@*n_K11T90 z67xI&(4g(vqQDEy(amykv$ia%IFpHvYd3Xqw$H?wt!c3FX6Hf$WvD63({rU;TZyEd z$vtH`*4T{l%BtfGm2;;P*xKiDZ7SizCPJOb^#UA4oto`6eIEnxyd<`101Dzov5l^m zb?DfF7z1GKrCNz6o2Dm<nZz50b3WlCd+{fmdI&g|fkf?hrt)CYPZo<u#UjHQ@TyST z5uZUuCl$`=q}l_f^NB}vsrXV5zbR<2>@WUb0PBnYoMj>eVwNp#K)AT6zo1+HB>ja1 zN80_2-LK8-dNGHn?9&A9-~c`sbRfInmnh%J9G$pDj$NAb)r9f~2ah~*@W><2Uwd-@ zaQ{gL=bwFc@pBCJuU=hTh0ii~bFY=>m*JpYYs+bWhH{?~(=lU1M7j~Y;5RRQrH)6g zvOfJKV&~?BSXg|b7b|q22k@xTa0JwstY*pZ0qxfnuQ^D;;&V6(Y~5fE&ohVT+pexi zkti6F;tma=%DSpprlM$?ECJC4_&&fiH4i9I5TTl1vc;b|GJQ%A<|2L$3s2ooon+$z zA;|N);<Vp-vHNPohk$OtT`Mo`U2{!O8;ST855U}zUS?3)vZ07U)G2)3iL7Xvs+yLX z)0JF7m32}2v9+z{w0u<%@>~$|+|X?soB2c>cZ$cK73E!7x?hqWs;hQ21tIChE$KU8 z*6%Fb`;;K`j$Qbp)yXozvd%zwP{$5rn>68Z^g;CVn1kE_Js|DvXbZeLP6jrv5Qfn< z^!(2VW#IDifug^ZAKI7gz%*W2PmP_Z!KzTNE5SW}^J`H%DlK$e@~g<E$*M9TvK={Z zwbj8Yex`lvX%cUyR>$Ig0$l5+g;399e~t@6ZDFA%6!1Z9p%_(t!S40d5tA*+u4ACG zFGlO@kysH%bWFLhA*wr6uxUSN9I6GEwn&3{P{VNT&%rPY7SJ)xnOqb_k()U|vZKhB z1gr+`4^v0aA1393SOKVrg)%fY7MuFIBo?1Kb2KM%y|h1~=ufWC2q-ffMWGGQ7OD%` z4>u_NG(94T7YN;x#A3ff`@Q2@^R|487x$t9^s{u!*#V^+0@f&16iPKLGyuy0G6uO^ zNxLe`2|z`=BH9SzC4Fr3NgP^zTVle0Ea}P_F1)SKU^5`0#M7Yw55dvApA0;;y^##u z%Pn!r1_#i<OpcF&sl@nue6dh)WxBQfIObcfyTxHncZH(hQS|rYobJ+)*NCC>{qvzi ze{gVJv3T9VAHXk4ooRB7ieA%2$YH12B}=N~C}pldc>d}WrK|^xBq?iIkY1tm`>JJ& zze7}ASIO@Pc}xBNmmfO)<u@Hae*E~;Z@P8)`7fV-=qg&i^-Zg$`E|u8h<`(JrkNvu zBNhzh>%Zxy(~mEG?|ZAO?|i@grZ0Vbnz~<lll^`~5Sk{FM@7w#@DkMbmdL3>9S??h z8+tgjumS+;Ny>&BBuWR2i9sZ75P~g?o%pXh==j}*w-@d{emsBg+waXEzxcj~?m7I6 z?>l_YLl3|1bw{5#de`B@?VCQ1pTNC`9_oE+`|wQ>NdBu|v#INwuX(lq8tu>_?KOAy z9@u&izr5FbIeu{Kf#aP{6#d+F_lK{&@V5Z(J+$?_AKri6h1beDTG|OF`?0agYx=jB z@ZD9IiE9}5<NkK>hhK#qdOH>|H)1JC(kOL%AnfOVNV6beBxO-LAW<Di8l^0}Lg{7e zS4{I)tjo_m_uLE5J-5HLb?Ume3_o$*@GZA)ZN<lL{J`CxK6ma{j(_0BZ=XN^LaM5d z(?2Vy4=c*UYT?i5<Bw=Z&uZG)qqp6?@Q!C*duI8yuU$U#{=46?@MDio^*6lX4d$cz zbY*W3AzBlRiSl;LtOY+oh75-OCdBM0b!<ld{`-Z}A5r>8rNSRel#1euFY*^(gimMx zRCGS3>mPH9V914nyqrDt{6A$+!JGf-`F+Nj^GI0pP<hFaN!^kRLc}H)N-jxKv(#w2 ze3@R}-`}Tk2H>k@cYi-s)yMzYQC{_^>RfsJ?Z5Hz@7?#m?|$i}m-)Ya-}fHK=k*F} z<A$I*48@*kiFF}~m>Z>blrmC;lq6RuCBGvuBNyUuKEFAG3BN<$^PU%9eDSYeeDOW+ zi61h=@_YJ|Z@-xR*U=YWJPK0wgVp!M`A|updaZyK>@i_Ls|tgpA9V#g?vL#mtPTY` zt_9z+nDa@Nwi=uECE)j?a8iRRD>JunI$#54P&qm*5^-@RD|+>SKD%|PzxC)MJhIUl zEqcE1EuIj|T|=(BK1R+P(41C;qd5B<K$D7Cs0#psY<lY(k5oJUh{qr>uc#~W5w~nz z*LB<CBW{if+dSI6^e5}tl}lZN5aU%0j%}qfgFa6p#mEJUVkzNCs-X}H2CoE+PvHUQ z*EMj<JekzEj&sPr5)PggE$<ULDxqFH(UMDSF1YJMAW0W5IbiVW%s(I8C}n@OID)V^ z9xcKTf+&9A`-kb;uN8jqSIav9jKbccT*RAyei+_c`stthi_&-PQ<$Se=vC<LIsN{Y z=&b<AUm8%yRk14u{Vw2f7_bGc9^QujHm>5-0H<Fq7QYyg!hY!X-9bOt61K5DFzgv5 zQMVe@mQ@_N5gCF71Gn$8ZYvo)3?3FRnxzRq@s!$(#r2;Mv7)}EAk&!g3)vH#(i%Lm zMZ}a9dcF2k+!4*}m0(eL?gFRWc$X|9*q8C-ttaWYWZO#%>gXfqj-BYzkE-ey7m8A8 z@krcwcJ}k!vP^E8Cd}nsQ65pL+_}$`6n}ipzpL<sDoMKH-&xUU7*?}?R}@*iRg#H` zTk(|RjhDM5DI+SC7hmQW26x5W{q$7p_Vc2+QBZY_lK_jj@$4OMq@+S9sSreS$5UEp z4V_0QCCs4DWrC-soz%)vk^p|%vt4Dk?QI_8Teu3u*bq@_)gRrXIpG=G3mv?C20d^K zUhSW{w4fxRM%5{ZNs#ju3iV2%<Md5U)7Mm>P~}X`1e==u()6|F;LgJKJ<HK0gtZ5p z>aXGjr&8|@^BQ8osotJ$FO*gdYU_>4p}{=kjGm^M{n9dMIOw{3i0d`GWWIs59M~-$ z@PZ0=>@AUhCE5c3G~Z(Q#d6@oGU_kw2m%pp`JmxryQ5W00L#I_?d6G4v1Yr1u!ufF zv^Kuu^NVRZZR{-d(Le^~10Neg4c*?h?P4B7<rC2Gi6Ox9!XiDy#qTaPfd>ceeVd%S zlkx$a30$<D5JVpDx-qCsWj7@YMCaL*C<hUIQBgaFXlImlpqdtRgWUdnPC+ioDWW13 zqA+QhRR!#;QNZTbo;x)h@&ir#p@^h#Mc+^sf3?vV3qMEM1ozU<ZBA~PN~^V`%+5=@ zs?|M!OBS&O+i3_k&*j?CCk4lDmYE+kle8O#V)~Cp*HoIzZmn{mm6cPD$gj#>ovH~n z%&2lU4Btdi=yYcrT{rNRwK_-yRD@lY$;CTOOH(^<2ZS2Lg0O|44({UjH9QZiN$6sX z)i}-tt{tu69qwh^8@YFLALG8reU1Aj_Z{v(asPw+OYUZ0&Ctl(coek%0VUlS<06-_ zK1=-;)0PxVI1#qdj<CLqX1hp{(F21N1&O$gc7)zYR{Bmc%(;Ytu^~^)suX;3ekYLR z4-nGUhS)2nuzu|{pcbO*#ct6U2ek1B`eu~kGTdye?%p}JjjH<pqPo8lVeBuCEywkJ z*U^9w$MYOQ^ba7gEI=C_K(dOU1#FLLqHKDaZV_VXnrF(Q#`YMr02CQPXX9BfTX%W6 z`#7kYWgC|6L{2|);sQ)Y7!qVrhM5yNx@Fjwrb5(DO(<enlm%q^y3BZ?#qc{|{~e1P z?jhEs=LpXZC280ad7kIR)-i-d1kEvkr2}7`vS!1p+hb9nD~=`!f*?qmqv%1z?*D~x zs^USn5E{n_i5MBiQ($P8uHe=Rm^8K{CxT|1kkBWlLrqv|VMVtz1MK*rb`v7UBz|~S z*uxlMQyU+_a~+N|ArH#C`N`pQr9gPm`F$SZEs(eP{um)yume}deSRR6W)!`Ugql%Q zBQc6j^oksUm?H1@iqP^!hHfrupg`N*q#z#LviS=pRrXW6tYgz)vZw!oxK3_c8A7wc zc<AICkTi!fl2hM<Jr)E!FaUYAm4IuY;qWwKt8?gYEd@#0a$TC#jWA8ahBh;vcMwGZ znG;PHM2MS9?WmzZ3X*NprsIHSgt4!`lEM*jjmi4?{#M893sT+R9t`y13QGlGzy|@_ z1J6%oBzv~f&dUQNJ$HIIL@6u|pcllt)>f`Po;tSeq>t|tazMyKit-R4A5&$-t4qxo z!1Xd-<^#h7$7uq(W&wP$(>Bv<?seRUxv%1QMJqvUk$DIj5XrfnYZgC>YaZku(V+j( zAAxH|Gm@#gpF(66;y|+1g5QT)3L_hQ<DQIA>%9>Q!f4K<dt5724GIa_NfT`>VXs)v z*QGZ5>qv=9U&7$wZWn8TtE!u(qRFDDZEb0SBx{PfsVZ)uOTEYZdr`NyG*SH06%HD~ z-G$Ro@m{C1ht-Bt+#NIqo_F7d6EDD;3ZQB@AovI;s%jzt=)ds=L5ALV+yhyFJJrd$ z!i%ba)TT`|LlcukQVosRO%;iX$g7iy`j{U{m4<(4N75|Z8CzE0ar&0EmSankcH;QH zA30wed>sp(rfHhT%Mw0?&hfkyOO|2PQD|6(rS~USrwIXc>)P!z(B&w1f_sd63+D?^ z4?!D;IS-ydpb0bk0ijVMwNdF!IX<gQ^2|#{ujJ#x{&{0=0;NBmHeym#nGobWF7aO1 zFd*v6pbrQcjQITJgye5v5DFU6gb*0<8>pNfygdF`LSz@>o5!shhMVZNAnU+xzLuos z`C3(Lp05en84Pv^R|Yp-;xz7l?h&irYfN?^*KRcDP3%Jv)Ljw>RzTB4I>D)nnsTU2 z2TX9tx2mCSWCLehS;$$-4qPisCMIF}UAeP@&q{<mxx>F}gd7EJ0CUI=B8Qv6C32RM zFxE@mTEQU}7F<SrS%J&8nfD!#a*x;qCi2`uhs(KhmZDK!0X3EIJFJm##kGf(3=3zw zC;_hgurW+q-$gzS9z`I%db-b3q6|?!;lcPnV}U_`hsMt+lP*9fpGwob1F&o~P>2Eq zlG4a<lmk&L0AhuxK?v9o#f8+5B7o*Z5zR6v`ZnEA*Nf?U?6Q+jCy7jw)es?HmDH#^ zh^3%ihqht|G!kuv4by29x(k{W_4}=LMK^TgDD8X9c-&O}CH$lXO*lKsE<h_+NVV(T zhJlr)3$&*S11f>Cp*3ZN7toiEf^=Df1sJns<ppJ3;^y$cjt!6P(|?*GXhZ{>jxV7a zgPT8TwZQXoP;<|NR%>zuQ8XAt5kMi&<pSpG-7eyX<bVu$)a|a<sZ$m07H=eo-uvJ0 zDZ$dx`h~T%3+qcuf#SWNvG>R0a%a4>lq5?_<DGIGf3yjb`MjE)KvWo0#GvyeG?Uf! zq#&e7)>o4zyt1MMpN>~@IdVn?7vIrK&{#{63hM;gb|;q_DtyrfCWke?iPkD>wIa#v z(GYiqV|cXXxV!Ad0(>@0aqJ_6kQdVIY*&?WBkbCLuPyyki7|VBDJAT9<hdTt0}5KL z;o^tESk(4{+YKm+27o|Q6rPIWayxUCU)wB(X8;+d@8{9wWvl@L0}s_4cE7!F?S0kp z-~!g6H0r!k2w<EvjpNl-kmGGva~P=tP3`Vr8ydery?k4eSC{u_7`tv9Uf?`*{W$jB zkT)=?s9krbD{jhlH1+R^NxJgCS2d^8b)0S|p|s<>-LC6*C~f|CLzK<`ZUTR<^;ujK z^A;{hUeTg65&tm2!gX-#kk+xKUNn0+4JnLZ621T<>s#Q}LA>t_F=+Nz7=eFhr`ic? z*6g5h<TgfGNu=Jcr-&s+m#Mef?K3*gcfB&}R8D7Se74HmKVp9vUtw2ZgPm$YUUTev zd>f;zBtH8&Qr7RTdUPBXRL_9&>FoczY?b*}*p>JX*&osIg7S)ShUzGa6$tc|PO4B9 zCWHepU{o<-GO!_uHaCpg<T9UDkwrz`olYs`?45@3PD0+L>+d22_9<PeAPOF0&MQmV z-wVQTQu>=m>+?Fs1ESs>AF*dY_ilR2+^y)B<F3;M=*nCq375Wd+v+b~Jk!BH&zgH4 zp;S~n?i0e#8{gn`2Ztm-(er;Tkrbt2M_?Bc2>?w(N`0_{V2M2P2?4__98hZn7)L0F zaI#5X`<M3G#ADxwvD#8ublB!frg4XnssLoe;L7nBL|&EE?urv)y{J^d@6{5Y?8Dd~ zNvnMH$(`Mp7;&CmVP@E`;YH)l8)5+;fi;e6XM4k8{{$b<(O`!@t)=t|DXM4tSv{Ci zI&F;QOjAmyf&R0P<NXF?sm$9OmE&__<@TubMOAqsX=Fj@m`zx_#Da7IND#4%+H8ex zDBXuoK$yVa>oFZQ4ofms3$dLOiZA*7mxa4mrYreEc5wvpC>z7SPqX=yW5lnb<+8&( z-~W`M^Smi7jd%YB&~*34dM(3QC-CGYq<7imkCqc%2+(vgcs&G@c=JEf3OYs?rv*Y4 zqliGea8-^dB%03+e7ZesYzesj#k;}>|D>Heq|P^Tu??b@5x(?E;=<V$KKQ}?PpP@5 zFMj{ZL(W2WGJUs)$Nb>&KBd@amvQQgH;DL}B)L-pKP2IFKNQf7jT3HAw2T8c`)pJm z?a`RVs|kxh(9VXI33*De%NSYL{wZ(U&d4$MA(T!Xhw@1Ew;--N1zka&QH0S?w|UC@ zw8?~p$v}1sObTaw3Zj7<9@ju&(r&Q6%B5v3xS`x^b^UZ<W2y4i1)tLIR+c*W5?1fK z;Gtez|H)5%T9)AuUmCfC=FMBCqtX2OLAadQ?b2{ovu&tDola;S=#18E8;Yf+$;h&8 z3vZ=ZG$VX&*N;#J5{o)v;lu4=n|sm2dTw?a6#!I|<hqV}uaRuYuKlwqGQa6}6FS6# zR=69pPS~AW8A5vqDHqz!ql8T*jU+VYx0o2}x9$M}4%JG#RjptkigF6srqhwi+5=iy z>U1dGze_%F7hie%dWp|@Y5nb@L?j7(KMYH%EUP6XsJ|&l5|O0r#x=en7C5Ck{NkEU zDKCf{9Ojl;tu8FCFDxz9>u^Eg-&YjhSCsE_<pR{}OG^vuiwo7NX=SfE{sm1c`JDSD zN&CWayI2dupc^*JB~uav$t;zdVK)fFTG9UbKTv*H;D7K3yzoN>5rnSJfld&1ZE=R= z4(6d|*%PE@%iThioehCR>43D7unJ+6^n0QOa(yVq#GyiPQ(GlA4ALl08hzrBs2#}+ zJ+L`FB7Bp`-~8JsPXxnA<)e<W!+E_98$4<oA{kj?St`Dilch>YRAZj~MzB<d{-^3S z75j?<L>0f6kG`iaX*2#4@@t+xO=-LZu7q`gzO|koJxu8ns#txdL#|K?qip}D^6+^$ z_hSW;dz?u6v1EZS-@zY6$I&a$9{O?gN%XUkhk@(r9;LmAtJW4wfGKb!F3RRU*&QT< zRidV=QPO>TPU}L0MC=kyfF<JSQ>y|4Khz1huaQZZ>*iY^*Dm{SokGjlrcLG%>lv{W zOb9Ps-=R*Vp&;zuw7!n3B`)CQ<zo+}Vn+Hzd0>|Wfgx1d0;r}_%{Hu3mi=z%E%L#Y zQvw?0WhFv|`9UCMf*~%Id%jkdn!m@$J}FDGudx-8<JRa0h&_@<4FU^3u2W4Hr3L{r zpEP;0;*^58A)g)&QJ|Y%w466WfibqMd43f6o~E{`u2G$c$p2qpkuWBz<-vrstF9<o zrbo!-%vQvLd3|4idCTH)a3A{Ix#Xf@TqI=g=0r4V6cFzS^O%L6tl=!K?g$qW6ZGzu zILP_m$9;r*p8F#ABiz?Hj+Sb&lQ2;{dxgQomx^((+JS98fdESdKh6CDAW|Tgw*xf~ z+0q0%@F1_kn?WDSl6^fY2rLQf?fO99F5Ly)$&L3jl@Q|3?Z)v=*YOnf=txyOr`tLH z&heOMM@Nhwm+#^;K(lIU;L2gzk*O%P5~_8?eeU(e=dy*SZphE7R(q}<pYT=Q+8r~E zMq_pL?DgwsS63Si!(?#c#7C|(cKstKPQ*DMLR|t4ST+b_WJ1uP0L#gh_geAzQNEFT zcted<>sfv-ufMrR50G#oT+>gAwlylWIs<?UEHY$kss9|3UmQdhAE!e?k0gVGjul7q zdm<XN7=o)IN!Hd*e0<0pYU&+72vWLpf$dcl!kY&~>s|0*6GJ0hVom1_b1x3QDP(Vc z_lXm|9x#V0S~ecn^F6{CfotftGjEt{%31M{8rq8<if0vVeri<4e$!dhhhSvR;XLw* z{x{P902lo{`~jbgp<3jq55E5{+Tl}JtHcV$8AI7o{s3*oCKarbc&YJrT|B)pKqI~w z(3z4JLQ7B2oI~T7ZP6cu>xAnGd!(+1foXz}1Nc0m;{fpva^HY>qZA_`OcBCmwJ_z@ z>^{lA?F*oRQX6s;LrV6@CE)E?^zYUANB|_cZK;JAcwS5Oyl7aDalhCMWnbzNBHppK ze*r^Dz%&DS$f@TAK@o&LQEs|Xl9oit7Ykwuu=$=B6p^(?l!T>A5%7Av>x%Lds@zeG zg}7J$0;TUOD2gbM_N1WSVaSrPjK`Gffkk27g69dIVW!O{^w}AV?0}tO)q~?(pexx^ zLbjd)j^G$zPUJga13MzXwVUaLZh0-5O~Nwkm%90Aluf_TQ;qRWI@2a5JvaEwd=A|O z+^fINP?K{S(<f#wJq_yTK8HJSYJ`xpUU#GxxC6)P5V?hV)iT@U6|D)9ur(GP=G^#U zquJZ%dvDM=RCfyie)czi_G($ab3~z5T|TtBpc#2Xd&G|h>}wDn@Sxz<1CMVCA}`jK zt2HPqN?9fM?NLiAu>%{jyTB7Zj1XYYk0Zqw?kg&EclAgfgP1r$kgXDfUzmjYE?Z)a zn*)+vj_Tp|T2Nn%0V_<dwI627Mr6VP!7nR3T#LhCg9S7|DcV9qbQE1D<-<_0gf8}t z3u(448e6jGtRA?7A$C$aTdx<9NJ?5!$`TT>G?d&lVhLejedW;;mNXGbOgDUgqu-18 zL~i*0M)4&ej^!dKyqLXU9ef2=9%Yv<O)p*gz3j6=Fb#tHzWQkPyCZn1M1QeiRwfm* zaWAKj-hA$#e2HYig(A=Xy(o{x|M`^@kFra@cWHX*(%*Lqg-)kXDCZzMjB;HqxsZ=k zw$&j`QsNSOej9Nuf!hpNAHsUlgMQRcLs4FLHI0%n-jHTbjXR3)oBMIb?%KKS$=2CV z3~pDy_}2`o^}*rQLA&jNt1^!<wGcFWE9-&(1NLh>z2<{^!Ge=7baOXGx7`+3&wOHV zTh3sA&9Gr%C=|-&A@ackHJ~(5ov`6L0LmW*559&v`{lXoMV|6u4eIVmRBBROYKoYg zSd34kP6B;w7qIe@ob*xFXU}>G!aRWr#{c&T{O2G~q8=lWB+F@|k&1lw=`bW4uhRqV z^)E}puu$5ovG2!O3IZReffL->Q5V1RJsQ<NTsemGVFC1J(-N_9W_mpGB(gybdot8f z%QeDKBkhi8IFG|y?+lzEjd=mmEcX3)wXGBlnmqnGEzn-SL1^RC884=dMk>ovL|89M z@<8n@{`ZHqK>MD@9YgH2i57;2+d}$qVjFaWNM3w=cE*%NtJyS=@L|VrDvsk2XVdT8 z<IPgo6A4vF0?``0qjE1?HJ~d#Z=sm_;&xSQDBjE81s5*?A`T~Snn<9(0nXpw><~A~ z{J1>UG5C7Er__3&)n$z{UM#z@YMx_tNy^3hH)ZM0OmWxmcGBj`X4{o?x*8ZkY8%~U z2MeW__4u!8RR8hsm}=ZDMLxrIS!;oILfM<wywN#UHoa_AlCoy!p67d+R|?o!?wEEO z7{MylCAYn~5;N!SbysG0V!Zj|TA+Q6gRSIWS`N&lCFNYE;Up?qe2Rj!$d?L%{S?~a zC1I))NgsN|+ad3k087F^k}21|TG*6aSJWr2pyjzHxD!osT}d1Fny=|U)Nao-N?GDK zN$CE7M)e;c^6ZWoj8bj(?{<Z_N^&c3;gx?RU6k+aUVf2VZ?|W%^(CEZKj4PR9e8^e z?XhuN)wAn(R7B2;foYx3EGla80X}ZX+S`*ex{I)RoT&qir1w-l^zeAN%3RSG-$;05 zr&^7DVLXZ-5Ce>{VbtsCss1X4W;j^w_bVKS@9wT_Y_;0}J$uhDsVa0UZ3BCRsz*H> z4E(rS-MJ$kjYG^U{r>78Y)Tkuh_qfe42*FgKJbGssA|cl4&Yp%**>(nvQ$lbL``2* z@Yn!^meA*qsiL%(Jq9JAK+~oNGp%?$a2UQGGS5yT`p)%Q>G@gLg(xHuq1Atz?Y|4W zphlHp)WLXAT3x;I#?{r*0OL+HtVC)hzJ7HTL#Z?zKK$@-SSkTtUA;bzc}&i9kKi8? z*D}qYg=V;OdWBh(T5RR?PS}LA`RU5?%{@8yXB<>2z24@{%PW(~?3J<+QY~a9Z$>be zT`}M1TVGQ@i9U^fUIxwpSVo9W<EY_Wy_LNznic~=mNmC4QS48^QOJyDdp&TX2vQz| zLLXr*@SM~RWoBN^ax(@_7*$?ScN3TYum^O(b4jw6t`1dwMV>G>NoP<jE!AxMK!|J; zF;8ADddiF82fQ_1pUy6c{qdCcv8^Cx3kz&YHQgTDy2g#6+@5C?f~~EfuyxaRI3Y;~ zlC(*xTG8%!=iQhe>c#aAl$)*YC~i-0aL}L+N%9V**S_rj*w0lBOeoo<JI?mwI)@QV z>HzgPZx}+qFBnEXLm58CDfX>nRxn<{PcH;Q(PG)0+twOZC}z|psKSxOi2mzF9@UUn zIMZ3ecUzXDcBU<m5+`MWeqzX1KF~Gv!K>i##fwX!q+HBC`6I{qQFxyiqW1Aalny^r zJ9z6`*JJsh0~h1&rlR?ar?y~Yd{lq0hz4$$IOi?k>kow>OoHz0<9fIp<_8D-M~?IM z*m2&)C!A%sa*QU^c#LXrGW%lf^)LMEC#%&zT;aU+t&@*+V4<BaN)g@Mh)_j&6kR)E z#--WDk;bdqpbDfa3~_Wp4pP=Iy-cVVJbsfKEz$$$wu|7`ooTwRi>f?_xE(pV0AoHH z@iEkY@$hM}%}>>`R~<m}UO>EN?GIF|US9y~aNH_;jcKlqMyv4I&-m^3%5n3#`^AM~ zMN!5|=VFs`PMa4y%7#yYy?q(1Pn%hqy57I@F(vd|=s&BU>K;Oh8=P+xVZd38&u4`* z*3ZRYcpL>V5LdLvVU6)2QK~!YVe3K9+T|yMkWxFF^YN5VDV-YZ&e(X$Z-I>IjmMnN zXY)Bm^Eu3fNL`J&BC(}Hu`#le&2&&_$v@K6(W-@C&HW;pqwgU!#F@#CWoTO>Z|{Jx z2W;T60gS<{F0`XT%EIQkl~4t8ZR^gK-5EOfwQARFkYvrg7m;@_41_1T1#%U))>|f- z)(;y|!WbyA!F1Vc(!J(xN%kc~ywH!}1P$X`*$sceQYojZrTNFfV~tURd2rm<{FC|C zjZ4y)?gjcb=lc|@wZZC<*-+&D*JW|>SV8eBwhds>5#^LCt^+`+W|qp0QKMWkwcae} znz+prN)=xv2cBWbEx_seO|xrPSMzxmlkYDP(+NE#@dYDq#3VybpiF6}_MeI<KGeOU zqU6g(hdCqUl|wbWED|NAxaRwCB${;$1-07hV0dCMu*5pa`F^crFSs@9gtDP1+}ZSR zHdmA}FX&vPZ@R;Dy-Fe9J$%!8ilH5CYn)U2v`CcrgB7);a#1~)7z=BIlfwbavpjRN zj&6vL%lyj7-FisxLH<-|hA{A;6^9W`+SkPi8$kNW1Pz#y5?jXVVTu8wJA0e%Eo>28 zKa}C#W|6gxHA0J7zJr`<DX;45x|%PwQXjEskw)9mer-^ty4WtSm)ncgO6Xr3*`D|z zUOdmeYv+wD(Z|N~=U0d6%gp+;dH?;UAmt}ylq$;P?eB=f2c9J54>4trS|(5KymR*p z6Zw8O6fGfSlbxo6MzNQ0?$hW4=ria`=(o5RA15Abw}FVVqH3Rz6^;}asmP$(Z;KO+ zdaNZ%nI=3m=KX#OkBxXruJu5|c`dx)k8Dc;F!XXtN~4D_UhsXt*DdVfe8}?y({w`5 z*HlGmG{R7meg}KR->(YI_o;1}f$t&7EB@LvLTp*r<i{VKZUw&a$NIZJZCTf3n-I-I z{ywyUEPv7={?1>oGp06ijBL`%9Mo@}V`De@`_jtGDpgy=Mlo)xjIG;FW)oleYjaf% zeBBV9@c2Eyp{Q!%GJn4BO~6$NhVFx=x(yoYA0{DHWga}|??YNF5b~5i59QB}{w(*4 zSTDeJH=P=W31~@!3EdPZE-DF2(@jKqfm@~pnnkaeiU<z*tsTs%eTV{@5v-0i3{H<V zn8<?gK8X;II*Qn(!x+oNH!co<B-M)}--GaDN>Nm~vYpA%{TZ}UNlH;Zv6a~a$N6n1 z=<XtEd7(}|Spzq*Y2JLlh6E5KBaWAsx0>dqX}b+9i}#}<HHc~CdC02x!Mb+it8hZz z(-@T^5*|yIV1~@RYXf=o8N8oUTs5$eM}pqesxU$@8X`Qlpi@RbPElk4G^+-R^a`^g zFDlKddbEdY!s^})n)tx(+}>{T67T{LBJ;wwgilG*=}&)kK82-iftLvZfd`3iZg1cD zLU!`RefOO>nT3Qf8S}g}+tDRSKYm=7Bz<R!c^=D*kg#K5MHRYm&=pigLdoK52^jAp zxQPi)<Rc;{n8*o!lrh+crT!_22VfBMe2h@c^M9Qe7yvJw>My~;xsDcRLsApq!-l}~ zLgV8KLLNv>E+@ROzc26)KA3#69^D2eGcAjmrinpskcOsoI-iYOXZj<)SS2vCbKZ;{ z7a1&+;Z1Ba6Ne1sEyyJ4NgfdEN750h4M0rLnR2q`T=fA=P)aDHS3^(*i0;6EPav1{ zR&Cmyl-60A&wXibAbu;du51qmddCFNWD66Ss45tSmw9f+1noRwB{{DNK|iVq87R_H z%p!Ry7gwRvoqZ1gsDk2dn7U@huIUS6x+#l6AtQg4)FoMMA+bqp`23m>8bm~!4nh%& zD*}h$$bOBB>uKsd5>f#Px?y{U0c43~?j?<sCDD#qZE`>)Ih{&`ksIyJ+%Vae?8r4u z)lGa8&2d{p@>WSmd7p%=D9Wz39Ae7q)i-k;IU7q`Qjflj<J{RUX!~f!2rPb9ortI? zmHf1+7_^90ZDTg<fG{p7dSo}qRtO2bhcFOjdd1%}>EF42<k(i8m^pu&=>*1@{-OA` ziH$n_4-`pu>{u3gY1-|zQZIr_63mnlFWu>w$r)+MM$&s#tt-8y9w9VxXtDB~Is<4Q znD50yYYw>|l$U^>A#CP=S_}sn>NF36UK=^1a~_rpa=>7IEA+%$p=)$Df*ebj&+$2C zt(vZfBsJz0UZr<&LQm|VZJ6@wj6^4SJA?7Z2~H%!>2@P3JSpIQtn$1nO3XxpWB~%$ zmdM`Qob-Y$b_rl^RWqtfJkP*(I(ZrCnkXQXVL|JvzNd<yOOkj~SI2Qx{MSSJOL^^p zkh~YIo7!E)Yk9Ia4O^n<AfY2^NYvC&Fm`$c5JEm;1PXkwW%9f#n$d6>z!pz7eTXPO z+rYCSA)Zj9<jS=n%Zy&D*Xu{7sP-mu);1(bTKudck;e)3e<x}GLM^VdxH8H97X`6J zPOP{fIOC3Fv{}{=r455ON2@0`?lO2Apmt`4yN`Pr_iFC@xvy{>(B24euh``?Yta@x zJg<jpGn17fon{vmy<!DY2ZUNdyW)gv>;e^|O}U*VN5<6YW7jJqmHB!=fL~MwEqv7j znI8VMFm?c(RjgC^&Hf`>=n9%{AtjL|EjDz%l*ku*FDB#~7T7r?h#gsMC}y--S+b&3 zdU<vYCtX#d@Fb52uQnyzjbj7LlDK#lEVa)f`IL!5X=uR-di*zag*wkTuF|FfgrEM* zB?dvzafxDiMHDM-QTo(<ib4dCeZQrB>Rf&khsLBQAVU?Ah$Jn}^KLH64-rOcBBmwq zxN9g*uQFX!Q|Q@PEznxBvY}(bBO{7C03ck(a@vrq%Wm-vg$(Et+&66b@l3AC`TWCA zGh!7<qDew3ih8qIB*KZ~z>5Si8tT&bT;ma(-JoaSh&#re=6;g<`MBQh{s&GrZ8!iV ztw4VyjE9X1%0Y^sKd$JKRB5k(<`&O6qX=jMc%K9FJ-VIyY7^aqJnQPD5?Y#`3{9I= z+c2h@i)rNTA~`NlwGl~$4{cWiW|K8Kt6YCl)!W;jPNq`cE-n$hYSZ8=5Hiy92LbG} z-SL6p7?fRQrtazOlHJ%(j77pr@$~9cyU}t4Pq8e;3uQgTI6=IrC?Ev{fCLgKipiq{ z<4~8w$L><mLTnSlc;g%~9mgc+be@HT0AdI+{wJ?q6h+&n)OK3+3bA}c`<6Y>4BrA# zSlRd)5q=I?23Cq#B$NrUV9+7R@kEIf>s^e!LsuJWvt-c<$0y{`yO~cv_qk~azMAq> z)2NG4kcf(63PR}FfSc=~pbryGRh6n9CeEWSPn_!Xq^h2z`qM%_UsOmwifr$}y8_QJ zO&79vZ6DPn`RKN!{rN=N$Q?=6CKO90Oo$HoTBYmO?UBO@azr`1SfA8xVa`p;Ovl<$ ztB6Bwf;Wo`vgX&9mJc6ZUaI?=EYLK)`|dQQ@aWoPvbHvvtYx3I^?R;Jw`+0#*s*?G zgI}RXhL1clJVJ+u1J@Uck#}?hz|ft%K}6s6HM5JA+?%U{P^}6=Rn@h7?ijsC(=GS# z0+;6HAP|HgDBloxEu9%$p&6nR_RT0ud*dY#^NFxBB8{8)_o@JDK$XAXU)3+>qmfkR zh#J%X$YMDghp-D_Q|7EX(?-(rA0(%r5MQ0cH`?^zwMg#<zIfx3*U~N-G(?K5v(;QL z6%spJsNg}>u%8wlLHH~3-4bVK*v2h2$Y~)iK9i8Jv<hM8m8Ss5^ns{AY3N!ijG5OG z%``P~eL*Z16(x=prC1c4>+kupU28H{xnDR}vz5GM<rTYjzC!A8tSE6@C)Jz(sGbwr zQsO5dv6FY#0u>$T7ThpAP1SW(bDp(CCvK}*&pKn<Jj1wO*Nb|$sMRdKt6{r%+o;`m z*Z8WgSG~MI_Qa~Hu2KpgdM|Mj_fXr-<M^=X<MbCiwNf1<M3Efsqn_>FzhNuLm%C#; zd@J^t)PdODW#JvEzbD_B?a_Y-=<Ro5zs+N&)J((|rhRXh?h-8Re#8gtv2Vjk>(si@ z4}H)2-D9ss0l==?j)?^1GEBFeK)AjQ{VnKkVRa7Qiv!;l{yC2&wUBq3E!>xKnIbR} zGF#?OcS-S|%ffFK^1cy3b;vjqw95aIj*dt0{U0vHy_#kN@i`*o)66Us>SIcG?s*{a zvI~Y;*q8XzfC=T}Y~L+!jC`|^&RsKyFvDZvpD4v*R{^WIexSpZ6Sj{+Lr}uH<B7&Z zB`kw&IC!~RN3p~k^V(k)aNyg*KfhDA;3MN&CR}?^Xd@xk*ABbF;;h(Hc<M|%qo&<T z_#@$t)Zdfu%=YN{J>VX>4+SAfkBGm0Y!-X#&U3;Y$@j)@+5aV`Q;b_62M>QVZqR_C z_+1o>Q=1{9R}sBQhv9Eye~VHm6zbUznrrw!OboLy|Dmnv@bR6*;ftX#B@aBu4S&D7 z&x1nllw02Adnc&I4y9vcHt@e=)Ck`^o9dc9>QLI*D7!Gv{476VZitN^B9k|RAiacY zTTcgR7=!}DY=6@t0|zEAKYqLu*;WWYlCv7EHit*<{3G(`Pzw&j9;I&&gO|Y^HyX=J zK@IbAJ*w9*&o1+Q8OFD~24+Y`9wpfJY4mgGml109Yk8-0Bht4*BdZtU<4}kdP<#M0 z^2mj(LhAz0Sip7_$5*w%5Z2RB4jW+vi9wjHd?NQfQ@YXWwZ(WCk<8UMU|7WoFB1#2 z$%Q10+^}(itHpdTX(#vZH1vXQ@;%OsywN=|3aEst7E<$Ln$G%iiV4PSTe7_`kr_6F zQlATYM%l+`2=$iLR`o2kj%2;vJXs-LPcvMLE={|(<r>=lN0Q_tS9U77VorY@=Wnpo zl3G16y=0f42i+^0E`V#Ah6fpVVMVc{C{L7PJ}*3-D|Q&Uq2!p&Cr|BjB7x#&7q=zt z==SzeO+vl~@dI^jr3c*e#7S{j!oJf%@Lz(5VPFZt<sj}5P&(psO6Ob_wWf*|<ez~m zJ<$IjmDs`pdVNU4MtmQONUCH>Rkc1`YNB<gE9F+ryLX+jOMCnhW9#=&D6KqjF4A)i z^6g%B=8cm#PT;fcx!#aoiQco$*d@MqiLv#2y=uGEyL7H+7k!(8-TU)5PTn}dNoCZl z-|}q=c4&J*jML4xD$0m*|GptKS17X=iw==1<?Fe}(WMZeR$uL=?Vmi<r}{Cx!l!<- z(z^M*@0p+fyg5|O{w<45p}A@PXJs*h=)H<)v68cbz{;K2Y6hGK%`M6fF7f(1?x@~$ zW9^QM)f;cB0-Z=PWHw`f6dM4s+H8+Cux>Yu9;fx9wt*hD3zvE;O(;<V9Ix*&e`DSU zbr|%4EAe}!iyOt)TLKKF(irhXfg{u3#14k9fHGzICB&OpaY-I%tc-Y=x4d@m?%Rip z3m7jf4nOH(>}~YwHU9Vo;ekCX-;Wfc<_OV0WaTt1XWf26^u5A)qTXI5DboF9{@9Ec zu3K36;zstk`^iS(X5Oxn^RIlRxtl96+V;O)pNux}!s2iWu8-&8cHU`0)IPM-XjlTq z09wwna#{zQxl$~G<5Xe9M5F3e-!DA42n0dD9|R!A{q_DU4kik4n6knd=>yPw6J4Yi z&m?Ibjc<(+*7ygg=Wcq;tNLF2U<-zrxt3TLUD5-t)RCxWsc?%4s);rnB}1_%O3bkM z?xuiFt?cvvYpC6WWD}BhL{LfcUU@5#HmYmK4c#?~VGz^RjpKvrhDdICr7M-d$Lbw- zD1r|q$-8($5<0b3Td4Du6<!zGty)KrPTb*2CGZ91jyn{=2QW?3F+nN;c&yQ29zaO~ z(}87EwMNxDl-v{ME3fbQ1t%vPzHboKDfqqXUuiy(Q|_paEY-w2ir^QqvV$$f8u@n< zvYWeqeWg|dsMS{1@6YWLa<@OS6btVtg6|8;4wg!#&~)!tMAlLotaXzEl@=3~`&~1{ zlVdIG0nZ`ixOLGIT|t{dF7xtwQA9)b^VV^i^u(c<L>3m(770`Zl*OQKx{idV#l8Lk zb==(q*D9Y$cZED$)D(7r3~^am*S<6f5iG8GEmnK+r?09%b*;J~trD0^{j<JlIwyU9 z?E7QbTChuCuCzm<=E9#WmBOE<?KWKqAp;3le-#hmD?0k4-sZ;YF=+USh@*#=c7T_@ zy(bI>W(k8~eW<O5K)MhyQinlLV4(sGA>6ht(=A|8+Jmqzq;(+;YnKg*$WRPf+7rm2 zn$-W@#ZpTgM9-VAe}f_QZ&Z|<V##>J>rJtLqpIH67mXI+?dul&u+lhov~jl}-1Ea` zapAgc4DFX)x8R3ufbBQ%<Hs8J2*Ta}C-fJt+s4q+ix}w2?I#yRsk6NNI0amMNpGo$ z!CraE^&L^_EHAx=0xsUZ0$;(!BG%t<cP@9=8w^}5V*L$w=W=(w!PvN0z$berw&~$Q z;jrUaM^5xkV&T5u?_IZjpMX!kxam2E9fxk8=$*vEy<ezcp*Ox$2W*Vb8nJ*YH@>QZ zh4{uhbpZYBS+ghL$`}c#{*b;8gSeIRU#OCCk186F)T|K65A=S?L*s}54#5z%fVmPs z6n#jkJgkRZNY;n^ouVWT9#P#QlR{q(wFNFnU9GLBal4`;+Zbn@<qkiwDx)`xkSfsK z-CasM4502SVn<XqMA7H8xl|9RWm{%W&DG49y*q)5D(5AY9?`2Eaoef_2%<)b!okx- z5vq<`OM@s8fZdO*qm<+4e!gZS-le?MUaDM>V^Qv@VgvJ-mg{YLi!9b#Es0DPDvHJ} zG4i>N>FL!{kpqa5k!Ori+O8Oq2)y3hI87(XMjYdfc=g-sVyhK&2STkOYztk%66zXv z3#(uWT|K-t>Ubz@<&hp(QZ%%@!Eh*T<E|vj7#r@)?nL-n5OO-L8I+inYQ-W#o_}3e zS1bIG<_G4#DQF*^6f2gsSk#S)B7an4`XRMq<W>do>x{1!RDo0o6?0Rn2Zn5ZDVJ-` zC@*ufVwq;elK9fPpsw=DA&oJQG3}!jlU9nVLBukaKdLkBP|m2Rs{*VO|1{4_mSu94 z&U7IsYDI(u1XsU>W!}OIzOBd%uPZggYl}-?50Rn31~Dp8YX6`<kp28O1RQ<Q`@JpY z_t+0KDY)SWhc%6>q#tla_H})%X}%03IGa<suJ4yu^&i*HXlg72A)7K+<XDyenEjrz z^?TkAZU`jp2L)Z{s&*zIAp4p&)^%T2c+e***R=iDp3#0>?-Mna6)tZQ0&=Ws2qBps zL6Y4|JwPk*sV|CJ5HU#WrK0MkWr$~}$4Yg4X+H4?*!r=2luoh4t?dD8+`5lB3+cBH zh_inaQ&7F^|Lt%=0-L=<)An?o6Lq+tX|b*^xB}si8&8_9K$^uCQHTGmaU!@2x*luV z!cZk#*L~0P1|IW#?MY*(l2)-v1lN4>toLLpKFMA$W4`nHJ3vjv?B5vJlE8Pe|L2|6 z^*v4FL~s{${q_1kYrab9FHMWlG{57OI?3~V{WDYbjK-4?u_wj!N$>SLT##N*=NM1w z3!BsE4xJYL&+Yf152H_@2;8PBekfdoss@NklKvqXncMPN-?JqSV&!of@}EuxJz}>d zqc>6YKVntTgwJfp*82!z>$)2B6(c1tY-6PK(0W3*s9}OIg%YX;?eTKOQ^r2ltsu@> z>RQ#7fP{ql7h6O_DiT7F*>P|h<5jn>!369{?C1?6NwtClAj@?%`$lNMgHTe8?24@A zbRU2yCEz8Zz}=y{?FbkzuR?1~gzMK_w{r|pzP(yb0>)TtwSA@3rS5Qe?d>-fIPmL} zyalSlR!$u|b?U@5*Ppt+5T@JE89Jth=r%b<;e_Nlo=(`aShZ#2fEckuJFOVCLrDdr zT^%fRtH6|GCO?~UR(MP{p;v^4l|y2b3a%pQQZcq*ROXtqrd$PgglA4o+rJh9d+@e_ z3kpZ=gXx>g$*E_1bSlUKI;}UfWI0vI4*C~L)S=rJUKCCVZxTKrd_wqV5k!;gNIFDQ z?KC=2ds~NV9wK}L;^?TGY|?O3`7|zuo5EiWA>70t%OU*#Jzz2Yf9X&AW|lwWS?6gZ z<v{#r9CRbG;Gc26J10W%)73j0V!tbVdUv_sCH<~Mw+AczuG;VB`dz&r_SLTGY$I+M z(BCTcx5WNxKQ3zNQTg<5s@&fadd1~9X*ZT;Fwm(#AIv6vY_JJ~O+4tkB$R^bua+(* zZZcrqPT%45DIuskoyuajj{jPT#E}T&)F@7RIJi62(s<zajs*R^0`uZh)-~-?`B+ZX z9n*AlHFqqhn;5K#1=!Sccm7Y;Ocuv-p~?TuFY8R>(wE3FDfcCy%izC~EWvMkPJDQr z+b(`uO#D-u@DZ0_WsFRuzn+}^1U@Q&DqvM{<Gd^ah`Dk(Cjy9aK6VuqV^HC7joYDA z#%aD$xm<$veu=SCe<*}GeZ90f|8Q)2=63!qCN`-sl9UOh^khY2Iv2_KgK9R9O^i)F zSK8T_<#MW?w@i3=dX-DARp9sx3>1!HPz6CHUeA_=UP1V04N--;{Nn|cw7$7cEsNHN zzV9ut*zGQYMzRVgSb4JVb`zl`t+qp=Ly&R*o3}W~e-_qZ=>P--*>oXPUq#K51nxji zW`Kwg^!UOhm1M0ap4vkAmf0K-pYjomM%h6nZ(Bkm44)9b*&Y1<1Ag>L?9_u0hsksr za}Lv<6sR%J=A4@ItAs;2-{+IB{K;%Ko6Y7E?)$l~Ofsj*#C~eCSxlI{DhrrCg>Rw+ zoujMgVa8R@nkAc*NP8x-^a}37|CVkWepA;TlPDXBw0KOQkI^zO)5oZAtVE>|qtc@y zFVo4m5H!#F&G3#pn@#_0GboHFv<!&<IIFI`6wH@AZu?)*^(Q6SqSuMCMQ@cPt6lQl zT9R}twPfi8wPfkZ>|Ohm?!T;bbNQ~j$~Tu@HYe~i@sUwozZ*>J&PR>zQ-p76<`m}W z4)n2>z()#<rM^8?7%Vi4fi5i8UjVwAsMc#!CShF1NY>KbAYD(_(tff&6o6yU?1|rx zH>MoXNjc)w&zRR|LY_cFEWq{~^hwjFM1B_P@S+*N$Ph>EVR}=9uW*pOb!vO-<f&1K z7=JGj+ipfP#O})r(+HQAS61@=By0hg);Mj-xLXWY5=oRqu$p4rahsCUq}KF+$fN~$ z2}Btm%nk7r*}6N>bs0bu1;J-&GZsac=7z=7Mig8mhDv?N%V(QQ1wgNN;>6u^#^%GN zrQA7jaXz1nRy$qSYlr~iQn9kqiZSjfs$l@Yhzd?5K7}T=i4-N*gs`5ciGqv)Pt|p> ziMmAs>H`8WG>l_Wbp4by69GUF%uUVE1&Al??_tcH<erf9q$l~~m`wMgDk_MOCxYgk zgtdAqfztUP^~6z)9pERtVu_Z+qj>@Y(Vw)nKQ>8FMf>nOTfG9Dh;it%<p?n-dRyNi z8!N2@NKFpNoG`a_yGjBFSL>^!2G2|TWM0qfx~}IH{Czke5$ib-(mz{{5E_+d`-Jqj zdIgk_v{p9A9-;mfDpB<p*Fqa5013wq3Hy!OwG{;)^0;7*xLxd`py8)OL{@>jeAFND z3d*S}19XK?)ChKj^r{>bIW6{xcB&|tW-zR4-ubHgK4Da!jW&xu9@oRj^Hj2`EQs)> zIHZoM5tt@qcMkS_2Axi28UY^!z%fgbkxJ!luL)1V`D#p#`gja)X=#q{;^u7adND9m zQ>otEk8m6H3d^4ejRli_2%Y2)HE2@gDVj`kJU~5A!JL5rHN0aNP<nno-?yczao`)n z^)s4Ve6J`ch9liBd&6aV`8{Mh{ATJcRr9(&?i7EGnVRkTB;L3z%QAw`Ph+`?3?pz2 zRtmsk>%V^X*=Mg_os+$*C9CT>yXLm8qHZ$vt?!)3;KV=8(cmg5t|1DfO*O&F&?2GU z7mAu132J>Oj0QxSTO2z@1NQ3cioSn!?0U`K_$^d_t5Q7XDb)&f5HZn$XH@iO<>0_n ze0+A$b@83@l;b>gqY?kO<lZx?@6*EN$ByJMNoSS=3lR?>0ShQpTA~O3^S_$`iW3+B zz;k9KuNaFL6n$B{Z3ATGUwyho!*gsIS{pTs7XJ?zGnBFMcXHcQcQ>KX7T*Zz7WGfG z8E_lt7+d^7yHM=dKO0}vzDtl}?01cAsJc#DY;vendFfZh5%DoCNRbQb&=tc!bQSM- zk>Gu%vUp+RHf>o~KsHw7Xz?dLC=shS7JstL&V_V~KF<*86Md2x=!g03o5HlkA8zg{ zR$Kl%W31@e;xL3hW9K$*ajbp9r&|<myv}>DHLSexx5u3$i1){~lH24ia-6I6RrDLb zXw^_lh)6X=nKj22IrsjvT~zEsTD67gFNLd=@R#2F?DK-wRL?g{@6m2NeOTxd&4>is zeADFk&dFCWwm5!jxPo9@h~_j_tW!_JB>XbC`HG#5jnSKEQ&{zR#6zbug<pmpuWX)I zo0_1>@zf9}en>%k$&w$i#SMm5hNn)f<iexVxO<9R15CKG=Ye@%_azQ0u%zqLP6s%d z^JgGqaJR=G$eH`x+qe&KpTr3u2(n__h8wJO41HP6sD$Z2TizbQ7#EeC#%hSp{ti;u z4RvL(SyW3<7j2LVE<VPqS+PDs-T@lU?5E|?D@=!<3@j6&Uax#OC>cU1q-{HIYLwDA zw`njitJN!#_C3Mfk$~`}Kv6(#6w!ccO$<Dxd8{QxuhsUVh8KJlVu&^By6uNi3{8zX zPWwgUzPu1Oe?(7;UXpoH!=o?KTD@MY?KL8o!uNIi<$#X5TjMqj5#U%4D2<RE&<NR- zHaiUS%d+#B26o;IDAk%BJExTY^Uz25Y}(N3brYR>jmT|346R--(E=}Oc<tdGldWDa z`D&mfocSUxNix@MFNZn$_w>~EC@q>xU@*-R@79_DxG*0urDm)2aE*^A54B&UWdQyJ zm{B1EcpR>pAPG&`Ta%hZc*_}!CkcV);X1}Q$jzD_mEe%Dej+RsIS0LYlFKZTsJfUp z@8YqFp6=XSiL9r@+a0fmTtef2gahj1BB$Cxs3=2P71c!Y=8T0Z;ouH`g=eNXO!xh= z#k7JiKcs0dm1QOTLO|b3>E|1av6reET^Wvt<8#BvaKezf=)K6nk|Y|@eeXU0-t+VK zcHh^5qlc)bzLYW6_&lZW4d@p_MV4QxX)k*EpCn3>^e^PnFm#OQ$JW2M%h7mc*>(rf zoSbUo9}wwSQa`g)<#U6g1ljA!mXofD={DJ)+`hB)C(#Ve`|XN`2aJIn`EQQype(2H z13e`M`>_9kh=e2XqM~u8ER!k>p07~;`x*bRPPML~Q9abO$!@>JmF3eK)jM&cp|0y? zxgnj?jLHSmPTt!}Ex^v0Oa~y^3{&{_<jB2eRt40OB&ORtkY@>qYGZ9c-N!HUizlm& z&|r=|u{p*{A|~2e&00Puc(ImaGP2kQ$BA2x(~^3QGavr0Bh@WB)EQe?6mSIQi#hmR zizyjHsewJlZ6=T*&h&kNtBY$7?<eG`_ALcZ=G5yG_9a~A`o&@ePXx5;Zv!{$AH$9~ z5i>uVhWfk4ysnXzm69O+h-*iSnrhN)9NMwLQ2prOpxwlnZ_ictI9s8fhgZlgnyQAW z8}k;qzaH^>rWvj?+Eb)tG)g3;N7;H98-^e!z64@~<%WPHKamAbl6w(9nj|F_X?LAj zjfTb6yHv#GnJAJ$@Fh7h1;I>Y$rnK0rxR=sR<`-~9Wblpwj9%wcYJqKS56BevgJbe ztM+;L0nz6pb3&L}XJxir_}p&EKK0^mKTVV4+6W35hf7k(-oOD5F-)hnB@AdlMJipq zou+aKuv)0I&`X%YO*9$0GVwkQ;sV;bUL4iB?)nhW_Ht-P7N$|X$eaVk0Rth9mlB$7 zmnnn1Iw98v7~3^b6b?mhwADT#SPlY9S8cF{tu|o6Orr+~uARIp!QBG`H4ItJHi(`> ztWWwJm+AD8AWN=<<y3o`<MJCaP=<q?2uIA((9>)UT6{7)LucBa6Kee^ku209<5<6f zHjcLStjG?R+cW^*)%6;JYy<*h<Yu<h1eTWD8BJy#lmx5hBNYz5#eQY153DVahH5vM z`jgs%K*oglHQ{U*J7hHrLp3N<256P6t&y53(j=<@VpATMAm?>!yL4XcsbB~B4a;3M zo+1WqDLX!%?gZ!6HvC$crT$j-zW?A40v6Z%EB%#u|5E?byuZ?4d9r`0f9X<xrN8n$ z#Sl=GBpxTO?Cl*MelBo2RXqO%?)}^~?&rB*=YF62Z+5GEd^uekFE+sP$ec9_2=vLz zU!WVyqyHRNLX3bV<piRXs2>#KVgv*!?+lT{-ss7ZbuCz6^uyhD@wzL+K}o<3k-_^* zpXAyW0|46G7j~}b2n44F$Bh^`Zsc0A6E0<xuG#$^0g$HFJJQ#&nkj-oWr<2ia4~iT zBvDDGhM?Se#iFEznurwNSCFWMnq*q0s5R8lbJT_=nWp*YN9kC0hqsX5b)n9_XuuI# z?Gv&7c6&2fhNL+-!(@QqOv`nFwOm(q;~XHQy&#aW?a(s;fXvQhQ9}#X+8Ny9CO&>= zZaTFk(hTesP0O6k?r)jquI2ox?T@$Ry2SUyX~$Xb;NHW1faALPYDm-x99|TLQ3)cG zs8$E){PMgw*<>UZX;Jh~lYkgSH86m{K!5#mJgMN<bUbJg)v^VlXhZ<M;kW?+z_6X^ z#F894GP+F9h9CV_lc@M!bHb2He(2{P>om2Om^qrZ_)fp>*YkeeuQ%#`-M`YW`}H51 zHf|AL1R;+5orowH#qlzaBiE6mbeOdb{joNGN{0rR`lFuz+n@Eap8u9|jtlSPUd+AP zh9nO5_ooDOC5=PBSE%FJqC@+qG+iGd>ml}cL}iVHe-92$KGg0t3^$mqHgSc?Cj<ws z8+_|N=Qp3S-f)9|79iPi@%K_Hh{yu4kSN%?i7w24PLQd0)3j?pCNF(IJWacQ*zK+` ziRUSNuh(m#Ky+j>-KUy#jgB$G3GaS{$dkM=-%CH40maF{AtC9XJO3g=9^czrQB^@a zL;%Qi70BPO=x3QP3mdJKl_?>|*Vl7miYxSQDF4?xR))Y}ZS7vHAeaL%*9GP}DY5S^ z0?HtcN22oTwH3dHjir(At)KS=P8q-X;9$*D#f4g{iUp=(#d2<$@M(Su5B9wuR#>+G zOHP&JNrfj>z8tFO&P7&x+<MdD0xXXacKBQR{PUw}(gpwUGpt~P#H@J=%=IZ5_6xUo z&IH^!c8*=i&|d=_yS+dQOJ(g7+HA_^kLMQ}#_js`<iURXUeqmLU|q92?jO7q^LvXc zcd+Ol)+6>+yl{LVSB_NY>hJ)LxFt<<wZDP;H1~bn7r7tS5<iG;t5*I`sycx{QVfb@ z8QI7DxRgsdx=4aE4ri6S3HnT`jNQUbZ$cIwPZCNU|6r^lrA=^NZ6lmlubGj)wu+_x z+y)av9y-oY5$I!~+e^2!8@6YfDn_Zo%|7M_mAYT2=SMWtEtUQKGG6G{{rXDXulpPQ zx?jVF^2U!c(+W%?+@2LhA5QsJvTm9Hs%d(*LEO+dxXy8LV?KwPvbrUdzkB-$F{}K) zxyikV(+Ie5zDvDbommJRp4N{`2_#Skae(vo@5%(Wk+^d;zKFzg*S3S9DTscMhOVnB z9*IcX8{qgN#PQO=jN<knZO!Oou=)hNc$fO|QpX(HR#w8b#x2(cL-!qUoH(!ngJmzp zF(kGFakQMRu;gs#lJ$7`?X>I7xXitS`#Fy1&q6>t;G1)y0avONAqfXWUzW#K)n;L5 zF=Ef4N7Sm`^sx{PTcyIe5zc5qLvoscIdVNAboy?79@G;3#DWycaS7*R`UBm`OVSEu zsiNiIJO+R`L5M61I{A#})0k$gCrP%CgfLldGyrIWShDR3&@Xlrwb@9*f4xfip^KY; z;efV1TM!=$NDbzX-DI|=eZZHE)G>5Hj8t3GpwA*x$@?TswyToww;HaeNOc?y@a&Sp z4<X)-o9(L86^w)sOV(8#yrNhudp2I>|JW(>w!OPDP(b0WzrL6m3Tih-nnogBv-_sQ z`l;t-5gNk?HsnzxDRMd|n6V44awoZq+<Ukm=dN=U4A#)B65fC3sTW*BtI19Zj>$&z zfbM2G{~>5Tk9c%et&hd!L!=Ceguwl=P4eJRs_rz19V~u&wLg~Lwq$LU|L+d4h@zOZ zSfY&Zk$77b&JP_Wif|F-Ch>D43K9ZSQR)qEezX&k{u}u1aTb9;N&{>3JKTTgI5)R$ zfnZaNc4#=vP;Cmbb`eN%_Cjcfr_~4skQFtt!fCN7l>W^uRTF=bxD9>=_YRd(3KKKh zXqrMb8<*R#3l+Bpd49PGo&_n|)?x+O*vRUT!-c%xN!Kd%6kbw9Q?*u`7lRjg9+}5v zyrCGY4YE%T$UbQ|H$)(d|2dR+Uf`|TW=L5QdObms;VXnJzK}}xdjGhh3Mpq0f}Vr{ z1fdH}Fl;5OTLOMzaRl={a!B@y)`(_<?)x_l9LaGQZAS<R7|XH}kvkQ2&ybV5r9+Ur zEf3`nZjrgXs+)=|V=NHdI)o(40%OAA;mbUYZQiA;mRX};z9a!K5rAg^l7tX|qH5~4 zxCo#X9!y4-fjEu`FM^X2mFq-Sl|0v20)@?wHCP}D`B7as1{)P;v+ctQ^C%9oKs^HV z(-I#<U7((>Lu4)ExOTZ_u5lN+S8(t4ja-@jR1{%Oq)-KvKyE9gYW24dbcF2-DAx1d zL@}QCmWiqy-ZLL+#8A&Uto)xxF7y=T997d&)x@9XXWr#IimYi+b2BteRvaIKyE}Mo zYZjFgKGn6QC6czWoV{^CMX#BEluX8L|C*oLmrRRq(Hox5Dx3UH6_P=!N?_D_plfq; zg1eVOmk#?XeIa0Zjiq+!t0|oM6r;8u(X5(PU-uSzxmZ`ZY^?yfEU;{bd<jsR2Ttbu z0AAucaF1=Fyk_|<MYgR**eczP`CykWO8@J_kLHwuh8t1dZb(6pzFutE{n&AUZ&1So zmX&43XpCz;#=V~VH1`ckqTjhTCh$+%#Z_oWujC~y5d<EZ>romF_G48oT=4DT@IA3+ zYk&hfE2edukYq%<RJH9wXpAU9UmXZ(%t{Ic*OZUYOki6|&SP@+=J1j*7^JtlnkonZ zgbGm+_0eHQjvJ>bf<O>d%>`mdiu8eRQY;J0k}8M@#d`Eh0T_m2M2b#K$K}P)kiNa) z>AIsgo4sDMsT;QH22#hy-dld;Eou=Q9J;P*8?Wp$=CSpLfSU8S{K#A6YH^-*<}ucX zi%lU;q~DyPrKmjWuJ$^eMhJ>*8JeSMkR&TB!__Y0Ri#w~F(m!YJVYH?&~4RH4N>a8 zHFw_d1-U3d#D?NKg6N8bgsvNWsU3K7BJFPO>xSkAK`F}sL-+IUt6i6ME*2VdLgpoE z;~nO@^$S2>Zq4TsNC_X=S$3Q?!#*I-rhaBY3R$4=dkx>xb?>^%?JnL6Po7fMQ;X-p z4#Y2bl^q-~QtlJ`wZMxsUf(3#5X+KxpOiTDmG^rKlvgngV$!Z=DTFGBuxG&z8uu5f zd@PNi4XWA1mn`TO4ds0l2N5fiwZI0Udr}8M6>nLRmNK@S1@NVp<5lb9=(e*;zP)+o zj)z{pF*PpU?e1(hwvWB+HHu2e{4i=57w^{2oHEkPcb8XJm*o+vH!o3*F_p8ia2dCc zZSmb~PRNs?6$~L>?!|winyW^X?-+jEc7m0x2y`m7Te;*0YGC;1-W2n12i^}$UX$9b zRUt|wliwThs_zTO#(3u2iT5upM=H3s;z8N-!sb=Em|JrJndMHnH-9+bC>N?y6I*f? zRx;_{2#6#Lk>@LDb&=<CuKO-n)8&?B*n{Z#q<!+3OhtWLrrATQE^cI#yrskC(>n{G z$u4O!gWC!sAaIY4JW1*Xi<=LNsprGa=JQhQ#8Onn!kz~8CxZFn1wZp6Kk^w<6h4uK zH-GRws*9U`AN&w9MN?hW#ywz;oaooVx+fJV+AnYmD22Du&VO|^m%UQ9outH7+UaDV zKRt+72cuNuAq!%LmE#D@!u%2!(2KP19LKrS)1po=^1*f)sO>UAI#ff#5~igpsg3e@ z72XT{fqnnR212W&^EWQ=4Hzt+G*1l%@Fk<4`+chq*KClswjQ`^W5c@F261cqfx9*; za_`aUvQ#gcNGZps&y*wWq6KPMp7C)%D?fWY;yRp!?=6X|!{EFL#<#Wu6F<}dw6+pn zpP)|~d35y&p5hx&-f4X%Ag4wn-BljUWw`oibc+2rZ0Uo+_V!?)=N#UX@f@Y`dB6P; zv89!j6O5f4tVlLF+MuATzHvDJP3-jvWn8AojpfHq+*x>5^Jn$7YS#AzAdXIgEXw5- zRs#r{ur5kM<)EZF7pawm#5?wn^4wgO{??E}+5YM%j?w1U1J&xN`BJxG`udt#d{2e| zee+ZN>L;i6_`$F!R?n9uqCx-b96F`D?yfRW&Kx=GeA9Jb+8nJ`4{U9sI39hqjR0le zQ<!VIZ#F*q;Mksia+Uv7KcJ{A m_-Wpv(qpcIH{V6<(@TzP7y5uP_W<`sj)TUT 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�Ipqwt4OVk#mOLC>R%K-hkKMyr@(*nd%?J<VbUi` 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 literal 0 HcmV?d00001 diff --git a/groups.io/webfonts/fa-sharp-regular-400.ttf b/groups.io/webfonts/fa-sharp-regular-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1b2af509a52130ac50c465273111c9dbf2994df6 GIT binary patch literal 795080 zcmeF4f0)(N+W+s*&;4s8W`>a3HMJ)SA;bwA9YUNCLI@#*I3aY{2uTPbgb+f<32{1v zLC6tugwSDXW)i~QGqY!=MBmrF*511*=XsuUzSs3!*Y}Tau2=8-v(~-tb*~?vwfFwa zo`@qNamk1$$v+&k%WkKhbjs}_PA^JFoN@kXV}7{p;ISgRFB3Ur&e@|cKdWWM^-+;O z*GqhE&8Ra^8=1<aKEQW2>^X`8fA0>9u<N16sPo5;d+42BpAc`N$ZkVNUwFo82i!8D zLgdQHTn{_{v~gp~Y9fzPPfST(aN7B29{5z}VUjp~rij1Am<#_nHgfQiv?R`&C-U;< zLav@4$gttZ-FE8c1M-q^X(m$pV|LaCU0>s7oEom9;%W>2@V8U5zDC5&tZ!N0;${lv zrc(bZyGu*T?utAtJD5Uk=WOKVyD?{q1mZh`owKMtq@a1(MkWwh0?)M6znqRGQ{;f- zk2ykWq}%%SHV1M`tB<-kdpnOINvsT-MwJ?I(5RDH|0{Nq)>2?={1TLP<T|Rpl3Cw| z#!NddjZ%)Ei>+)Z!=_y)=&1c^9HVLJs56P}8Go%)(gkWZxwhp=+FL(WEh}nz{aVvL zW9mIOErE%hVO*5ySn!XbeIaS4LdVNYXbcx0NNP?dFD)zBMs2<EGycRXv<XX^F0{!= z#>AjaF(;QglWPq=*wi!EoAg0>v8-KA#oSDL)0b@0ZqsXxn}(uF!M}K&W}J#%%WoJ_ zY*);;luJ9`VxH~h#&u==T63Ll*SGf39_?4-*!e5YT_^RSA6*NrH+w_<xbC=7d;Cm$ zRolkSOM2sL^6Q{^qZ%(nyO?XrO#8Gru4SY0g1@%wQs`gfJMG%qxEd!z{6akZH|$3( zOK$>WD(+Y6lImX^S1ER}jJ75&*F|+HGYG0=3Tm(Wy6JZ1)RkgVUbIatDa?OH(xn*M zmNsrdi*sQ5k&XJXeQ#Qp`8RwvZS$XBJO6Dy{|h<jdi}S3{u^U3`=W+8nqNB#Yhl+{ z<D@wUYu5j&{r$)DukADK&=`6jrA=H@XZq9YOrfk;_wT5foHQ?Uc9-U)eJr){D`Lh? z*+%0}7y4E|>J*LXrVHh&V%rqs{7-7uh<2s^YHX}_dp)VPAyeq5pp@CyAe}2QJ{_GI zvXz@I<WYkrxlVGHWNg_+`KX`8z7}kFO)%vqhfJZJ`iaHltmPY%cGITJEA>^VH`lgq zL!08Yl;YYkWY+&|#-eSt4lTAf`E2kn<x|Y-UuwHJrF@B@F`;x$yJ`ATG8-^+Uem5z z>!n>iz9k<mZx3~DdV_EKy3#n*r%2J4*VRIqgW5C0YA0fJ(${^hH*+G=nd?r4v25tS z7&BwfNYkIjm-TJ!@=u$7v|RlK(sn%NIz!wVQ*P&oI((v~+{Lyr*O`)^`dSKQg*<J1 z%KlY*E&G3(^uM2<i*JE))RM7tW#(Ag*%=wdT(_q*PlYwuur|eZ#A2?Z8f&AuE!3O& zP1A?<E9rk#Ug}5N)5f&Zwi)65kkR7%-i_9%G?p}N)UO6jZ=l_tH19o#Yu?A2b{X3S z+m`8dTKnSlLv8t&=)Nl65AA*QzR+u{#L;Wb$K)jTHOaKiPzR>GU>DljHthM*b$WxZ zjbr0#y?%Zu`fcck+=?-2Yu2WCttti7PJ^oaFQV}`!Q@I=Vc#T8|3x3cKmD70Hq3|C z|4;C~@Haku65XgQ^WVhL{xed&k-zq-ZT?leOkqD1eKzesUFfT*>en7E&y@DV2)A%u z@}Z8h*l*Bsno+K7$j_E*-EZchF!y~;><xbAvq9-z(Q;eomB!5Hz@lB+Ya9GF>Rapa zO~Qzhub5nm<F>CYl+kDDb4juPqMH8Fn~W>7;TpeWp)ap6SN6Klmx)uO{qi|m+fi=( z)7CDuF=eKldbe1Ymd)DLCwYC-@oX5U&be%eNqZer+D)6X(s~r~EA?IK$G$$<zB6VX zHr%T=hG}E^ltRC%Y1=1i=S|wxWlS7<Caa&$t=1P`%Zt9$nYpobwjU|HH`BTri?-GG zSSIJRJ?l+bp}y$%?`moOh-++OoBY@(XfaoDwR{tbeHec!wEI_@X;-H)if5^o7wc5H zpGq;)r7>!`^~-FcS`ON#G>(id`%O+-E}Qseq_1iF+wu*0r3-D;r|74eE)g0#Bay;b zcEE3=_h+R(w2e^7J^_1vW(slay_qCN5pmPSIat4bqw#4QB~5*MRa+6mR;7H?oST`_ zYqq#)>sOlV4A)xrugDb2QL{hwnkSs4*t(y!tmv2i7jY;m<g{TQ7yUBkS(ARoC?c-b zWeml#qMACh|JA2>hFJfti#d^}?N84~Q9l#QFXhR##xU0#>Nkub)2^=Qr)6rhcC>Sg zv6w?WV|=s<?M;30?B7`Np-yv2Yg_u)dJmG6buZ)@a;^JEbFq6!RrgB9l-V5BR-g2L zL1rW0ByHPcW5`B6;->Aj*-!Sq*L&Yk+$Tmeg?8#+Bx7tHpJJYSnfWc&OCfg6`gMhI zZWu?V5D(S(?Z#PrerCsNW9a#=V^LpyrmOD}?Ye7yx<IB7i))j!mQ!Z>E~pu&+UZgo zdq&ro*K}Jhr8Y_WvY+KMh1kWqG(MEMs#35s1zWHGtFmHw(I?$5uFfHt`Oxu#8AnYi zo_(#Rjp;j6&<*crZNE}1w{up?v*>U4^2Rx4%zoZDZqYwu_P*w2o*%mDQhfE_+>BKy z`|sd$Phnge`I+%$cpkB#t&Xu5_xP_auM4I;y;1BWWoAv<&yDUo6F;+IK8yVo`Y82V zyf%BG(9V?A*tUgs9gAfyKAK129w{khx)*Ieg?f`mW<$QZe@vV-KZ8iier7!Q{#S~x zeJ-nKOU9mK#XQgrugltB4RO+tDa1?b&qg-HF4($eU5ual3ZUeo<)!ycraWWsVd~5E zx;Wlq8&g(eV`%JR|LyxUzO*g2-zY|*e1lKBb3yAehAmZ#F$?{eXAA{fV<(|_-`X)1 z+ox$;gfd4scU6mJXrX^Im&8oETBZno>~+(3#^h2QW75>s*s?;NHjes{PrKZ7Uiaf# zpTT$0d4|$;acsqYOkeb?@i#)_rpc#9)qDmHO4m{-&tTNFYsX&G7#iE;D21``<Gzhz z<72MVg*e)#hM#Bg{;ZTwp^jK)A82_Impao=yRy>!YFV0}mt_h*sIhgw8T7t3_qM&3 zlHXSNmCgZTm~*}`p3>Zu@}r&hS)5NZo{YUNw$VIHx%QC;vCk1reGToQ<eRa1md4xe zx)ehS{<NcQa??20&prnzj-UKW&ohes8Nc*~{@t{Vg^D3#G^sXiHatrfTW{iIY%V4T z)?3TyQ`dipiLbW$SifXpu9E6g@GIVLg*nupk(zZ8H*NbVs<!1m(maxz&bN+pBMS3k zau5@z_<B}e$fcAMK01d<Gah2okJ-QUW7ee@qfoE?=)I+N-Ag{1g0I!klw;GzzE+B< zPnvRU%~fsfYg0DrPYQ8S)4x?clZ*N5*%^YqPqY15AI;CM*@o-lcyyh#&YZ8s{)|7q zXj03HeH8mG`K34HR4TLW?7h&=Hf{0$moYMS4BF48xU?zcVRNZ5*Y-6;%={PEz_z7c z`zW$$UK(rD9N0@G|6)6nM=?&Okk@~3t^Jl_wQtwX{ujBKHtb7XM;-UZq`6iyg>ux4 zMazmXKB+0(zhcUh#W^kd6t2yEhi&gaZJ$wpUb9ujU|)OKKX%TXjmG4rOMXTF|6Vu5 z-Q30_e_|Bp-}H}<nKv<Nf1X?LF`u(+x!#+$FV&2(b^mt&^DMYDchs49HTa|pZKR+X z`&w*#Go><d(*<A3Hf?L>hWf%B+P?8~wM^$7HDu5N#<!+jdAd+1?aI{76rg^i_*}Oi zPstBA&9B|~tzR*Y*mlJ+6jl9;?Mh_@-%>yAukrtv<?VgcZttgd5v>E(OxH);^uHie z@-IH4PMS6~#@9TL*(eA7PK&mY0vY>!jq&{E=Rc)BZ6EsFviR)MbJMn8lN<HLc`4;? z+iX<6sn4d@rT#Q_k&Nx9UB2d=)_%18e?j}#TI(-1W}#0zj&vb!)a0$&4t(wVu$n^K zOu<i3g=@VBP22XWcAC#qnS!5QD_k>Q8@*RI`Kw>LP+x;j22gEdG;M9JH6Q!hijRpY z>wht7eaw3lv%ZBk#rvUHW>jcfs4uA$<Nb%4`K`YhQ!&2AZEt6O>u<+VDA)S*CT+yl zZJK*=j!Nw__`ycyg)-w)w9__TyLP*mVoRZK^-+JWiD&jxF>djGEL?ZRr)#m!v?;VL zl@X)VSJBS!3{IaZ>F0GZTFl+{l_~VET5N-AOoNsy`d(NyZOZL47i?3OvE^D<La>$0 z26XKI3iT<Ln>Oh}8&xTQkDIo8n)jW$7wuW4_33tg!h2FJ`%lpJN@k;W#b<*i7HeT& z3k$mGxLnE&yvI}DV*eYhO@<gX8|sV?Wkug&%yxSuQmiY^Pf?5IMzueUqpC;&o(GbP z`Pn|@_B}$o`eH7`wC^!8v@4>1MO#(Gz9+D@xaq=JxHkKwrld*Qd0MaSi+vPxGGo){ zH5;RC+GE<5#-_2vQ2dOdpBGE-*9$RiU-W5wRnvvn`;4Q$muWs)XL2go#WJI5)21|@ zLZ5oB+t(~@lP--@{q!E{MqBfmXyzef`_OnMFDYD$ea}~#kF@z5U|&l&_!M)u&y6X^ zKdEuFF9WulF2qJlc}uAuaVam%iEH}fTFW3-h-LfLGBN0Dg?+uyGDRS>F(#Ilrwe2X zD($YZ)o-JI)lU)onqungb+LbO(}n(VE99hYblpnNa!ibLA(pl;*uROVb;a>WyL_<S zw5c<5TIxs3mGma6WkoXB8)N57%hU%gja$poT%%?k#GJjwIWTp!v1_9~H5=M*(ue)I z1U|(++_a62Zd@m(ytEIE{{~;d-;ycB;+lT#=NNnM*?O_{rLl0|n^;<&DdcKD#~Oc= zd)n5S+}ryV{5gZVm+G`0it(jplew|=y6$N=ZGDYq*cV)z{-h8iQ>fQ#t#5xV=DW|f zFUo1B>&1Dh&s!j^ZP8L2^Zj%mAA4^U%8P5*u3x^RX!9^-_?c_<Pq!;C*jl!s5AAa! z^!zaQ<R;~sgWX^F7xs`HJMr4(BD8P6&-9E)YFR0s+J);vyQImdP_~hu6k=!EeeR;H z<g=-*F)}vKVos{YrmkdXN^!MJ=g*$qly4MUuhSd1(_D*j{wFoD@HgXYuTm&W7v{8G zOw%S!AJ)J9cbqq@o7PEzOd*EGvTejon>kNvev~DNRXQ6AWgBu5`cl8&Jl|~hjI&f% zd<MFS5`*^UHMSUEwY^=)P0xt3Vx6hiwotOuCTBZ7wKpZxu3k3jLw&VOebNO#Y}21A zw41jL^NDY}oRTJ2%8I_)u05rBmV%G^;#2fDS}fD@f^GV5cU>$u{*;?J*idiJPA%6m zUUy1)rAxla-}EIL@+iim$OjL4Si7=}EBy%91C5Jt?N_YA?HL?n@{F7;BjhwWUCxk^ za;BUmXUix#N6wY=WVD<w7s!P&MlO<z<&QE}E|E*+G8reA%N25!JSvaLlkzk%UX+*R zGg&IF$?{}nvU76#<lf1BlKUoSCTAs|Og@#Iot>mwcsL_ilT4o6_y}Zg+IMv)j~e zcXhj`+stl{b$h(q6Ww0w_Hwrc-RiqFbPu|3(S6JA+jj5LegE!nbbqtTtMaS1t=g`t zSJe(xJ683sy0_}Xs&A{ltNNkp$Es{quBxf3t!hox&sD$nc%|ozp0j&C*Ym}mANE|_ z^XH!HQj&5~Udm5(NNtg-Ol_Y^rn;x9Qaw{Uruw9IPVJKFpV~XMe=40iFm+<;q}1@# z$*EIPr=~`v&Pbh^IxBT?>Wb8rsjK*Xr)yHzrmjm(NL`=0Gc`4JcWPSd-qii68L5X; zkE9+=%}hO(dOY<+YF6sW)KjUaQ*%<!rCv$Bnp%*0EA@8j>(r{$x2f+^*;H$)EwwiF zOEq70sP?Oa>S%SWI$oWqF00<WdW-5UtIMk^sw=Cvs@}f3TXnDMU90!69$0;F_2B9w ztB<K3T77Kw@zo=%@2bAL`kv~Ccj&jn9=(I!Ved%q&3bRwyL0cV-aUE`>3vsiSi5EI zHnrQ=4yrw>c4+OTwKvpGs=cN5gW3;kzh0hRe)RHT%g<U7u86GIVZ|;hc3m-W#fK~Y zv0~YZuU9Nz@%@U%6)h{)*7<djy0W_Rx=wYS>$=wUsOw#~YhAy({p(JxTUy_te((B2 z>!;P<SN~A`_w}pmf2jYlVV8zKGz@7N)^I|@g$++Pyw&ht!`BUU4c|6=-|%BYV?$fR z&nx3Ax6Zm*FB@dTY=>-lwjx`Z-733HcH8WB+0NPRvt6?LWz*S#+23am&K{XPDLXuS za`u$$S=qC*qq65@FUVe%&17%L-k6=3y(v2>dvo^I?CsgRvUg|i$xh2Yn0+|=NcNfR zbJ-8FA7#JF)@JLn_1T8(%IuHX=4?LOl5NfYnv3M3xkRok*CDq>Zp&Ont}@p-w|%Zl zu6wR3SDovX+ab4OZs*({xqWi`<qpmrk~=atG<R(7gxo2)Gjro|*X1VWZp}@}-I=>9 zcX#fd+`YL6a?j-E<etqvpL;p?ZtjEJ(%k2{FLGbzzRIo4t<JUNT61f1YjeLgI*pOW zL}Qo6of`LS+`IA6#={zqY#h>fa^vX6%NoZuUeS1E<8_TUH%@N6rSaCr+Z*p_ytDDH z#`_wlH$K=nvvF4Ai;aJ6{9EHojW0LOZ+xZk)yA5}HyYn;{GjpU#wCr*8h>p3wQ1X? zE=@Z(?b@_k(|%1yHl5UTa?{yOmo;70bWPK>O*b}8YMRnCy=g|%V@=ODz1H+b(_2mN zHhtLiQPWpVwM`98KQuKqH8-tm`lZ=v4x2kRcW>^|+_QOb^HI&mH4keZ-~6ZM8O;wj zFKMo8UYU>Od*}P)`{sAe?~&g#pUxkUzdipz{*n9>`DgQU^RMLJ%D<QYAfL^*<kz%x zXxXA=zm@}9rnfxU@=(h&Eel)TYx%O(Yu%-Fc<W`Ym$y!6o!C0L^|sc#Tc2rtuJxtX zw_5+v`bq0ott;AMZSl55TUp!gZTq!7(Dqo{%Wd=9-fjD+t+uVct)cCkw)N}RbB=ZU zzdWz5{Qu|G|AXh1)JAJ7YPYNHT6<XSF}1^LudltSc5>})oL7r$moGnX`OxJjE+55t z6<yJr^Qzy9gI9c1IIrqBubNk^UGZyO$a%GS-Bxwm)^(}tUbjQtPIbH2?NxU`-D!1S z)OW1^UH##lSJUesw&zv-PYt_rULD1Gbz;Ls4S#7^*zkVC@`eV^s~;M24f%$j8-7{2 zSyni&e9o&#wqxPE+Pd9&)s6G&0CQd)k{wbwuSOKkt8=qsIIpg2cV69+oszw?a9&N% z&fvUyG&?6-lU<zsl=Esu;k^1Ln=PDIZ8_n*ig8|Tmg`tJuR59YD#>}(qi|mJ&h^dh zmD@L$=DZq|8^U>YT<)aYh}<Q)Yjf9|^Xm4}c{M%vv^lSy%gxKx<lZlxSIcs>x$n$* z)y8@CbE7o+jq%2<8@n~`-q^n}&3SbM=hac1R~K<!UB1zIHKpBo^+4l{#wQx*{^q=T zo%8CQ#>JdhUp6jp%r;3==cZ&+U(T!Do6=1~IIl)DU0OJ=ZfLrR^XmS>dG%`3>*l<A zpY!UUh4U)Qd9}9bm!|ccR~-uH)o#s4HXp-zbt320Rh(CkG=JK>vUzR3lJjaO&a2%x zulC}+Ixv4{{-ONL{FC|T^DpLK%fFL<KfgHNm~YGf+|se7yd~XokU6hrw9MhWdcWnL ztwHN<t*3Bajc>i7byDlCt#`EE$9Xlk^_A9lT9>qb*1Dp#zHnY`#(8y6+e2+na9+LA z_Fmh^Z7VphR<?c1fmOTyE6%L{_|N(U|8bN5-{60J29gIQ4@@4AOegnG?#H{^eUg2W zJ0^EX_7X`}CsWCu$sWn7WOuH*C6mdnybJD}+%CCgvSV`dWQSxl8A<v{Cn;UmbzR%F zt!r!7maffRvt57c`eWDCUBB=8UDt2BuIl<t*Ogrxy4H8C<AM7MSl+dkzrTjBy8g54 z7hRWj{jBS!T|eo%r0d6BKkE8n*Y~?F>iYLeJS&$&Z6%(S?6}H*>SR=Y313t$<?m0; z^^(eujeb<Qn6eMygUa_S7ghe<lrH4@oyxZ>->Njbukww`*D7D7?3K#-m4B&xrt+!E zCo9cw-Bb2h<xFjZ^>F13{(cA^tbD)}N##9U-CcPXe@}%w;f~7NE2mW6T6qih<jR}* zds5|1l@lv3uN+f(p^0;L<yn-TSvj)u^vYu^hhiU7`G?BGD+g8XkG&u4TREU|@5;Vd zyTHzsJ5~0s+@Z2dW#`JRE4QlbNZDqPsQ9H~jYvhCM%7O`72iMu)B|%<v8>|Diq9+f zHw-HHcMB@s12g`Lcd*{9c!R%RuJ~)kixn?a%&mC7;yJFLt(a5smx^a9W>-8|G0nui zy<$qm%@x;FTvc&J#rYLyRGeNhqT=L=6Dv-rII`l1ibE?7tVmbvU$GBu`&aa<*r}p( z#dg>oDmJSqt4LJvIjkZE(Ta#jd9HjVf0JQ38J4s1<txgUm)DkmUH(=1Kg*Yue_8%T z`RC<J%RejswEUCuCFLKN|D*h)a#pbX!}1Tx7nQ$P{`c~C%ik$~yZo*4H_P8Bf4#h> z{MGW8%jcE<wfu$hx#iE7KUe;j@@F(}+B{wUaQOq})64J2zOVe=@@eI)R{7oK=HEl$ zb79SY{vQv#P7H<zR|LBSj|3M4JNpa60bzH)Exa`7!+*&j>CX<14EhHHf?>hV;eO$9 zLEqrg;1T}=f3d&F{~&mf|6UDd8lB-U^QZXBf?N5oC0OS_7px7w2>S-BgSGw_{ulJr z&;QDw<WCCT_Al@={uTZhf1H1AaBgr|(Agiwe}nznV2VE_*bmR+_?$b~pWt8X|J}bL zSQdN`tnz0CANZr`@9)7I^zmRYmH%c06a5?fH~jhj{NP|B9Y*VPkoMaG@f!V^{#5@C zA|4$K3<kjf9gBZrFy4PWnBsjE9O!rOdudMmm+>e1R}t$5zn{Nba3t5K_}Sp};J{#r z_bah?^Vbr42yu2M_9}0sSMP7-FZAkz9(bNYghu~IZ-RF%|7B<?!ERocpqD?wKgAp4 z5A!;E+j^nrd&9lBcQ^Ttqs0x(!NvZ${xFm0VDBX_?T@tU{oB9&FWQ&+quO8n-`eim zJd0SMt=)O>;(s5<<=%83R3DG?!RrO{y!rgieZk)oAv9kD6!&rWaV>MZKqs~IkGs}g z%iky3E3BFB>DG3iDwbLGX1kZVSE%i!+&5hPcS^)Njuz%F_J+DAY81D-mb;ue&Z{s> zuk0V&*14~Et?G63%2eG0^>6z}$6x&8o=aW-(iNFGlx+IPc#XED?igCEa5$q~R>M7u z7O4WI@o0AL(J%y#bcpI6rmfvOHjeBJ-{g9#!yNy6f86mK{G1i-Y@M+IdhM7Q6pg6; zPJ#^lJAbDCJ5KF<Ch`2~hIZG?jQ!)Jiv~}$d<l4}m5|P|y>yYTlH~JYcd6oOS5HYv zwe;d&ciB;TOCQ-uc9vcE*GG1h-DG#^Cws`AvX}Iiy=5Oc(7V^)&hPGD&KYqvr$Ixo zGWdoQ=Z7F0GzLvUTd*z+!$=qnJB8baUBa$mGVB(1539nSVJfT+cMN-neZs!suHkOs z?%`gXa0iBi!b8I$;Zfo6@Qm=H@Q>kT;nm?y;iPbKczbw9cxQM|cyIVnI3s*GoEbhA zJ{~?1J{`^up9$xL&xh}YAB7)>pN5}@Uxi<Xwc+w`MOYWshYjKC@Q1KD%!fZm+(;y{ zb!6K}*GMYTE7C8rS7hJFev$nn>Bs?*10x4T21b4#IXH4iWKiUU$Vrh?BBw@9i<}iX zJ2EPAPUND<A0uNU*G48pu8-UhxiNB6<gUm)k!g|Xkq0A>MrKB4MV^YxiOh>Eh`bZ| zBC;y-ZRDp&HqsbriZn;^kzXV0qx@(r>PCZTBpQvzqVZ^1bh~J`X!mHJ=+4o7qX$F> zMURO7A$nBwnCP+5v!WMAZ;Vckz7X?bu~<Boh?T`Qi*<-?9;=9TiVcWOirpN0D%KYJ zC0-ft8BfKl<9o;Viysjm9v>AyH-27xO#Gtw`1nonJK|I0v*PpP@5H~1|1-Wa;U~6D z9F#aaaem^W#Geuq5;r9#C;psxrYu&rQ`w$n=ZU#XcbjQ<i@z7z4Ne9JMikf&J*|M& zb7vX4qh}PTLiIdVdcc_ldZOH|2JTp%om#3<-LFb7IH!RAOGA1VC_BP=1$v`;7ASq- z`~o|n7ZlhT)ptq??|*nIYw3$#RA5*1;sU#&e=M*&I<`PR^pXO5pqCcd6TPf}&egaA zdXimUU~g1UQ)M5x60QQ?q49LZ5b_R`=fZ|?Ir^j}qVw>yC7gjiV~OY-y=aMSi@t0L zA4Wg31V5llEpeUOR!eMi-fNdzLUK-4TFQ8DmF#Q@=`*>#C7g{i1|?))BpHJel5cWf zOTgKd)H(=%MrT>VT9mOUVIBIECBl3rH7<l-p>r+q`RF`L;wJPJOUSv}jlHEr*e~74 zMTsmxr&vPPv>X2>mlCp$-8gHNkoE1xyJ;n4O}mk+5?O`vZd-|bi{4|2mZ6M8i8P~( zQ;9U9k6R*5=o6Mm9(~CYPC{7=C1^u6KL|CidQ0Rdw80X|igXVwx<=i%u*8R>TUvCD zy0gYgoOSQs#S-g;vWJv1_F?xoEOF+g`<s^dMIu$6B_#JM-x89074ekFG;}*l<P@}* zC43&;!4h(xR&nnsA$eAD?<uhX=)IOOf_`WTd!o##60&Ah-&sO(uVP;+VHNtLC1kHv zF&9eYS2Smdu#c*kYbA0j%A6`;5?x~nIe)6yb4s8wv^|8ZOAq#s61`ER=L}1D8Opv> zB6HB^Ec)-O_2iyX!mcP|Q9|yyo{KFZbKaAF6ccA1HmI#fnG&*RQjR5L{!`4ql9+%p z|4M>+Pj#?x=1PinSHe%xN=xE=lzCCYGti_Z{!f%SRT3J%%91z;W!{yz#$c_K__=5w zOME|cXG{DDbQeo}Jlfw9XAmj&kP<RKDfX8VQB7MS`=SS0A{z5VOH^Z?WQiVw4!1;) zMNhUw2cf4}qJKb7wM36XM_3|Hp*m)We1V>62^!F|ED`RD)WwzvdoOi`#n@M3gR!r| z2EAWW8A~jIUSo;rI$UdsZH8WFiN#S}Gl<2|>n$<Pht!>x@I92XM2W9N@3usA4yIWW z?4K0(h!Svyr0%!Gbc{1Bq0ZsMmT)rqh$W(P{HP^z5IWNm8Hhe+iRhX<Zi)OJeZmqs z0OkHsA_t>SS|W#_+BfLlPCacgwyrnCbxhnBN<`P|6-%Tm`l=<W@fTRk-hK-k;&-5L zTM|C{wI#e7U1f=XiE=h5@iFLkmY9cTE%A5IR!ibfXqzQ*HoDdlzX|=t5~~p2x>~|N zqOQf*<WUXA4zNM*wd$xP%KcFtvxLN~j$7i)T{U|}iJXSA_DbX|baP8&9?HF|#BN5n zw8SQ%<(6PIs`-Jjxj(BxU!$wHvKV`NY>4+nyIJDrp}j0+JE6N;^ykvm`&$x!Mh99V z_n@q|V(h`#VB#N%4UxN0?oWmH|582FVr=f!Y7hrK-eT;L*r4}dwYCR7Lr67yUeVX7 zYV8~JJx2Az7X9Z6cj#w{c1QQHL>XUi)<Izzq<3i1uf6t;SR(6D?ny;oqkC^>i8BAa zJ6nuhg$)t*Oz$2R-Os&;Sb~)(`6^NRtEInM`V;P{S~{;~&EznY^{L$k`&g8|YFP_8 z31yCI2VtLrsvl>SOhlQ#TINospu^x&Z1#Wc^>73Bvnczimc1a)qm$tl>=)46-~;Tx zq90lkTE7^+ro0thF0wq$QZOIOISZB_jeRyspUdgb8HaNAE@wWRKcS;URxmDy{#MXN zi4t=KV_dNVpGRRuZ`cL<aFo5I=;z}VtkDYgkjvOs91P^7PY70g1pmNZjV`meKceKQ zxIdxfskm9R4!+0Ep^X-O^01;AS}6Y+)oXBnMWN2eUXPM{9XWfdWfqUz>o$jS%46tO z&<VQ(x-GB|ye-f!&=tD^WuMit4?Oi{%yo>}V_oZZf?cs`Q@1-XW{-VXw-@Y>%^s>d z08Yj3gPsOUv6-v7FZkzL>C<}??Ff5gx1qm-LwN>BpY{0FPs65<`ui;Y)#!A1i1G~j zFfc#<1e7^d{L9fFEI#vI&-^O>6)5xDunRW(qJg*#f8ZWuybY|G;<Ha1j)Gy7_eD>z zXg&=m!iALgM=ye>v5!Rm0&ij8gf4{luxFs}!`Ij|(dEEe2JFv<2KW~HC6wHi;5C$- z8^|-LL36-*2XCNxU~Ym1DC?~R+RrZ{E92PjqMO0i*q@1H1zhYEsAti0IO_xVtDZSo z_JpGMa+W=k?STCa+7Z|r!A~e_uSCc{TWJZJQ1*cm)}!>9WiJHH=(d)q#$z6pDEVdC zA4<@Qat0{jM<{zt2^d?p8|;U@22EQc^UwoeApY9V?=9iy=)o3!-N_yTtV5`MvWD4{ zu&dDFmT*V(WJ}l^J;f64f{uW*@Mo>FXIu0f&W^I^Ih;MmqOTFzbKwH~*#p@za258x zXvPu_Mz4b#C_e(d(Gs#RvlA^L>zvi~fRMeGon$fVax*rBN29mEt=Pw)Q{Z-N&eH6i za2NLR=-n25&z!x-5{BqBOURzha=&CB#GiS|&H(P2Q0L$gOQ`K0g=Z+&`IrOGVUI>@ z-~(*-eReUhZXsjN>b!r2t>dn>m_4R@u8wjYlkN|Q{etSAgYZCfr6nAKegi*JJ{ipd z`zV}><}DHO&bC-WjnQg}xTx-%U-7?JBqtETo`FU!QT9VF2CQc|3oWzgYgvx_CD(!S zr_qkE1@@oOEiKWV(F#jA2(7e)hoYT;{Ty=N=h(|iunz5F3Fo3o=#I||Xq83RI@bfL zDW8Y-vPf5S2TM2~-O-}&6LP(QT*6n-zOV=O>*!vv5B59gzOWzmduSRC#(p0?#1ejt z>KKlsd<i-PhGKt-9%~UFJq}KwycT7z<W9k6{c<DVOzc(YB`^;ANAy~_4!aS(9wuTp zqqkb3I`>m7(I|R5uy;e&Eq9kipKs*uwuGGNIrgFw>U`?DLih_h9Uj1Dy>q%|&u}gY zI>!>x{GYW%)R+C6dmf(v)wzBdn+CZWco#c?>KuK5U5PHWM7Bmhw;1~iY>0G1b-uvt zpJmuzQN9hT^TnQybVk1e?)8YSIr~<Lq|jE2v32}wD6dA>S|o|;Trj=}dx0sHM%F*F z6Ux{c$vwh()ffkIkL-?;YhxGeJ<x7|uYQ(n)Ve*f4@3LI-q=T?X*d*{^>5TVh@5~P z0n|rMM70j|`9LH4wee)^;V5T;5;+IG2rk1u7aeDbXxZg(1?6gAX^FmovPYCq<J@eC z{1KgOG4?Ik5E+Z!YBBZ{?As~71iiz;Gk0mc(-I+%#=9&$hnL3tED_CXx+Uy`vUeIE zB#!1d17>1tj!(cW><l^=Uc_c!H~!TUnSlPy5@C-wzGN}>%h(XP0iAC#_AA&Bxe<NU zV(c1h(AU|<*WnF(xMv#Qv_x(~-vQl|lhDQRF}99-i6y!(`Xwx*{BCqP{D?gb&4TWq z$3>b1w#8=tn>vH;6XG=`VP|aOHuZ&Fu~(qGSwim9rrlvb%IncI9EnZrrXg?=_ImVW zOO(CXGy=}%wZ06!6j+mJ1$vbwx)pkjC1fm3%&!vOi86Oh%u{r0l<_w)?&vn?6pNnW zP4@$98P##jutXV8(_@w>=V#ONmZ*;JRd@}5?ujPmxrup>R-tcMqCL@fEm7{xruX4P ze5%opEYTg&f5KOk_eN_i(Vfr+i@ruQ{a}f5Z#L;1HR9hFZMH;pF4w|3%KM?eSYmA` z^VsZAz84x=qWhp7pd;nKL%Um|`=LE7(fv`zpy*z0X6>2><DW)ZtLCGyS*PY>;5h74 z(P5V88R&^Hp7N3CpDg+s+I$r-zxsTy`C&`+V)PMMLitnZr%;E@+%&JWm>d{mK1TWX zXeBUb(VtQ7J%yi*NuIgOGdHm<(OoV4#7y$!pWlOW_DOzE3qMVhJoA!gOtEdz11x%v z=MRM2DQ7<N?4kSv*kjR$fLvo&qch<N?Ca1c;aP0Pm1m#i=VDJmUxZh%??7LJx3KR+ z-+}kAnS(rgBmV*R<LF|@Vsl>P8=(c8eUxV{^J}p2%QNN{)-Q%{OGnrOyB;kE)-cAL zwJ@d@#uH~AS`LEg*cIr5miPrIV^M^$w#<NM@VOA30}HWPs}^!p;`gBB+43be=RgZ< z)9PU}{#NFzmAx4!w^ru4bvQP;ww?l)@yLNWY`xr)Aiq}jMe790_eXC4&Zop6l>4%E zGWOx<t#BLmktlQ5dN=kEl(}mq&&09lbC$%pDD&O=66NQi%y%pEoVXZeo?HKceI>dC zKEY;<T0euYux~<FSQ4yvEA!aK9!t<?Til|bN7@n=k3HO0W-;ZPVegLrJe091iLX)S zyp27Rs70CMw#Rtp|2vfVYI_-*Id7Y939d%Txs7!$J04}e+dje`iGB>k&}YtV<k?1k zWz1z;gGFB}+gR_mZzyM8+rEYM*jI^@yV@YJDsh?ugCzQ(5rZUlLZb#rbVm~gN$iPk zW{}t^Xa|GDPDS~Dm4L)XpdAeoo`Y^<&}aBgQ_`S6e{-6;86+|p?O~9_4rt0Ci8xwq z5S~3cO}z|~h@tAY19P|=x}!l7d!W4ylBh&=4BYdHm(ZOJlK2SS#UP3M(Y^-pzD9R7 zNK|c&yBp`5=CHd#qW#f+21$I1YJZ#?te4ZI^TOGYcpcr#Ac?=A0}R45J*R13gT(Jb z4=_l)1|4V+U+4Ar2Jsf6hZ`guh8}5<*puiV4AvfsJ(PYQLXR~_;tljTgCt%<k2gsC zVN}=b6#VZ+Pc=y5S@aBp_+!ws4B~x@o^25C9dwjI5-+3Y7{vPtJ=Y*H&HX%scskFc z4dN|E&o_u)hF)M0Z#8<MLErv6P1^Sup2K{AUThFw_rf0y{L&6O)*yT?b9kLsB>EjX z&LFXq(W?!TSb$z*kZ^DGT7yJ%k6dSv$eZW{gCuT2?=VPgHhQN)!u9Aq27TRensn~C z*Lm%Bnlz6Gc~7+peaIl;KhT*5y-yw9Cn!=j5PjTW?I*Cg=YwC+Sq6#ey{3ER&zzGU z`iwz12b?C|Pk*6Y@2BSs5{sfQ7$m4e|7wsjou_#QDbxM)H-nVvI_Uktd02J@s%xod zj?T@i28rrA>%OdEj0d8+r(fs&(p>ZngCx{n=k87N`2>B-ATcd}+aRIt!G#8WKj1X| z-5@cYr}qsK*$4g5AW_|?x>pv{ukJ71L!5Qd6VZ<i64m{<#2|6)NAJT=IdgQrKQ~BR z&zLU_5>KPLX1pdP=A*R+;e2+QRv3iO@(%B*6#XpkG_5j7>=N{QgT!>t{9ur%#&0(0 z=WeH|)gYm+*BXPwZxpB5H%R<$G-8lAV`^s2K;o0pm_gz*(1bzad2};_#J@&67$nZR zHE(W^IP=lGg+bz9pj#Rw&N?(#8YIr%Y~IQsapt(WlR@I_$L6jEi7~gl$5SN!6Uw;+ z5^`=eA83#mYuL=*1&OiN%|{r7XG#w5_Y~oolEeExMPfSEV+;~ogdS^<*dFLegMJ2a zn$I*yG>2Yhki=)`l?I7(5Ayy{k+MnXRR$@$8O<0ZwljK@L8AAdw;F`^<WBQcgCw+1 z))n;Gqtkq!!P@s@-(M)7jy=6#vqzhGZH}@Zc`vF+I0b#wAdxQUOoNndk3M0La2xbV zgG9Jrnsp4biSq*b7lZgdI>#Uhom=i@;NdU&yg@&!I?XQ|^x2WqJl`PU`RFSKeb3-D zbI*c=m!hv3Bo?4G25WQwHtYR62z|pKJV$bx7Z~&zi_`p;K|(F#z5;8%i~TNpL&y7` zK_XwGx~_}x(RF^`Adw5v4-67sg6f|8ko{1N>O68^$8?Wz|LXhsQ1kr6AhBmr?q!hZ zuc+<=-iMj;rPxag_UG827i``4UtsH;Ei*`5+i|~xe%^GNzcNU80{XQ<5;`}v28lT6 za)Tr^=M@GCPenOT^|MC&U{vRb_g4{}8{I>k6%n1Yl?I89L3telN$8qn4f-6$Y1aLn zV_dz^7J~#@)@sn_v`+IHgOnYFt~E$>Z}ew_l<C~AGf3GrsLs)^+!qIklNW=8YC8sr zZjQPJiEe@V28pmw^AUqY?nR>p3D%=AgTyaG;|2*eHs=!Pa~mgLW{^mCbTfkl%uQbV z*n&0XJjinvfdu59FE{A3UngH-5T5rsd`46B*_4y#i~`}gv6J80AR+Ua=ez<5nVUTG z2vVlG^fXBLJ5<}JC}$t$*=Hc(xhQiD68|&0qe0@_AAA;6^fQse=Rrk;GbZ29pwHGE zJ_{<=J_P#^;%J}TGa&K9P>V#lpYn$rBt8HgY>>G6vaTTU(WuS~=VW{is<|G+{4}HI z8O(mmpO1Y$W4R5zz+mo$JZldUpM+jy5WY9!<k_zv5%x)*`yZri7gX1e_eF8`cz&Eg z;_U1E<pwEZZ|AQxnEN8H<JU7**Wp@&@GRZQPc)c&Jg<FEqOZT9HyebXi97kp28ry5 z-er))T=Z^(L`I@B4d%SfKZebFA)c!^`B?_xyG9P5krj#PJU?YHXIfs@@6Y6RF#4=P z%FaZ!kGZVTDd>v^8|Sase<hCI2lEW(49siZf5X24ec2$9j;QX5*C-!^zHTsQV}1el z0_LzY`kuj@lYAC;z{XjE%{j*NB`5!hK_YjepBnVJnUm-20{yv?lmFbHKf8DGx_+Ed z@mJ9028nBKx=wtS)7RPjw+8*0g_HlzApFe2$u}7!&UujMtN?xH>9laKg2YZo89zvj zb#8GD5<3_53=%s7^$ikZjamYO#F*O_?n98+*=WolQF3gF8zeRr-OM1dvry(ypEZQ6 zPYd@iNQ^z$!u<;pyByudATjo13u_M&WAC>xzaTO8e#`a-iE+QQBn=Ylk9Idm>~@s< z9V9j!?QM|QBWNFk#7;wZGUziFr)6h@#2!F*H%ROxbWejmpK)3aH0aM$oR)zGiA_K= z2K{cU({hbLVmiJX4EjvlX_;h@;8ye&gG6>iweKn9$sTCYyl-cIc;C@-w?QI0ulE=v zHXog4kVq6&zx(jN8l7&C`1k0;2H|@JPK%ED5!PMj=W&C?b$z&xK%%FkPZ=bp>+`fh z_?e^AGTR_g&E?MqiD~&9gUF%ia|Vg*igK@kB)&mkFi2t*`l3N%I+yHYkc7?$_Y_Fv zHuQCaM07qD86<K9`o2LD^(glgNKEJcLxYs*d@eRfd?@;nK_c9{E&nh`$l2Vo+#unb zXq`cVJgW2cJux-TYJ<ddeX<5gj78fF!guVQmY)q0-&~wl&P_1qe=G69+AFZRH}y55 zmA=5*j6t6bnR4#oR^A)%Jr<{RrNP?FT`SLFOgVGcx~gD*i~ViE{tlb>55|Z5TghMT zHJcgC`MIV8b_e?&b<I}Tyl%!)=(Yy^UX!zi`v@fZ0a|5{*eG-dgT&53cQT02K3Q{s zL1Kra2O1=CB6^TP65KCqSQ`+2w&koj%plQ&(ZL3Z4nvPL2;U`h)(kO7VkUaDK|IE{ zhSxrj1n1-$))mCBMvpZ}g1xuqID>d^pvM~|@h+-;48y-1J;5LzYrRHuJ&~ACqMGYT z*zDgmoDm>CXU`g5CqVp4^bCV|8gryUydzMZ>$7<N@E&@$L7!VXYjo~L(Y6<QjzJRa z(>3QBB=L9jJcD>zKH4BYXX=^@4dT6yawdXAHD}I55PtW_S#y;^62C_|b3nXR=mdkr z*|TeIFi8ASbh1I8e>!WX7{uQN<(vWWxgXcuZ;<$3(FYCU$Iyoj62BIG+#qqy{~3eC zA40j`L1KSFwLPz=G3~d;APJ49<KZ)f$39)7>+}Zw>YiF)5U&+|%OL*d=-USIn$UL) z;_Kd7Xb|sx)FPq!a1VmSG?(QDyZ`I3x$hE}qALv&*R}fAAfe`{`%Ld6orBc|iC&5R zV36<&^hbj}19#T^WROtv)w#~nZ$GrrAmKr%=G4SJemA<tATdFIHc0#%be%zD7W%6} zVm-xK%UXj(*%xcCFi3b8dW}KiucE9Yh@6VDjv(<{(K`(i&!F1oF5V06kKSvL1i7qb zoFK72DC-9zx1f(1BpyXsYmhi|v-U-U{v5<v%Q}L@K1VrYLHupej}78Aqe~3p?}dJ1 z5U&MgjX-?viM6Z|h<`4+!XV!1DC-5{vqo#{4dQdpt!*%fe<r!=AMP*Vv$umd<N5yB zSg2utaXxr+Xx|aWz<g-q{Ob$U1ruQw>%x0_{k}-ZdoBHWabyPb-5FFDGd^O)Ilp+$ zqF=9(1nm>}C#Ex>_-*Dx8ff2P5U~F{H1p4|5qERicBD;5>O11!ahb>#QK0`VripCX zAJB5Nd?vrsIvZ;FJzTCUN5MQ;EwUB;Y&8O=0`a$6C9-uA#sclP#-|f`by_E~?F5nS z2JpX!6n=Eo3z|i`P@g1`<Sc&QfHvJJ@4lGt#}5<fF^KQ36FY@g59e2I=zE7KP`1M= ze${3aEaN+qLtz2GVlzc#r*R@X58+p7MvL_AC$j5Q{{Q4{BK_!hkG?RC|GoJVk-fOy zYmrF*r6PMz=GR^Z!fcV>(SF}Pu$upc!hC)OhPw1zkptH8RZOl2P8az-WrtLV48r$N z$`8vxt;pfzFnET@5fep@93%3F;UYum^Qg`uN0*845+TR*5E;5q<T!FaewN6vMIt8< z=S1|RtjO>Yu$W(G8UXY8IwyK6ZBC!YuPG7p%zi-ov(~Y_@H+>ebKCe8BXT;Q{x5(r z#2!QaMN{}yq3QgJ5dN1?e(6a2t3c!My?hwI?lYEO^&!T1`v21$k*j@?3^`sy4%g83 zx~U=)sJourZs-paVYSGO)K44=OGIuegE26RUmL`pgwM^yxtaQ#XNpYj3=_C@DZ7Q> zx6Bi{br=x));5vb#zIzP$_$a)dqFK<Pn|4sX9Z9`b)3juLqzT-#yx4^`kpx=(<qy^ zK;+&|BKOhf^Z`I_576%e^&$@rf@LBP%@mn2O61|F$RqHmvQA`X4Zq4XOyuz;B2N(O z$sR!ar|A37ls`j1&ny+0(@EsnG8irL9BrSc-3$1>Fq>a*>IbX%dhA4zc}bWj^0$G2 zzBHa+c^WP<pL|}S{VQ!EuhxpZmJzA(VS&i&BZ0Cv21AX=o1KC31+;r>l*rrtVXnwR z`gnJp$ln)=yocYS#Uk&|6#0N0K4dNyj}iHZ@_*3w<0&Fbus@kB^64;<&w9XWk<WdY zFY*O#znmbl4E{M%<g0-qU-yM9-{qy<@(ka19l&=<%K+c{seC7L1mA<~1I;4ekjE<G ze%njryN*yV^8E~v)#F5dAm)#=M1C5}cgV1FXyYJ$Cf^D0<5`d72lBI2;<wVK4P7I! zKx8d`KX(>c=R=LiFXKgi?GN<1ei29Ld~qCJFWj^^UKwEH>i9Fn2?mLy&vrQ{9lqb_ zMDgc)@lIltIAy({R-DbK-)yxwo70xF&*?Z;oGk{6vt<w9^`Lx}I2Fspsif^zqs7@8 zzfK*2x^3utyQDasXN$8vc9(JDbnOJw#7U-s*MM$AfWEs!)f{np%n+w1uYakD;#7|l zr`H&9b|9Y}hrt4Idh>eGCkeB}*@gPPQ5X+dadxHsZnWEd0Mv-X+2!=3k3Gn1&kAw& znkr6z+V-dI-hF_6_8BD3?>a-9I0GgCarPy~e*MMSKP^t0e$(s3IbfzZ2S$PZ51cQ~ zLDR$;$TjDh^ZUNAN}Pj-igO6#KV&j27H80Gp!`tk4_zS6VU!=vybPwz5rf4!vX?l2 z$cQtfBg_)#sNv!q-2-TI3~h%_6z5p{j-&qgGI54spD;+A69<TM(iCw{jzYaSrz{ia zRPsHQK1TF`)#9ASSWoW^)Sp3|k&JsJerJw`tT<;;cD4Y1qxwRvIOmKI=iD+t&m-P> zi^Lg?jwZ(WHR4=AybG3ybKw|q#`wS-Tr^#rKlT!5Y#(th=?AODxpcNTm-XN)?37<V z1Qv^PMG~6DxpEjU>GSwX`+RY(BKFnzTs=da4DB<NUz3Ja;#^B!*HM4nG-wlN!W?m~ zA0*C=V}UpmYsI+<|4I1WJYJm1w7G@yTPFhj-9}zhMgZlvFB0bt%J1w1HR4R|5BS`L zefJV^?xAklEOG9||32#On<38qWiUpZ>5OywNWkxbevlRCLHc=UsyLjF&J1#Rc#b%a zFy=?8f3!`UnY4dw0IU+{@j<XaoF}NCHB6i*M~m~+6mgy&E6(h3;&5g<&-4dk{DnE0 zL;bUTV5T_FC4sW%>3?n+OcUn?a(t2UztZ=-;o|(QMx2*=i1Tu1apu!*KCxfzE6!`g zshKU#>%Cy2IB%rId2@(33&>}|1aUYgowsTC_A+taSt!mz>fVh)tvG*g6X!kZ-=ptE z<oP~r-_MHk!8~z393#%+!Qy;01)9bA2RVF9yN_o8*GuU4lQO6g=hJ?$Se(!3@3VE{ zEXC*ZK|o$#%oOKK;(STWWfOt6{~Q5}#Q6&UugL4`@#54HtCn#u?*r3;I4gz&esz6e zDo|EWyoL&(kCo_3@?5z}oNtDTv&skjzD2*CFV1(AeNT+<Df^zWuEt(nFU}7Gp;??C zssE9@f9enPouyrN7~hdtCQjo>n9I-gdhpDh99qb)Wfb7wI$4~yDD(l!_}+%I2EVoA z#rc`*b@cZOZGIgm&iXX07FX7Z>y8xHn=LM%f!v^<xM793e23JH%ojIGS(Lh1THN>` zz&|ln+_DkkZdL}<#O*Lf+|BXdobrxISRn2etHs@Nskr5H#H}P=<tlNv8V=~z6M;CL zXt&J}akqu-h}U_ExZ9IUmx1DTogi+K`fk|Wh|_(vxK+gNF&N0Jy05ss`axFQ9cGKW zBR+i=in|l++)><J=#w+q-F2?GyU}L%A>#HU<{q7a9QNu1#OXg;+`XyaXNtJL>%~8- zKo0xS=l<lA9w+VrQ^h@S7?AJpDL=TsxQEbgP`$W^68~_4nc@!aC+-o0_@^K;uvpw7 zW5qq%2ihGoN8F)sY#J7cdmQ!0j{;(x*evcz*u#gzG;vR!3~l0`N-iUaciKpC&ww-W zIg6NQ_Yij!an2!+bBKNJL~+lfel+dR?<4L7=!KnOnYd%7i+d5*7ju0v*Sx26#|{(s zl8!(QmrfD)vLWJ*<9gfzaW5zS75#vmuAC$8_|fA2DG5u&y=tnsR}U38L*LgB?^@bi z*9pdoJ7FNq6!&`cdiuD&S=<|`pEyn2N$Ab<#Jz>OTZfB#+XQi^kn`>H#huFd?&A9H z8gcKzciJ*>@1x)QSBv{VhJTV|skk%xiTm(EaUZ4qO!RTepI9XBlV##QwOHKQ!^C}t z@;SugeV+UL2ytH+BkqfH#huql+`kd`Wqjrn`&DAR#`Wv8eG?X}7WZxPe`m6|3(5KK zw0)2I_a}<`0eO5lQ`~>_75C$%;(jtf+)w+9`}s(5zf6m}jCNlo#r=AaxV7`dUC~e6 zx;AkesBa+FO7xq~;;!lg#QAorxZh0^_xsuWx)beIW3R^VhhaeeKN9n&QQ~IlFE>Qo z#wcXPZN|>iwuNh+0lO`<X~nOV@w8FbMxSfu@T*Vc_wy2Qe?fnt?$^cQt|y1}wc<%u zJO|tf;(7hV^V8ymW5tV16)&0*kMApZ@u4tVyo3*f#oMd`mWtPb_T1NA$9nO$SSQ|= z3&ksM6R%>Cc$MS%HK@7bZM{moP6PSXrvZS^_BG;lAx2kXbsYx8NRH*#p+<|>JuP0< zAn|$(6|X0x@T(poUawKGOg!#oZ^yncN4(w>#Ou>Tyq$=<^LX+4;@>wT-foobPHf&| zdHv>!w?{7^&K|Vc3wy5x;`JXc-ab+B_T_rtb>i(u&igMEFP#<dzzXpW>JRne4V)$3 z@5hOEa6gy|tHnEnn1kr=&}HHshJ84C1ocPYd*ndz{s2dHf<@vTJx{!2@EJN&ykpDw z$83myd|#LVOT{~3qIf6LemHY*GX0-I{L?y%cgAe-&KxP;S#UP7MvW8ioV0l7Hj8)O z5MXTQ4+Z+XV5)c*5_?R4@h(CyCdMD>bL<rHF7aWwc$Y@SyDTH#IO2_K6Yq*);$2CM z@x&d!K)gSV74Pa1;$^0Zcg=M1t{osA_pf)|1o0*$VV-!`llzUmV2OAWX?GK`CgFE; zN2nKX@*MGQ886<ggT%XyvfC(|g5T|n#k*sncy}%kZz{RoHCVj6hlzL3aPg*9z#{SP z#qYkfc=vaP+2ZlJ&zny91D$|250=3cs1@&_q2kS;{UbfZdz7-7_&+{cyeH`A$z|fr z#`n*ZKeI}_XKTcJZjpG;6ZiQE;?0E@i1*?&@%}nrym@Wny+pq+PZw|gIPqQ?F5av7 zyhhn;&EnMz;c+N&-pq*iR$uYn?gO>ry+dCMiL;RQ@1pPG%jY=ny*c778YSNQbM^76 zc#CI>_t9$cKCTdNNk8#Ep^s0;i}zU+@Lfv3pA+-*`Qm*+zh8C~Z`nxk{z=`}T=V|I zTTZMM<WuLvH1X<b-#|VqiTe$@YA7rdkM|DVcVoo+emY-Qqn{s$`y>1`LcHu`@pymW zHLl|^8M)*a@K~&uc&#<!wapW6%`EYFrsw@k{B^Whmlf~VGFT|y`f1|JAn~20;=A+2 z_hyLiPlYz|gLUFZ28$n^EPiZ^_=!G1*=9aW6u-j|@i*@;e#dFzZ;^(j;%_-m{PKR{ zSJ0+%miSu{Z|h#LSp038d8D^Qe9j7gd)jr$h|lLSKS_VxW{Tf^w)j=F=`mmYp7r9V zXj@HLuO2|`9q`|g`rf0(??a581XhW^Grqf!->wtI-<|7zQ^enc{`bUxudzVC`y>JT zcO%3fFc8RdzfM5>{rdoU?9bQ^z&<c7{y}9>EB^0kcW_^r3|a9HnJ)gI(c&LU|A*1< z;3484Nq$F85dRO95Ak8P_(zQq|L6tc52fzdQQ{vrT>Rq~i$9F9o-kDW69<cbQbzpY z^u_t$pUn79St$Ogv>h=^{L_~3BawRXNA}{;Bz|Xg7XNHwjw%!X9NM2t?&q!+|2*1_ zhV$V9{4Sg({upw+h`Ng@8{1F(OD2kcnTS6Q`*Px6fzOpw#UDRee9i{{s&V39Jw^OX ze<0^;=8AtUb=Q&egdyTzPuuIs=?466#D5|_lgh-und`~;+=BA?$G<fz{uF$t)QW%m zH1Y4C?VaR5b%OYJaedDSSS<cDVozHwKIejeUj@t&|9<N3Un2hWzJSjIi^P90BmP6g zf0(`=CdMPa_>ZQ=pGo`2i1!3-XN`q6@t>mZ>8SX#$B6&usp3DgPW-<t6aQJ_&c*MA z@#4Qoe=jZ+|F78ddH{8Q>jVqLe~FkcQ_iy=|CPDoznT^QwbA0&5bO1&;=jT87YNY) ztzj?+YQ=x2zxWF$ivR9l@&7(g{P$Lizo-w;md`H!`}lt_PW%rCL9_Ur8U9D~`w!wS z!S9n!;(t0^{Lf~KzZBok>HCYJz#J@_CjLMBivLxA@xLZkEq3h$@mH)8ziy29^&Q1u z=>zu4dhu8F6aU*~;;$w?XM_LKV)2`4*M_bk)>`7MT_^s}<gl(;{9n=ab0u*4OW^g9 zAm}VXI81^F8Wm`hAU0lt_(%y7{Uj(`D8XhK2|CP|VDohnY!QXk5|odYpkkl|m1zmK znj%3b;%zflf^8Q`(76I;O0azoplz205_BCZL9$GOZi6J~K3IYtqo7%Wo)aWU;m>^^ zq_PrJQ`T#;1UvMD8VPp9uQz>i{|9|K!c<r!!A|76Q>_F$<GV{Qpub)Fz%&VVV?4Xj zcK0Db-~G7m*CxRpu;*9__7a!|t0drkL$LQi3HG5ap9zBBQTIFg7(m+r(<Ruq2V^DK zj~M$?xBmcGDnXh!Y4iZD511jrf#i5#2Jk&-1kmrmK|mkB=lb9z%$48}>_cWrFsLJp z2JAzz4;>0~Bsi=S;B%PT^%5M;_2KB?X%ZYUPJ$!T68r&%R7h}C8PNVH`Z${Wj~)ZG zJ7y%%W+*yzq6EhdlHfSn9FPAn@;za^1SgWqNgZLG1jA`_GO<tT3=1VVRiGctlVHRs zKu?PT_G#3gPTlEQ3C>t0!C6ZsIJ;JYQIw6EF2Okifq0x%!Fj!aenwA`;C%W%KLgDY zTrgY$-roclPL*KHFbOWA{^GF`{1JQX00}Nh0`V`ck>E0Xc#jiYK2L%xCQEQ7ZLcK$ z_#UuKf~$PdUsDLKULZk+vTHg6{ao80Xn!5`*QF(xK=}mny`DBVi~#&^OiD1Z57bL= zQw0nJ^0;Xx(ElXbO&S9;pjm>OCrU862av}tLnXL%t^~J{^A!4;LQc2OlHd+}?_4Uu z)LIGd8V<C(8~^(|N-!P2=}RPdV73H2_YNMMC&5F#U;^MjV*pHpMG`zL&<{qz!vDkD z`@qLlRe9j&zL|ON&15F?f96dxlgytaGx^ixC6mddP0~zhDM1PhP)dX<5eplkLJ-jE zRt$(5v1(M*s&$FVVo??&*0m}wQM=kzbfchl*RC5CvAVc+SJcYl^!GjY%_P$z?w{Z9 z^P8FT-hKDozvte2?m6e4dxsn!MYxa7k>g|V`xwIBHwidJj{8k=d>mm8?j^?qDE}u6 za(oi$d=g<Fv;&Tj<8R^sJU;~gPn7}pkYf?`SUg0IPb1933*`9BPI4SV84n#K$7hlE zXW{p^yUFo6<oCJf$Z_}xIX;hid|?~l335EL1+WM3AUVE-{QoWlK)D`8_(u`$(I?5V zgs@A8$noVQIlh84zjB-$UqyMpdKUoYg8tlb1ZjN@W&YX>-~>6oJ_|rzM|%Lv<oE~V z@eMoR9&&thiX5P`j>n!R$G1?<Zz24*@%-)GfJJhE-a7sfalWGi@cdo8d)y5`yeGDh z<9kWKedPH5cEA!jez1!i#{mCSCdWS$0D1i|P7cU=j^jxCUr@#$A>V(UB*#h{;7M}) z7<v5!&p$z3e!2zl1Ua5W`cIxB$IlS&XUP94JpX(jIZlKCGvxRM;{IZu9KW;!@c!SP zBgfOo|5pdd@$Y4F{JI1{+9whJKM?jmj*#O&?;^)<h5-ok4B)qL{}y@u-VVUKQ@a31 z$?*pRFinnU?<2>5A<gFwlH-piIVuQOIYy4taZ+g~sbV{+%1Kh~TS#>b0#-;>=SbBi zNp<cf)dgs{hgA1|Qay)BZM=(A?>16>A;3XW{fHN6BQ;0>q!W6O)bJ>&5jS88aER2X z4nSVf1;8_;8b~7szb3?Mng%SB+6@2rF2D&=69}6?Ia=-`wH0BZ|4~y&KW&hjNs`)z zcy05fw$A|&t^@HpkVY11Wf4EO9e{i16yPYST?pTW=k9w*?a2X-kh*S=)ZPhF`*gq( zspcV4^ZQ60JWA>io{M;1Po!=@o+E%!)OqwiQpZrXjqnG}SI1{bEyV%Id(&N{o-+)1 zn$*q6=iF&hx0Xo-kEot^9B_)%iCusbq@IuG3w!{?+cr-sWJ>iy#JMO(>cu9hWxTuO zR#GqBL+WL~<MvU&UQ#bl0uGS6BMv}5R~#gDay#HTQeTX+T!}JWxkTz!bENJ>*qz94 zC(67NdA<aGSECMBA0l<C4e%JLFPj29Na{5Rdkx&z!2NOp>;xPpbyo;5L+Z8gyAJp3 zo+R}zb_1Rvb-D+Dvb+N2eFgllF9V(+^#=Ig0RJ0Mrrk(q_X?@6L|Qiv1NH+D_a=nB z33<)90sBb3c@F^LU$qPH7^$}m0+7b72zMLuzHO1zS5E<sllq$Nr0zkwuSLAq;oa+Q z1t9;wg#TY2C3P?I**gzFonOBNfOKB}45_zo1KbCAj?_2I01#((5`g^fC;<+UdS?!R z@NYzZcew$(086C4$p9dqH!YL;<{kiW`4+@^%PCUl5caLp0OWV~1mGyCZ$rLsL%RFQ z06f1P_jj}b=1F}g%KXl40OW)DL7l&c)OR7Tcg>OdZXJO8dywCI_K<oHp6@}vm@`z& z8R~nVCiQ)AzyA?Z_vZk60eJoZo<9iphY<IG9dMY`5AOt=BK5D9NCn@l-n&5R0`ggy z0vsXrBfClcDBxouz;ROV8wDWDU!$D&699f6N8Ju0txw?jlhdR=i1I&#G{8@*i%C*H zjj#_R{=>_pe&!^ppY;I_kovb<Nc|k%f9`2g5AP@S^CeQhFhS}Uw~_h?;y>~Tsb2#8 z-5>yIEg7VK8F9aYI(>B%fH;4T{Jut{etj=siPWRVNd1R-Qok_^K>5G9Lh56ON&Oby zefv16%LxCS9>5~0-v!PdHvw~`KA{5;?|aDidq+wA{yn7rphW7i9I5|=aQ}>SfA}P+ z$8rCc1El^4@qPsNzdl0h3c{?+k@{mDu%FbQ!0)HKNqw?R>d%sZgQPx%Fi+h_>dz78 z=P1jGMN)r(G=711zdTIpzs-^Q^aKED{yWO>>pi5N90oi`>VM3T`kyGzZ&04!AdP3> z|I8Dl{uchw<*UCh10E#x6w)|#g491C?`L}esQ-WE0C@M@3aNkGMQUXNaFo>3TL4E% zqhY`jX<~vjr3U~%+kVpQxI6A4P2EYFmIFLVntqrx=N{5r2T5y~C(WG%JVu%aVZ20| zuLO96H2-nZ0^3OohDZw`ZWv)B$S3L}%|IS8gl#%PS~Jp%FOZgiUjol9`$%g=*rWki zA}x)$>64_j*-2~H0gI$%kw*4b(sFq2oFT2t1fZPV$hT*iwBAY5`tBmlM1K7UH{b@` zM_L|v<Z&O|Mp|Kxw4o`|iqoVG?<Z~jF48t2t&uIHjSd2yA#LnQ(l#C?ZF~=DrR}6` zY9s9&)N2dMelFbS!oBqrY3Cu#1k#&0N!s~{^P+o5+lKo^IskqbKSo;l7-^S0N7|)G z7reE${V-{l-$mMvHUOS?JW1LW$Y(M{8svQKO2oYi?yGi^cFiHuUXE}tM_#*1q+JX5 zwMh56XGoil1MVX26_1d1J;L9BG<KuDyZ4j!O1N*_P1x1~m?v$<4wxbBX4L!UW2C(b z?pyYfb}QoFc7(K74+Cx`ZBGtxl(g60M;d6R_B!OXcLH#VwA)dhH^6_kjkG)P?oQ-& z=Ut?|5$U`s4#54*Cg31xZ`nrLoDP^K?X5}D?#3PTPTRMOw72gk?H#kEy%W#xJWSd= z;>;t?yLw1_H^RLK;oozDw0n@>Jx57<FXFuK5NYpUBJBfZ(muEcaEvt2G3@}-_^^+( zze3o1?;>qsk+hFIN!rH{=Ds7O{WYFHK0(?+g#E+}X`h7OgGlosg#Q%kusBWHrzc5! z7<GC0Inq9}kF-OFN&77PL7%k4anim(q&))o63X>=sMn(=X-g&2zKl3uMp|D%9$&@t zkuqt25BM7L|M~>r6lq5fkoFHcY2QGcZyY4;o49}TBx&D*-?yG1?c39&{o_5PEyMjC z<o{jVpD;-K9{j(LynoO`+A)NMjIaIk0%<?=0S=OOe3>-RA?-&`leTgzX+K6CelkJY zPm%slpCRo@g#8)f{_Gyoo`U=5NbeV@5BNvz-}aOCG|KoZ<oD}g(oP;H4Kzmk&w0{* zvzN5r4wCjer1v}c{~rFQ5cdxclJ+d}fj&@sZi%!%E|PXSNjkORDCs!hY5eQmBc$8# zY<mJn+ifFVg`aMc?i>Z2z;RZOk=`(aqb~5?186K^tIsUyzT?>DGe<i3Lp^Yi^xzg8 zfnksy9tI#@1YqQFv<1R9=>VkDybmUFcuu%UZ(%@stq7MqilZxb1D+&3y_57dxZ9_& z-E~49QK4t?zS9nPnsn#}^sZ-cM8zJ`dwKw;NME-|dhdSH`w$*>8v1}vdVYcQ0_re? zJcd#J^(fzlB#xLsIwLEjj~*d?Bkr5xq;K9%`WB?Kb)NL|kS=&Q{YA+00+aM@ZqhGA zyo&}&zZmIXGEDlVQ>0&pu-kK_Up`Cv4y1iW8vt=$d>C6#5#}nC^(935OLf2sj-)`k zQ_}#X{jxcj%il%%%MX!$E$VO`(we>%aDw#f%YbKKx{0#yUMBsOczz|~+=%!$BF&q& z0ght(*CYUSxcMH^Uv-l7TM+lQ66vp=CjB)i(`%MU-(!#tUP^!6DVU?;dG8eIw<F%| z2S|TIlJwaJNxuW}--xo`6$c=_H|@l67^9>^KGyF>__sZQBLMf1{?0kl=Z68v>s=_r zyX^q@y&KQ(L7aOC@EGau9RwVMssA$R`w{*FCBW09e{c(67hpdCX@6(}@EqyT1L_Bm z4(NgY;S;1|eL%l=4`2zVlz8`%GT;>HAAN-MkHP)1lcfK32ymG6`+cNCH>iL7An6D1 zBK-k7j_g3$KY?^Ui8MaBNcw|#|KM@b{|0$Jv_SgeUeX`V0TBOC65Awqk^Z;Sq<_vN z{qSzmKR-<R7m)53k=7Rvkp2kD0X?DqDEuCMj`StO|FXf`ut*2}(2pSRzehTMzmxQ@ zA>X4&>*zD2|HECRe*^EosRO0}M@WBcl=N@G{q6mv|Km}Zi6YE*@cdmoKaS_`;r$QV zNI$lP^nV&8{h#BcLpIfah<C>y!B%jT?_Z9S{-Y;I{|N#1kp5Go|I-tsKY5b$r{MP# z!k*ZNE$S0Engr#1dJb@k^j|HK{_oSI|5^v2EdPP~e}(|ZNdL`!q(6iAzZ(WD0MK5) zKScVeouogT!?7l_q(8Tetzmd~dIo05PvT!}0k$b@buzI1*2mkz0n6lc;n}x@Z7YL- z2gw;jn5G=y2sxV{0X$94#56fuPLMM>N6yqUI1-|aqfJ5pq}`6N9f+4bM$X)Bz!T)` ziUW{ekDZ+B+<;TqK7uq%#Ov1q+X2s!a{&1cB3|Jzwur!Q2;quwk09>oP5|DG9VO>R zJeLlU^BknNc@MUM;CZV_&hvJW6Z$#l`6x4Z0_O!!kn=*6>7pa#EZ;@WOY#1)1LWL} zcRLJnUa_5=lPK$p?bz0g^sk!4Hlalv32+ccRUrJ;B^*tGv|cuWEm8>oa+Lk$C$Rl# zAGSRqt?LlxFXpgS0&!n~G_Ob8-DPs#=mQ|{nJwge)qZl`a)_L_-iPhs2=kgjY-!q# zEl$Yyb&p}Y75w);Lr%=|PK;^i8<xm9yN8^2Aip=FtZ$mdF)+KyIfrm>jgu34E$2Qr zwx;Ohe5Xmy`B7|h!n=1P492qaJxKdKk6_EyGCALi^xud4-#-b!GvpEH2T_*~9VO?1 z65u#F|0+k$g+n+x2Jt_75N7)bf8P^0K4vH27&$+VI0uo(LBx3gd4B?7KLNi_q6`oA z08WteAp>xPoQs3lewzfq{qPjF*={H2XA%B$i2pg{b@)kgetwReUx5D?k^UpI<owbB za{e94_UMB!xkj8X#{nqASK$826Xg8rVR9bXM$W(Y0Zx(gYbVM1^?lf4K10rLAU%vr z=eKr|^B+-$<zaGu2kCwHR>0Hbe7udEPwd6kxJhz;AMbuZ0Hk?rH_X@flk<m%$$9)S za{dd_`4OJ~6?v}U-3sdZW4M2^4e&HMf4V?U=<uCSBF~?hI1-29L2~{a`TqPkIZxpI zFHo;vJV(x7K0?laJ3`K1A@0BH*uIRq{u+7yhnt-LiFm(RB<C|o|F_fR{GA<u_rFKj zQ$7IV{^4nIK8yQ*A?@el<oqMT{P7SuD-V+MbPjNwTw(&SNG_#JF58pjvI87=R_Dp3 z9fbM*E^;}aAy-2V@C3Qs2gv1_CRbw;+m+(v@*N_VAAW&Zas?kDSEvnudw4s!A_x;X zPOj)-92=nnj*+Vw@0$@P4tE03f^=I)$(7tmuGAiKrQHC;$=pM(Hu$w4Ay*de>?v~P zR>;-)2)VlMBUkrPa`jA*YuzB=Fu8h5<my9OeKP>03p(H$*iEiH-VGv+p#$V9!fzO5 zTK^omHXzK%adM5JJR7IUH4gvrWpb6~$hFA;+)A!<d;r`xGwdhVx$xh5lw9X+0h}b) z#5}gz!tX`M=S5GG>w>-H+7<#JuL~yt$oHZizyi50M!ID;fbT2hy5uf$U77<tMy|_{ z-epgaYx^#8U5@aVpCZ=|yuSizU2z||CI<mW$OYNL_2MVVb>*$(x+)HMhFm)l_9a^Y zNav-<|7w$5Q%Lt^Nava<0LpUBbL4{j;o61p*B&I-b+hD}-bOCa8Q1j>lIsS9+5I%R zUJ3V&h<{TL0AXj~ck?cCy=ptTZn=wGw{9cXZAkMrr1xsPdkx-!{<vNn0xXg1b!Bq> zWfE|NTzgl@^?Jm){Z?|#`mp6^l3Z^j0K(mc_;0=k$5bG%w;U(e+$_1?x))oFOXPYR z(s~=>@0$QTLaw*t-8&4xF><~033AQj`CSP2F2sA!AdVML0*>NX8^HVakZV7Y>jNnN z2TqdfLx}gGXUO$ol=H*5-#dvd7|3(s6po|0k6a(s0W0LX58>}adiPJ`*r+*j9YmOe z$H?`-Jh?uBJU)T2pPVJvgZr?h8}I)Hb$@7?T%U?#OEvQN^eDL=MmZpVxIP2_L(sz# zon8{NVu{@3qYxPsCkp0M`LI8nNo5NDLa><iNAp>&81-w#OteUbC>us)(J*hhCGpfP zx6I#i%MRScl2I`YLo6GWEAPL*a;WS6`<L$*+i<y`@KKP@3Y7$AWAY$}LIxS+3;tjR z*J0DtOC>RfWLJ<xva-KaLL56_UT_=-$`+v%Q88P{hqYq2k`U2+aZE(ddY&*$W5P7e zWH~v#<~%YVkIx@BlS@lU^LU+GmP?#o5lhIUjXH@$w<u<`44_+RBcgiE7xP-aI3kL8 zi>o7#5UB5Yq5jZKfJx2ezbJ7@qcb`Y?hoGtxI%YIA6Mn~HzjULh~a5`%z3kVGw0`# zH3@JgOTq;1FOwKah;#;j9;B(!i2UZ|jXkm**^WM;N#Fi~=s-Rp@?&DCh%djwHzRNC zQ5=d!T163lg~O)9-qxCOs%}pt6f+EEu*G9{*zB#Tp@3odBcVt*-W;+iHpNWD@}9GT zIlTTvqNUY{Hbh&x#6iO_l|ZPg)i6A6O;_DMr>^@W9*<^IRo&U+bZVMS3>ZegaQO>o zh6+0y6vggP9eobXF+jG{mD3e*r?^x0g#Zvy%xb7zQM98oWQ4rj>`(hEOSp(q<=&|& zL4b?b{8Cd>r{P65N}~N1(0;9Gzkc8`lMta+0jwp&h%%0D(#OeXftWG0ZdA*5jEQ_$ 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�y$t(dUj`qllbf50e9T13J2HuxkBt6svb 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 S&icdI$X;^t`46L!C98zrhOReWYHE4j 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 VZB9utHXM2XcdguH>fijY{|_bLalZfn literal 0 HcmV?d00001 diff --git a/groups.io/webfonts/fa-sharp-regular-400.woff2 b/groups.io/webfonts/fa-sharp-regular-400.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5973996013d1fa1cceb39883ae1ae7ad753eca91 GIT binary patch literal 327912 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%0D98g;YSc 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�#a1jvW-0*fk~HLGt+#g` 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%0D4(wN&&6jL+ws4T4fBms6E~vjM9U&(U=e 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 KRbMzoTs69}$j<O-{@+bAlSpJrrA#7` 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%0DX`(Mw(;N(fN_aNQtRum26rAhz5LEYHf72ug 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 B<-`C0 literal 0 HcmV?d00001 diff --git a/groups.io/webfonts/fa-sharp-solid-900.ttf b/groups.io/webfonts/fa-sharp-solid-900.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f93a2039fc2d7297dd69057dbcabd81ae0986340 GIT binary patch literal 639276 zcmeFaf1K50{{R1c{W!1lV@8IVAw;L9&O{-E?1qETl7tXK2q9#J&~ng{gb+d)gwPT~ zOYE>&Ss^PngsGV!Hk>mvXJ$(Dy+5z(b<Rw&``P#B_W9gypFh62-FrN*>v~?#>*wn_ zuk$+RL>v)GNJczK9(l~JyPtOC=|_n;eaIbs#`&j>|L)d9CW!2@LgdhSXOFx5tSxRG zJyhgR4H6qMXzZD%jY(xv@8LTa_8Louzekt1u^XV**z+e$d~juTCGn<+>^@@Lg=d_$ zN6o{&$d%Jbk39dhiQ`M>dGx@E;h((VwDZrrXU^z85_gj#-rDgOUOXXs$g;G=gKi?P zY%X|uenh6Vc{iWB`JlX%xKtCV`#w9TLpRjA8K;(XOkAzOA8ny_L#>FL*^u4P>}JAz zQ>cHH-l;jIce)#78<VN^oQ=GEH||ZAi1^M>=PXJO4K+`V$wZd8XKLzSPFc|uIpFwX zj$nR!Y}jD?K;P2pqb|-q&Z9^YD}$y{rB*yNAkV{2N-brUUC8svD<fT|zC^ZluuZ2` z6`SuEyO4)cPve!D@`9$NOlLBzV>J`Tp$_eJlxf<MEaq#u<`p!(q0Pj~*m`bS+%WB^ z>R8l2>`PMnZN@HQV!9b!DM@OdOuy)7!8U5k)yK5yrj5Tzhjqo|iOJ8H7#Z6aZQo7X zdfH#LDUX_bF}7(_^9y;#FGE=;ih0th&ac^8Cmq&Rm5@xBpJtqjrsWrmHu>p}{{C9K zg?^g)8i#%3%7%3&P2DhtZNrv#<O${J&?jTGtNPQ9u0@g<#knV4W@1@C8$&wkYTpz$ zZSx9g`q#zS851u~y1Y;p_AyQ!Wutujw0&KNa-+2-zFrfy9gc&dohjyZ?A3x_I_y(H z8B<}uy5texjs@);FPt~qR#;ZZbJNt35Xy?SNdID)=0h=Ny2I8y>X`B2lQwaMytJ)T z(83&air=}dU)mWH_m}zde>C6ukNx?-&<9<w|Jde#F+N>qGw<5JPK0Y=%QQ|}BAnGf zYkU9W`PcfHPG}6hj?yM>aX*-JCd@08{WmJ6PueeYh8O3gbFA>XDU_LUQ@+vo3vCgv z&|i(|7V=do(>jGX|0^|XM7?5rwRU`+_IgrngT_rmsN~t#Ae}2QK6ZTSla%gZ47IoV z)jp|TflQ~^p>67`En%4|m_BR%#-!b}%`3JQmYZ}~R;*J<i;YR#@bz><yJ<t~Y8hIn zUmQ<I9qaR-($p`+DYlKj#)RTI?WXZlG974prp-dWs&p#P*z#ZP7iDg`!`IXkTfgX^ z=~Q0uRiDoJg|tXlVszEl{o<U6Y)86lIF^pN=%}AIzO~dzgM?&E3{z(EHLYdoaJ(5) z-nH0Iv1Ry_Y?Md7NvpqIKb=oYm}k~b>nr5_T7Av?f131v-#-`MkaE<L3CAy+Xhude zC!HzIlg?F<&h^OWoZX=FxzXH)K4yN?wyv>_zwN*KEBPC>fv=|Rekxvvh5O!(*2t`< z;GYJx*si9b)1EZ<8^lc%`<t<Kieu1p+SW1sk&g0WJ9b}1O**qtxn39A2dl)<bYVYn zPiJ0}$cq-nT9}tj+oFFJVJvYqPNs95jyCoEL&2}3osRfg*Nj#D3Uu7Jh?@@cr6W!u z-v2SpbZR@aO<%FYbx4}F3Vwor`WO8v%x!VJ|FM6+tgkU`I}*mu{GyGH*lEf#QvHiI zw9c>9%SgvPm6mVXRyu5}pc1AFs`(ka#^|YTm@c+YnaR`q&SXp+k36MgjcvY;XX7!8 zZG(BY`5k`dy@9UBM*9VSGhX#eci6?frum9=lyw?M5_@#fSA9B&6zb7l@qJ05{el{w z^v1DGUdHC(m(=)$SUO&l4%;ztw4C=-*!Fc@(`n7?V52@3%F?n~!H4p)!s}hJeVy|# zMzMZ|_X4(lU^G))Q`272PfXjz{uIWmYT~Cm`c@p9mTA3oQSH2GUM9>#O$_qFdn40^ zsn^NJO<O-lHnbJSfOau;wXD{nWg17*E?V#{l>blF^fS}Z*J4b4?diN%wXIDkv{mTC zztv1fKTV8Gcphthp-eU1X`G?0d4^2r+gZ~cb&BKAa?O`b$b@Ot4t6#3sJ<O}9k%AD z!!os%OsJY~DO~6FHN?)Dho9YxnT~Zc{$kcI$r>h$@ib0`^u~z#oBpMFP0xgFcUCRe zbV1ct#IRMT__{Ame+vHUS6n}>lm0gp%22Iq>dQuFoA%qboBlU3$PW9|(PqK7P`9&c zS?6?Tn=-Ti)knhqsGX6m3*!y@C~ms=`mW`EF{akDbqaIU(Ow}xW8=G>(`u(BMjU%q zW{6X3+SX@?733!=mtRHO*D|rsCQSRhFD5TZ-WI0sA^~apx~1z?Kz%Z%osNFWziB7E ziQmS1sw0lp?;JC%7tWo%Pq+6~WrclWv`|O=3uM%0t_{*f<A&oSpE9v+ac{al9OuSu zXA0$3!+r(D{%L(1L-(*51AWnFy1E~WXTD3?kO|j?wCOWyVo8UZapLEui*;h!2LAfo zObmi58A;QYeJ`I0V;9QOrd(WA3GGa1Yx>{i74i!{=}vLeQtE>Co%%_|jKiio=8ihW zIm#H{fY(*-|LuE#V%y=I8Q;!zbWFD1#&I<7*D>b^eKF4u-E`<DMmIO@sr{b_pGj`& zW5$<}s!sXZmX1Ae(_zel+W1;#)}-^?m_1Qz`=$9Bud{~xyO^(Olb5!Bg;)jEHrTgW z69XR;k2;+d+w4WnE98fJ)1*yaA%5EUb{=QZr%>Pc>;A4aee>v_+2e&ip&j=Sv{~$1 z#<uUK!#v8uSgN{a`kqq^VwHYse#bSW`I!(~Rygx*Khu=qW7-V0(0(CL%R5t?<4y8A zd^WUp*v0m@)P59Vs)C-gCNIp_c_>`B9c@z2P2*QUu!VD1wUCE~ZJN0xUdOXK^~>nG z7yDxSkv99$+L?|r6GzirXNCS@>%8tkTA#s}>pVj-T^L)T9n%)=npmAx<EH6Pt*W^X z@QP^(^D`K=o$99T{?OQFEhQYwrt3^K(_T7^Lz;HVcn@pGuH|W4R#-#rM*%I<`h~Pn z^2{998a1C!8J`SkaMQ9~h>k<CX$fOxm?tRAgNc<cmKEnm+v@C7m`{_Jp-d6mrp74v zy2jq{V<BDWd(k%&*7+4J)G26KH)-nDQV$Ac1vO(9(;xecL*sV#OLt0#`^zQIkTIH6 z+tfkTHnCBYmkHBCI$SqZd`25TwbjS^CCyx9*r)1i{W`99d^F}pZKcCDQL`2jrZb_R zrq$k*T6?V&=D|%DpE>VPSerth@X<L;hV5z}?fI4_wscVF7i|^xM<sEsPi7<a$WNMn z)skN*({|F<Py4I3wzVmRHcfjH#zhNhRZ~A>%Jl5Cq&M~<-<~O*>V~oP`qHw(I11ym z<F@lrY@^U_p<mQ1`2Ru~OEFJvQ@5bfQRb3o<|Sjtvg!Jna@&ujwj1_A``a1QmZ@87 zebnz4{iQzjlAGr1`}cx>Q8S(L)V67TE!5Y+LfY2*m2{!6#dx*9tfM}gqW;Xs#;=0~ zzcgh^Cai}Vf6Xhv_@uVeo==-=%&uYR6ZYR+ci8s&)3S_>qvc`03g>UA&PMa(Y909> z&=I%zxsTZ!#0bZ2`e5eF=Go74_1XyA3D?S8E2ix<?Pp9M^!-W~FwcUE{i4jotHme1 zNnbPewb=M(!ZOu#2==CR&D>BP&Y^7^KUec=H?C{?l?i=yP12N;E~;!|YnhVXBtGfR z<0-@?&oOOg%zL$spEG7U>J-LMP^}-<>lmMO_!rwM<aLVmi?V``YG*&S3uqaz*1A68 zrhkP@C;x&iVL$OV{Uu#&Kf~D7uaK9q&)4uv{=!#%(#7}={Zh1lP9fj)jl9CV6#H)d zHp<`BXVdhrjxmhWslVc;ZJ)IMzoGNJ;8w<8>{vExlQ<@gntrQxg0jNBrO7w*mcd6t zu+8;V$SbIpr)6^!Q|$s7{PmuxkVZ}a$#>I$7Sg6)`aPW5uuM!G?T>wp!MAf9H*M19 zv*5zDrsaj}t&nGwd^a7|FQ{x1@4roFep%0qp>y2M_OJMFG!89KhsegUH|={kNAY6) z4E_-2+xZFej8DN%Zyc98dlX|!*tYtpKWXA6-E>FX!u1%o(;c7Uxoqm-`-^^vjn%2I z`W#B1X+_8@KHDOu*}JAcnT|db>S>#XVj1_sYNt)UeddB~@-jAG%ZdoLlIcL(`Zd(2 zkZ<aw!#b)Gf{&ZFcKCd#vRD@8hv`HyUpm$QPqx-qG8_5Z^IG$T{-K@ObX>0bDSVw# z{R({u*UqLh#Hj5kGd|=Md<!wnnuy6S?zzJJ6tq}J{nC&LRc#4L^SORHe7#kz4SmA$ zLSKk!?=dozTas?NXcy<j_-nb?IEA!oCz8d!;A?!;Kg5hJ!#@Ad6x(#uwym&!;XR7| z-eAVY4P)B2!o08#NjHs8#?g4!nmh^nlnMLPS=AQ`W3g@W8FrXgh*>B%V@vZaDx+<L z_0*OyU9dGRoz8eor_FO-dp+9n;v5mnH8IJjjig!gTC;xk-YHFf#>BAmL^_-wtA%pn zgnblOeISgb&x}nv>{k-CuNU~Zia=&#Of1b$hh#z(Rpv?4*y^`YyP9vy!q>SC`GT)$ zhdR_RJoEL7c^UHzJywjTG16hIPPS=F(-LCs;_F|rzLuwrkD1e=zve6HO;qy=WUx0y z%QP?4Vmq3b4(D2J>G0{)j(J9<^$YzkXs34c%-*OCH*I618<(kH+WML}g|y~%CPP|m z9)5+__@rr5{j>};Mi{5#d2ObchmU=ZZ+z0!q0AswO}_Ql_X0hOWm*n}_)=@ro0RKy zo_5n=nQ8{muunFI=1EAVc+C{<vm@pjp*-C4n$LGX^gAi`nl@UD!LvnUhx<6pH+8W) zwOjn|Yo{?5ugAi;+;mt6-DGSXebzHU{W6`#A;s|&{R-u#J@v2c<ge*WF@~P;Nte9h zyr><fO_`Xpx0tt)pM<e9o!)nmSM;%VVSa6lj4dzpN!8eCtH#EsliD*$>nYL+O{X`m zr#^+4|0^}I@HcTgtC+mBn>O#mOnD)esgtISjPWV1Z84UF@l>tdaZcJg;-<}<C&Mu& z3+q+r`$qjChVd&r&(vo-darINJoBs~{qG?L<%Y1$;v8+#ruNl*KD5zzCF}$0rXd3o z+M4c6rc=3u^~ejyVCtFiYMs#6w52|pmXNTl&`zO0XwuY6clc_(PS|p-FCpsNIj#BW zFfY?#oAx`Ui#}p~%@{h$&3n#5yTsS~W^vP&&^KA=zbVsl>7WpgEFV1RW$nsRQu-FI z7n%?u?N_YE?P(n2^0b^RqvbR?UCxj(a;BUmXUkYQN6wY=WSpEY7s!P&UM`Z~%f&K5 zE|E*+GMOls%N25!JR*<E6Y>->UX)klpR!!qlI6+DWVht@$$gT)N$#7Rot%?=BKc%; zZgPHdLGsleJ$vlaV|tI<dfeXQjvh05+}Y#q9<zHq+T*bvkN0@F$16P+^=RnP*fY{| zi=JEd+_vWqJ@@bVM$f-ic~ySZwpH6z^{LviYNx8cRrgfAU-eDZw^iR&eP5NW%2hR2 zwO6gJ`myTgUa$79={>jibG={e{eJJIy?^YzJ|!t9<)!>om(&)i%GCC$WU6PXD%Cr+ zQ>tHTm(;GQfvJ5``=`>W15+oaPD+hRot!!)b!uvK>WtKxsk2hQPhF9^GIbTdce*BZ zZR)zz<kTNiccf;d?n=!}-IKa6Rg-!s^>FHu)a=xwsmD@}r{<)dNIjW)Dm5?lT<X=- zYpF%4H&cI0eVJOF`X=>lDw}FcwWrpleyZjxV%2_iq&ij|uTE5#RF_t7UcE*2meu9e z71fp1TUBpg-J`ls^={SsR}Zc}q<U!eu<B!~M^qnMeSGzp>N~6Ns=mAWp&bY8xM$x; z-=J@_?`D0s>)WkwRo`BHhxfg+E~wkGZkxL8>xR@FRX3vU(z@&Grq<nD_g>xmbziPb zuRMC?$dzZU3RXo|?YL^!RlBVkyz2c`|5&wR)t9SQuKL%ird6%0*46v<(fZQ*^7^jz z-Ris7_p0w(zgzu)`u*!qtzX{IrD30j-!;r^xVPcKhJQ7zY51<;`^H@xk8B*?II{7C z#tR#tYJ9WtoyIR4>l?pm{8!`mjZKa1jX!>s_-gB{oAt7hY>@4eEzeeDE3;c=x5;js z-7ecLyM1<t?0(sFc5wFK>>=4<*^{!PvL|Ox$)1%xJ3BUePWFQARoP7T`s@waDcKvd zQ?oZ^Z^_=4y)%1P_U`P=>;u_{vJYpU&OVoYFZ)6Ei)>xCKHHFO%zl;qKHHMbXIryv z*`IUKTr5|TE6sJuZIRnDSCOmCb<1s^+acF8SCy;I^~vp++bOq8ZqM9ra{J{D$sL*- zmK%{fHg`hql-!xQiMi`?Q*yWDrswX+-I=>9cX#fd-2J(ybMtb~=AO^Jl6yP%UT%5r zlia7d&vIYnzRIo1wdUG#Yjf*zKQ}o|(Wa879h!D-+N)`wrr$Lk)-<eXc+<&E<C-pO zn%Hzj)0IuvHQm%St?A~bTbgcby1nU+raPPNZJO2eK-27|IZZD%z0~yQrk9&uX<FFy zYSU{?wM}m{{k7@6rVpEzHLYm+zUk-YZJT#!-lciB=G~k3YaZ5oQuE2pXE$Hgd{y%` z&DS>H&^)zydh@L2n&wBFpKtz4^Bc`?Hox8ce)9*-Uo_V>H#UFQ+|=CCyuSIT7N;d> zDQoH3(yOI+%g~miT8?WO*)pl+4=pt<549|7sc-ozAJ6yA_sjRs@0Q;)zgIq;KOlcw z{{H;K`N#9m=I7^M&A*v{C;whPn{UmpZSB&!MeBa82ei&=eW3Nh)~8z+x4zT*S)13k zYul){%i1n)o7^^~ZCcx{ZFjXj-S%AD%WZGA{iE%pwlCUNwa42N?IrD{?R&KE*M5Kd zqwTM>FKmCi{e$+p_J;Px_OIJFY}mj#*5iNkyt?xLKd=5DJg=lKR##ECU0wIO!|INy z8(H_qx*O}J)!oW@wX|;K$^%!9Sb5^gv7A@2Red?H2CO<{)d%5uRnK|VvTEI`pX&q8 ztIg}Ts^7MLhx(rNJJ#=9zeoMv^#|0SR{v>3S;KD|4(Gg@)$ou#uNr=6+>P_<D9)=B z8!u{nrg3rOyNxRw8#%AOYs@v~8-Hy4>8s7M!g=L$UPZHI;d!-nr}L@@=hXq`ygD>H zJUp*Phv(I~+3}oL*L6CtZq826-VvTxv$8duSC3@pWoxrbvmbL_tqRYpud~_kylT%0 z=T)5ZYO`EfcwTii=T(yPs#kbk_09Fq?VZ~<m*%`0k{ix>bzJVG-00jTxodNOH0RZA z#q(-b?kRI#J(pXMtIfSzJg-*d>T=(j^QxWm>c=K&@|zM(TQ~J++M{V;Q=0SY2+pgc zIIk|^yt;g&^J;ph^XmSlnx@B_=KtcndY$v?t)``%SD!VlY|1uEbGPPXbAQgOJ(|<a z!#S@;H(wf_SJyY+$a!^NcwW8M{JJ@>-sQadJUp+moLB3be`?;qdDSI6uXb-4)^ZHz z)rp)}S8-lF-12eDS1s%Em7G^Qb6)Mvd9^p^)q(jt@(<=`=by+wpMNp`m;77#ck@g0 zP5JixkF8~`<*n(~gUoqV(>jmy>fP4Q+ahhdx1GXyHL30TwyABmwB6ozFXz?#wpZKU zYFpO!&$d-<4dHpU8RykO?GLs;&Uy7}`#bF)wy)y6`l|gK4y?KjUvOsqkN<2~^gpih z|5y0GJ_E^vk_RRaNT!qfC->v-_BY9X$(@orCi{patCOi@?_{rJRkA0k9?4{~J9oj| zlG`P>OqL}#Pj*ShlF_7}bogQ0`tIwxw|8&r-rBvTd$#)z-M{a?ru)CTf7|_=?yI|h z-TkZXjoll%*Ym)A6|C%D$KPMV7u`Sa{%QB+-T&GB<L)1IU)KG@?jLl2zx%u0mvsMo zC7zWlp{^3oN_Jf3=Q<gcpTVb<%lZ3blU`Q&q0tX2my-8ByjS^d<&w(3o7}~u->Upu z<(rje_f@`8`IpMq$a}SNVdXQGPgg!!`9!7p)jfHSR?gNsSPxa!@b`o8K;``=ODgXs zbyww`{5=EifZHo?tDIhWOXbbj(<*P`@2QnHR!*tBymEZyg(l9~m1mKAX62a5(<_gy z9D#jI<&l+#R}QJ%AA3L8w{lSBK9&8kc7<IkcdqPPxnt!HmE9`0uH34!jJ(aDq~fQF zwIUVm8dcxvRD2DM&;ZO$#fpm0Dn6;;-!Q0H0`Gtsf5lr^f30|fzh9|%sp7?o7b@mg zJYVq~>1QkERXkJibj93?2P$ToxVKeIuehn=nu@C`uBbS_;*5&ZD@IqGTybK>2^GUC zj;Q!u#eo&+iv25oL*0QD11ff|=vJ{Ec9)9HDoQI#DtI4O5r<eslrJmf%D>`odRR^m z%USvIRpl$o>&m|@|Dyc!@)hNum490PN%`{ff0ln-{!#g|@(;`ZQT{<WD_H)1`FrI{ z%HJvfd->btZ<YV8{LS*emcLQ{dU<X6Yvr$$FDQSh{Dt!Q<<FNtSN=@-)7o$9JXQWs z`Tgay%J0LzxBQ;+ndPij`CaAa-$USiVeS9?Kat3Zkx`K=BD+T(j$9Dg#a|o@3VQnO z!KIOY{FjU*{kf50k%5sxk&%&Ig8hQyBK;$mMjrOx^OyQd{P!Xc@ZW2Z*+y&p75;R8 zMdTL#YmKb;pNp)Ed>ZtRtck4iKlMMQr2+mI{#1Wz<Zu23e#XDTAMa1}&yAcLIV{r6 zAIpD3{kq6>e|ls;Jdfjj?ofZSf35#_|BA?p$a|61{+!5r{y5tEd*lt;cpx%^|7s#r z{OkQU{DuC)$RR{JjN0i)+Ha4D*W}OkXZW`h@#x6l$PgH$WARUnO!6O#O!vNs9O!rP z`)Hr|FXK<~uOim<{s4dX$S~5U_}R$mkpm;cy`PD_yT6Xu!-=yCu~&Ovc@6$n{$j5o z(hJX1h|uJJ?@jiu<-ZIyC9=D>L!^&C+CRk`?~nAldE0t{=X;~Pgm)MHok)%AnS<Z^ z=lUZ}KZklRdue}+UGHE1?SI-i&mY@4^}lPof8$xiBCYK%fEWLB9G7d;eL#IY&Ihj# zEbtccH`fJ!Pl3QZ>Js-c_c6_LcYv;H=^uBUyN<t4v?;9F?&;QcpDg5A_2#;lx>u;} zrQA1Mu6L~Cs9~;RZ-jfIMsa&;zRQ{8yasbLW&hZ^&b@`Ss#oTfs=5d2-}aA=zwpOB zm$HGy6g_ju+4PU`8fSCe@zhx5a7MeVhI<w@QX$3hXz$#kVK@wPi0U4uwcXn{j_i!u zBt64nj{mzq?xYSsXH_R#XKawB9W#TX5w+c^kb(c^&#eE(sguuCo<CjRDb38-KTf(} z@I=d(2v4<2q?>FnJ4km)^8T==RPnT{x1^+6`pAy5lk}B-va{?WyGnoAO?H<(WPt1` zd&%B1Q1+4E$bsHH{&s#(|8mZVt2qrCBVR?n=EV6fl8rP)nj`Iz^+6CsgILft*gn`H z=pH149zoBbD(D@gg6d$Wpl{GG=pXDB>>lh9?9B;xU@#>3T`)X2Di{@<5nL2p99$M$ z9o!g94W<RR1-A!x1a}Ab1P=x^!9&69;L+f*;PK$8U~ceqFfVvMcqjNE_%Qf5_$2ru z_%f&qRtBqr`k*0b4AunS1ua27_%Z56qtUIS+eW)bQ_()r0nxpq`$qSR?jKD@4~QNZ zJt#UjdT{iR=%LXe(G#L4MNf&I8a*v~R`l%X*yuUYi=r1tCq%D}PLBRDdVTbU=#9}k zqjyJVMrTDIh&~dX9i0<>GCD81Ai5~}R`k>8>gYGoAEMc4Q?xnS63s_{j&6ua%!#?N zNGuwQ#p1C<tTeV=tVgV8tY2)G*uJp?Vnbp_#Ey&|6+0$&Z0xMq?_)Q_ro~=}d+~TY z5ig0C#y5+1iEkdSh<A+-icgK-6n`?_9{(v(ndqHJC8`tqB=$=jkr<U2n>aUdUSfRW zqQs=cjfvY6GZJ$W3lnc8K1+O__^QM&*|y}MlCw+BFS)4X4<(aJZY-Hr@~4ugOXH<G zm+n=1o|vn2_t|#0_<N&0;AC)MbjW__X(3w9m1XFOo)J=o>Upa4f-^&Uqg<^9u2`O( zTB=dquSy>{CuB!d&jMv9I4`6xs%L@H56%zS8NDE67gX<*6z+d`Dr@PFUKFw$`umXG z(ThX&KqrI@Krac|6TLKKFZ8kyovVo<dXilpvJa}Ksq!1R60QR7(0ICH2)F~~xv(Kv zi9TV8>O4GU32M-%Em57L7cJ3k(N`?NL+C#(k?+vumW0l2n<c(E_uA!_fIcTHEv4LB zCA(Py+DvY53Fe}VK?&FwNyeZA^f$S$CBoU3)G`QuMCVw7I+U>}K|T7UCCYpzH7*2S zpz|$>h3EoH$&Ki%mVk4$2YXA2vR``87bUs~oo)$O(;l~30@kqyXRQ*jzCE~`Rsz<v z2Ypqdt5NQ@mFPF<-IiD>$~cs03(7c^XcPLFCEAQWZi(j6mo33ml(kSI?Wpz-0_|6W zCHe!}Xo+S;dPXd|Mm@K%Bu1fIT6B$ivc^h+b?>=@CEgWf4=JVW!=7(g63k1_zgiL( ziBx%(fWBAxmVmxj5l@NEM7Og<PeJ=wg6Gj4EdkeQ71y2;(9bHaJtaN}y~h$n(f2Ju zZ<IMz0@keRTT4LStJs%HP=$VP3D|2@%!LyD8O>Ru?4v5?T8W;DGN($AMAupZ&Yvpw zoD$I(S|0+|r5F20iQOR5yT%e+hO+OJ=sff}OY{+xYf1^aql`rfxaN8<wFJz0Z`x5z zob}kCwjO0lz@AAtmVo(BG5<=*WR&?=N|^Ul7Yk>uq*!+)_!zCUl$?(;FG_F*nzST7 zN10QlMB`UkN)AGqcO{`QSSuxQF51tM*bm*sk~jk0)smQm4zwf~M2bD61k6v0{iQ@z z)0XJI=z*4~#yrsy)0ih&V#lDPEU{zJlP$3!=qZ-ik?5(G*iq<cOY})p#|+U=(K9WP zM)WL8l<Ok(drOqPm%74Y>?^Us*jHhLUN5PPC0>GFV~OiJTx*GMhF)ihCs188h{w@C zTH>4!sXHveJ1A#~lK2X}%M#T&m}x0t|D?D^ln7@?>OM<c$5>+tbPgY~1k=!mEm580 zM=a5U(Ak#gVDwQ-RM+G&OY~s$aZB_7l<P-{9)dn$i5`k-+n{?p^_0cfy55k`F>zfe zQC+WBEz$1iYnGVCUt}?R`%P>}+>ZXuQsSduT7s+5)t1C(C})F`7>|By(SI8-m9-?^ zLfb4Qe?Z$UC1<1SEQuS@pDghT;nvj>T#ULFW7CgnFm?nR^jfQqSz=rt)p1Ke%<6<C z!Q54|SCr^!C~L1o&q6o1L>Hi3yGr~fbW2NoDq3!dtU<MZU~H~W{r4XAHM)8$i?O%I zhD2|)hb3_y+Q(A5GrF5aKbNlF-%|1?bg(6QH_Cb|#vY0dCjKyNh~9~EeJb4lOZ5ng zvAI^OK^*jWi?PRGgI<HxS|4~1A=T`8MPH|?wQbOQjOvFhG2-kvz!K|;?rDiJzP_x3 z!ZJwTz@k6<>l?L1H=taTioQno-OdtY{`+>b7`qA^qU@Qzy)3$)`wq86zC!7*5~IC3 z+N+~I;hL(W@jBK_4ntX=x^1wJMQN*!wUCog=BRE6_9>|PaaPF`l=-V;?qoVT5-!DN z|JVHyuE%~BWk1!i7vy<#8r+Qi0(vXFhy4=zzNJLVm%^9ix1lRVR;F1B=3^yi!OEkt z&qir;CG9yAQO@3#%!l&_bgalK#^uo7D(WaPVy<G0t9Io5D6HxWyJ8=XvX>Nnf4qt{ zTE!l68QZEufIjIHf>j^DKd{%JD=hB!D1B7iA5i+KxLLFw{)L@Gn=Ja|VO0yXlK&&B zX>fl=q29;dfYSGR`s}HeT0Ht*zd4kXA4j)>uGn4BZGnB@ZGr9p-LWfB_E|mqz*Aqw zT+f(2*0p|T*bSRH^?Lwg_SlE@d&B<N?4kMt;8g5>=xMMVo4Kn0lz*<3Hod>1Wv~x+ zJNjGr9nS!1vjM+`nb@?^aIeL`8l43XlAl2z0_Mk`j54Q+e>wV{#b@3dm|w-e0%d+1 zcg1F3G!nP*NUlM~+sK+JKKr!sC>Tk8fAj>4_NVbgxRCsT=tb}p_AvArcoX|ZbTPbx zU4y<0Ut-TjR|0DpVShF@!Z+A2qx4;g`~{`Yjr228i{^m!j=X{9fw_q+LRoJmqV4=7 z@>K%+ZFDo(8vCCjSpgS&73x{^9M1Z{^{Qu1mOY{9wVY*-WV>L0jg|p>Bk}{v+AC4| zpRKe+no;(F5;UN+nPo3TTF`ARF^$JODlz((Wq&A<Hk30!2|hsCV@iavWqZJW*lW?W zCAt7T00!f)?Hp_gK0yz$=<81QP+%PbZId<3o`hY6j<N(hp(k5{zUV2IU{`cBoP|GY zoju#4=WuqcMbF{vITn45$es%q;Lje&j)$wT_eC?7U?_SWTu=TH=na;DeVLtN30UW> zt_K9{wd_=jS(lrzAvhYn8E(No2AvMKVRM#d?|?h8k4Nva=sk1xZc7lLGc5soHp}&r zeE@&vC0herGl9;*!<InnJpxaYuk$evp2Hr8*1~((?ECCeVBG@7oYi^%0$ayjXEA$B z_gp>sIwsv85dR6)JqN*o=vS6tIQlhwPyRGC3+$s{2Aa1->36o(5@?JzOVmYm-~5dK zJt8@QD0U4Rv&7gBxj3+%!5p;IqOWB+u9sXF@}EM>U<>R&p<7yFyPy@8U<g`i34Vum z1@?2mb)RD|E0Oi+4whg(nuMPCynt3&bggr}pql&zXdjDoM|ZRY3(=h{dY_Q%3-l#; z73~juV!w{=4Zp#D3*8s?!+r-%!y(x3qK8_74^bV%F!Gn7!(jyWXXvpO@zLYp1oG=p z_Db#)Y}PL~8qUOCja~v1vA;*Jh3l}J&_BWy>=yJEOHAi}x+NAvZv*yjz`Et`wCMAV z++CJ{Gd;&%R05q(T~`QxLTADK*sOO>*X(J|B|+y|qT2swEm8Gl|K^^@CxYr+zk*GL zTrIqfU4rTyy@y?iF1JLtMnAC_`%`R)c13l*!0ewD*k6#p4XX3So{n}yzXh)KsIEEt zR*9z2HjA-!{A<atM%P&+iRxT1z9@TvDU~MHKe{u@*qZ2jl=G@70rWk(2TEU?cEH{f z?E(1ed&wp(+Y9?JbRg`5Jq%65@32|_CM|>L3Fr|(dGth7%RrwGG_hZsPR1UEauz7j zbI^<6GVF8FiI%A5T@F`}ulALe*b69oL<uy`O_u1z=roJ5Z^nk`1oRe*v8Q9-M*bz} z?G~Q7OVb^eDE(-<)53FjX}Z@E)qc&g1pQF<PSXR#(LUC|Y;5i0<1hz1gU*K+vDw#6 zFIl3K(LY<F?D3|TEyjKY8=}{v3oXWe6&s>Aps!hsU5gF+I@|O*ynzqbOw(U2(HqgX zK=<TSbSZp@t>a#1iS3Ji1}n(F3tb7{W6wmhp!?@Bk!FEyv6=toZlL>wc+E-J1)I3d z{b4ukRp{=Pfa|n*57>|V1~d)Bu!-F~98SXCfSzoLu@{?1!`Zynm!g*fYZ9wKud>9p zLa(s|jHQ|RRf0QE=B}A}ifxTD{$|D<+XkI((KEdHK42|lI*uAkjPW!-YKd`vHa~BP z>G)oQzu?a`(abzIGtaRq^i4~wH~O|E#<kh}F1(LVHTr=iwiEg}d_jI+w9XRS8Ev%a zYee&RmKfJ&v(8Zy{{7JwOHAi-9jqsR0Q!?9-i|VlEe`p6qk$#%8?+0Qk^ft?rzN%@ z+RGB#A7u=R?$s97u4O3xX_U2UISQL~YB>gu!#))qX^EYIo(Pl3AA|nEqOYMXR{`^@ z&-Yp$vc!ImJ`Bsqe-ix|>am%dmai<P4~#J%C;wk)B`{~PA5pG7h0n$$&)nsioA{RK zZWcZ<lRW*;?@2!UB)^x1PtzpNyyO{Ed|UJYi(cdT1K~FEnU6esD1Sfp1oT0mukowV z+3+~_b?6iDEH>lHvrqE#v8SUi!mHS~qkn-nvF}CSf_Jc)gFJg9{~q>Z=u*gHb6(_| zpcR{alxHpTYq9amGv-#-FOF|(8Ek>wfR+Pm7-!B}8B;6cNiYws2f-}t3iJU>;sTVh zD8g7<Yv5^oE=1?SVr<r`l|CwoyHWbt`WZIoKr3t0=3z7bHs-61y_ukIZOn7qC~W%L zb_!g^BM0WN?Q%;A{cB@iv`r>|fAo6bd@31&a$UAf!#*6n1#ZP2hB9|;cVQ1lnY%Xn zS#m7;oTcPkl=*IZnf&um=DUq~F8MvmJh%M=`$}{fe1y#!wfz&mz`hY(Whr63+nC38 z_E-sRwkIt5ex$v`;<1O@OD!gUGweO^Uw|?;rQ}PLId5mrl+>Zjar>h@^ZzZ%e6_!V z&78L{v_!5(>2o{lTzWjpe7ApqJqG;{h@sD%+v#UJ{VQcI+Z!$VTG`Hew|`AO^V<Fm zY{0%soZQt0iC2l!95F~qKQwBPlAY0*K}vd}B?c+k3*F2h@l(()28o}F^8YFUiH}Ch z3=*7!Ze!4A_)c@upr5}v%{>eford-@NXd?9${-~PwAvs%dvu!n7^EbQs^5;x;qK^8 z1}WJS?Q4*dN>s<dHDB^Fx{E<dK0tRhNXdO@e}i~mqPrO+rnbi2o%2omu!lin1JMBn zDft-H_Bc0KFQ-}Og|nmNb#!lolstnDG6>J~oaTKElDHE+z#xfQbg)5uo!5g6;w?rG zH%KrN9cGaD6X=l!YmdMlLAwv4#~P&M4fHsJl>7xf-XMvGP+hZA@V^H=)gUF$qGuSy zACI185bqoGY=d}jp<@kF@(Oy6LA)Q(a}5&LzMp3hPv?1@LA<5t`3CVz(F+XXtwAp| z=<UDLtZk3yIm~<L?+xPXUbxu6k9N=r2H|~~!|S{vv2W3d28o}HUTu()Md&pK3HCv+ zHAqzV$aMyZ{uP~Ukdm9x+YJ(*i{4?7U;}!$L0@;AW}Q2(bzZxjX6?rV+*7SaA2dkt z4|KLcuTzKn1Vu^*qmLP^{Wvz)eB>u|jzQvjt?6F*6X&FdK5Y=r0jF8_(=+7j_4J%U z;xY6EgGB1lmkd&>^R&PqrMiFqY>-l22fZFR4@<8=buIPG(YbleATeEM-IukD@jz7f z^y}O&%}3ubNQwIE-2IjQe1yJfkhtdm%^-p9!Nmr>A8?xgZjiXn)4K+V{sw*DATiyi zx>uIcuI?}0L!5Q76VVS164U*-%peJEN3X+=IdgQrKQTx`&zR2)l1QVvX1peqEJW)J z!ujkpuQCYl<sI&+6n!u6G_N*D{1WtE28rvQ`OY9Qjo)I>_uWo&n?V9yueAnA+#pVi zZ;-@YXw)DH#?-=^fh4A(af2jk&=P|r^5|v;NqmWRF-U@SYuVf&3Ff0^3xgy+MYl9a zf^}%AG)RKI*|L>E63lT+SA!(jk1gE|5@&9?$5SNn1IoDs5^!#{9B7a@YuLix1&OoP zEk_uHXG#wDdy4Q($>F|Fk+_ca7=y%@pvM{{z9%}ypzlGPmNN|!%b}MUq~xFIl?F+0 z4RU{|Na<AcDua~Xgk}s9-vzzVAhEmATMWWIxzjSkASK!+>k9hp(P_EYVD0;`?+f#1 zVb2O}_Gk;Q%`x^P_o9jf)6qu^65RovZIIIK(Z>xEY=b^wkSNzni;iI~ab7^5F^KP@ z^9)j=bIY|1Jp4tUH|Tp+r{xucK09(+78)ctAAQxJ_Y6)8*DOeIDf$<K#3N{}!P;EE zEqeV9LEkV4&yk##MFxGw;<UVJkU;aeuE5%FW53Pb(DA-wkmzTquImzfbe-QdNc2MV zJ%a?7pt|SYXFpV<I*(k}aouBFzj{9(Xg@zPNc>rpYZ)Z=GphT5`!JKg9D8|ae}er< zXzRZJ6kF$Pg+UTpkLw-u{if6Mg+YQ7&@T;AqH|Mckf?*MG)Rf|d6hweQ&G-SeXo%? z1l2j>{wk_-qkD+6BC2!tl|f?TQC^2YN_0)K27M0WwCMiMF|Iynt3e`~*JjY?v`))f zgOnbGt}{q%AM{6ql<M5BH%RF<sLs*PTo(t3lNW;oYC8srZH~GIiEV-U28psy^HGCD z??Gb*iEKdQ21#6oCJYj2Y|bUn=Qd8h)F9EG=w=3qFgJN^V++=l^B~Vz1QMa|`Er9k z`*rda2H|<H!+SJEpG`S=&L|L`8$0=}4H7V)dCn`4fVs&tk07Pmm)-^mev4}T6#4AK zJo^kJI2UEEK@xvLcQQzV>x1`#ioPduct5C!aK_{Z81&hi!+Sx++J|BvN*ryIYX&57 z7;2Fi*Hiv*gCqu_Lk*HpU)B{QF%H#v;hap&L$$BRFh4Emc?PrJ^5<ip&sc6nFEE&E zA<x=_B&MPl8HDeRIC=IfNR)k&=lTaJ-4)gK<Gv`t9?wrSNP>NxzuX|D?Ct!O26J8H zb^Ln9>N;F&5T2zw`6&i-jpw!PskHTH^d^JwnYfdmW{~Jk=$!^BnUCIOkmwk6w!xgY z`A4z27vi~!lb>S{zH8+09$As7&hwK7bEf5W{r*JX4ndzaNa>lVwlSYIIt6{vVB@@m z{StBXI#^&ZXJB6Y{b&3e(N_!-Ekkur{Du4>=<5b^Hs%*$FJcb6q3;;XImvr*2W*^W z*qmcLUvlyv86<iK`msTun>l&TF3``Foct#S{p{Y!>-up<C0<2W8YH28({<v#oW9QH zzcJ`%7Eb<KgYcP!lW#Uig7YBHSpoXY(`n^e1&N=IGJcRa>&!pft4RD@)H6u@4AeJB zoHc5V7$nZzwsIYU#Lq_K28q$f)`UUgGtkWp5<d%N9`#v6!1}au{er~VgRNY@Ao0u5 zZ444;Ken>=AaVA7EAtByXYaReZ;&|GOKZ{~@quVhgT!w`x!ytIqtLzvi9d|?Gf4b2 zbZ3J;V{uw{F-ZJ=bPt2XPeS)H=<^w;^+1Dup5n9)Hb{Ijnlb2iTb<Tx3=-GzU2o85 z+D_|KgG6pYZ#GDDcU0S+PCwZLt=jL~m>=#tTJJJQROj_>gTxo2GYt}rq3U-p{#T>3 z43hX4`jA2RUV+o9V}6)**ZFzOAPHR`t|O4x>FARNiR=12We`4dbXw;cB&L1&lR@H| zKhGfYJM=k&M0Z2E)<8<WMqe;U$!hdPgT!?%*~cIyIv-q9AkkaV*9{WY`B-9*=n?3< z1}SMkxu!tkI`{7zq*Ui~sX-DW&<_j}<=Soihd~0)=GK)43I2-K8zhoPb-w;ZOpUX~ zAaPxvtU*d9pzQ|XJN8cNj|NF>E>0WgCYbZTjrd^gRoGmc`Wn$jTVQR*pwEU(KG$#? z_Xd2A#cBJ>U~T5Ejpr~XpSf#W9opYue-ql@VsrmseCU50{a1VKW(IS9uI+-|#onW? z-3pu6&3Fpk)}Y^Oa@KMkfyCZJs|*q!i|%NU_&Mm#2JzV^YY#9;{BZO@gOr?z9%PUb zu9vl}4G5oYIcpCyNbC@Fs6k>Q(P0MRyJXJV;RY$0jUH_fkMXVLwGX6(b8;=~3gTCz z#~P%By|?x_gLrSC#~Y;NZB*MBiGMkIf<Zjidad^LL}EUHYF|&nX8*3`i~#XDd)D$g z0peGpXBfoOm}3m$9f9gxpT+ZschIv9`rOi4t8+J&x_!`d3{t{AU3;!UO8$<XXAn>G z#~H-uOkI1SLA=*d&P0%y_L(yggx?-HYp*g$$-yXR4v4oJootW<dv@*h21z`EPBZB9 zPiO6PgZR6moHHOk*W=pz43c;WeZU}o9DT?jiEGiv43g0PKW&i2gDBTKNc<U8>+^aV z*LG_SQljy6JiMpy*r#iCo!+2b-BXJU;<ce~8pPim{hL9&X7nwC__}u%8^n7TwMd{o zT!SES?aNAo-T(F2Tz4gxqF)&#p=<SxK?3cg?lZlPbPm=SBz7hGok4<6(eDlV4BT1! zgFyoAug-Orb_bwM1_=&AwNK4l<9DHJ4H6ghM}s83M%Noe=Ab_tB;H$`b*wc=jD4~0 z3WEf9qSqKC@fylHg2<^T>j;v#1--){i43ZB?&Mx*fAk)Ml+c%Tj1wf@4`uy8<Yx3y zgCt@oYYmcMZq~hM(9c1fb*v*u{1cQj7R28c{m>v@3%bl8{@&<E2Ju=^)(FJsnpnpg zf%xa5s|@0uj<Q}LK5MkD!5}`@+`2}C_-E2r{loPoy!RH~Q#wQV{@8FJ?G1!Uz<rj_ zeY?*b`S|#ppOI4N1NcYC3rGhOpq+Cn4GWp`p+J4^DfH_zlE9zW6Mgm~iN&y<y)=<I z9SyTZHlw}GX7W!Z`#{_-lSMYK0P1W$1K1m70|5WBxj=dg`m{xh$d=SAr(Q)F42D^- zgx}+KgHb@6l}kmo!e^^qFcKyJ{n%=a$kz0E>&g6Y@Vbg@GXfe!wjD0A9ev(zjz~B1 zwjT(@-C-!K=j)zxfx1bwM-9Idpq(n>_9_MZdM)QW?frnV6me7ZHC4xVIj8ZnoY8!D zle`_NyAyT#GTwfJM0TDbvJ1Kkec5#!%;$ga+h1firI!DP`6NL17$Y)Zg~*=tYfobC zHCANrfg%ITME04*&tsB6{-6OO`_hN~sJ~wgKb0v3>ZQp)AO_e6GS-7;iwvgCgNbv< zD3~a6=x~uCqq!yN##cItao9YO!)rx`&JsC-x<^ca#UjHfABKHoQsn3%BFD6dj3Ca4 zC4BvJhRE@Z^Z2<UBe73dE^^{Bz6v^BWEAb5OdBW9=hDM>^fZ17<pXV>F8ut7vNP86 zv!|u}<f)EZ!IAvDiCAZ^X3J9N9Q0hu&!_$KiF-i{KTo30g|mSC@#DjvCQU-||9vS8 zhB^E+sSn_H@fv=bGzciaq#KZTX&DRw;$PMartov57)<7;NW{2&96v!K|BAW%1c~&O z3q&RnchWN6&Q9VdN&R6g)QDW&2WG+=k!yyCTsu<aIv<7tZC$rWWHRket`+&?2w2Q5 z5pi#rE;0rGDXT?pB=%HdO(n)O?3)Eh-@1^m%g%tMBDdjpJ7c(`0%nWMU_S0#B68Ot zAl}_$f%-GY!D5kn$iIg+?o9&z_l@BQD1{{=_mhABdXWbvi9FZ~7KzlPVXnwS#D8cw zw1_-Bjh|eN2F5>o06)1JFY*|1AH)Cgi5$g)VJSbsBHoijfp(uF{@f`de<}rHJdNMe zwDn9zWS$SpM4qMIb7esL&lC6gg(CAuny>oG3$^@QYY3n(4Fq&S8qhye@6TD0mnZNu zF3Mg}CHBG^kyrZx`dWVxZja?J4I;H;MP4WU`f`ys#sGEyN}WZ-Su|ec&7{cR(lA5h ztumMfbs~!?d%FTi|J?`r`S%u)cNo_a>MmI%^6nt06?v}@%o2G&38a_Sh<uO+eEvaO z9}X8;7K4Q%AJLzW$p3f<tQYy`9Da5-6zJb4V_=QQr!z%98w{&ORuE?e>CZ<%R^$u% z_2o#u>r9-Lw7+r%-wB=!_|{XuAqM0(%;x)}@D;JYqTgT75?MV2i17{az8ws-^{;`j zKx7SlT!Vf`-0$%JJ_+P~zg*;pX?zc_8_b0De1{32+!DTvLJU5Gl4jzxjE1FrKHeW{ z`HY(UwmvWg$Zzio3q{t>6InN3<j0|~LS+3wz;}I($WOz8Hh%VDn#cy)+(6t7+%pLG zGBQmZXE5+u?QkFDa=+>&VK#6-r}sO&UO55f`s^V(9;mC&4rBPoyTTM$Ax@${EEk8* zj-66o*Gm_RvstY;T^5S7`9P=>r>p{I0Wr3q?Jc<f*m5+`R{0pfw_*qogV!LZa;`YM z_BdNj0(`d~2W!OXIup=sXk*(^fNn>eZb`tW8}|U)Q)heH*<pe>-814O=Zn*$R-B$t zHBp>i^r=^kIK3HbYBbb|Q_UFq&|aUh;_OJwohAeMeQU+(*9(Z*Z<#ndWA98Kb}5A! zun-!=*_C>`E)i!p`nLN3SSrpQW5gLy0n5eNtE)JBm%%J(5oaLv_95mz)cp;9zwHIn z#2JMDAavhSpx%D4KYr<n;v7JX1D1(%;2@YS&Ottmf(7CXCidWwK>G*ddvLorhjxP@ z+@er6q(+?I5&L&D#5s)EhfNXZ@EB0%@CD)wogmH;{lytZ*{~LIj+`vcaLR_S7U!sm zuvna<iE+$8Xb@+_0GKPzv4dfrILFb}abtn@j~_42$m!yokQV2}3Lwsj_@2}ch&77- zpG@CR=>r+473b8U;*7?3^g^f;=d@|!oKEc1*Nbxo=`o{W7PO0V<_u^N=Pb(4qVCzl z0Ub+>u}j1`XPh|aW?-2(=h4P_4dRTW?zpTt=M(4r1>#(Q?*-&t*cIjg?Tnu+&P6d8 zBF^u-K@F@Chu1yl;??3z7y!h*ggTed<|RwTxik&)#JP;VTt>exqs@sGFb0S_k@}Yp zghk?9LH-q!fO@<RI#=RzC3PneV-orYftli5RR-<iTunPykAfO;GWchP!UAX!=Njy5 zro&QkuBETnju(g5M&~-pCR1-RW!L-S+(6k4V*$S@WkCB=h&N@0I5+l(nc_@^n<k4h zZHhQIQ}333P$$l<*we>}a~o~mPMtdjKvtX?v&Fe{nmD{xI(O0L-ASPS%vy2o83Op; zJ42lN%3y*xvql4c_Y?R2h2lIgP@D%xiBm)Un&sj=R42~E6Jd=wkKq5vYH?<F1!6r) zj7OJ>^B8T;@qu=q7%$F~gT;9&1`EWQTLI+#34MABQ2&`0appCM^XyC@?sNFfpD4}? z-Czu?5a-1u;=DxPUcz_5WO4pH0ch)G@?Ig{EBGuV@700)LldK5xj4KAI<M1*HztYm z*Ky)3B7e~$ao!v%&RafEcQJl%XT<qCG2SVI1^hz{17Mjr?_$4)-~06Q1Ij*FD$YMf ziu2(hm<#lMS)Di^jR4ZiX@7Z(IG;=d(w|cA)A{0jHcy-t3&r_-i8x>2|K$pC>gdNx z{8!b8Q$JIjhA}{$M*8^G5LhqH*R|rT9t8B`n*l(aZ~MV)asJf}ri-(N{;kPCyExww z@4Kux-xK5e#p3)h7>JRjZkE`5zuU=87N<#I5}zl>fVwSZFrVkW<mYRE7_F4I(r#;u zIPKKeX9m1}IqPZvr}5(aoEB$8FLC)%mh14A${Q-KKT6!l2xt&Ds1r9fM%?&FaTC+U zEm<w@X5GZyyuY|*W5wNKvAE>}#H~n+TM1ju7q=_%wj)-zdE#zg!#_;2P~7B1aeGV< zx92o*t7ePa8{ZUV)$QW$*hgI6U%0%ta5>}MU5AU?KPfKnC*0jfi@OJX*|VRxdzC?* zxciX)4RwFJM%+Qf-XHsb!Qyg8y9d$!;F;ncTr2J&E#eMIi~GBbxQE4naUAZ$TyckX z6ZZ((Is)HeU12oP-(d~n9@z`V!EAAd<9ihKkDdhW;vO?c+z~6pJ&wK{Hx#D8B5{uw zp#9?~0_l+`?<3q32a9{sSXd+OsFAQx+>@z$3Y_Z07^o9>H2prkpSWkx&oh>ZJBBvS zoB&J2J*yXt6Zh<;;*K35?l}r|IA`5)Nti6|`NM(O7m#-WbuNVQ72;mpF7AXy;$AWy zvf^Gk1@PlNgL~Obae2SsUOq(JE7Ia#IY`_|{lxtP^{$GEdvzJ$e|3YnnQkyk+-qp( zn$_Z7i+$Y;aVIZ^7ICj11LWT@LEI_SpF-Rzb6}0QQzya-ac`oHX=BB`WgO72Tk+?; zfqNVAZ^ym^-x>7j&OuNk?p^raH6QT3n;0`0!#zvI<-LG=ANjN90QK%4%0HDun-7v- z(+9HRK18gC@qL8(nN9siy8?cXX2gArI**h0#1wI#93}2kqs5)OSlp-S%QJJuok#w& z#CvYAxX+h~JD>i{C+`L97l*(sabGG0;&ET^E?6k;pW)@<;=a-!Ccu1g7mgD5)fM8t zHb>mQ_^?LY*GIs5ao-@$8!h54nkVj?3&j1~L~-Auk8cs@t<~Z#CiY^=-lqOL)O}}$ zxJwwzlB~GzV!t;4>cr(tbKfV<(rMy;&<$woAH?~Pek|()_<uB6+>a^yc#*jOTq5pr z+WLh0pEQX3>0EI?BgTqS7y|gNSSs%4BZ0nrF$gIC0^cuZi@P!=?y9lk)|1~rKN{DF z`!!|XEE4xy+FH{`-0!LX!w{GNwc=)}$33^(L?4<f#BE_5`N87y`H9;$5NM};lDKP$ zxweIWx@fq#KQ0&dr&0W5aJ{%2R*NUyAOj1bK|E(X%oER@B%U`K+Qsu1i~f|*i;fd7 zHbuO6jd%%sO6tTbT_oOSLxEUbmWsDIbvDN?n<m~C#NLuP75qEUmH2KoR=lm3iPsgM zZTL5#x0xm0wi)rZ>n~onA+SU|&NXj`K0sM_^1IWgB(ZuBqX%U@$*-C&UavXg^`0zV zYMgl03&i7o*V}QVc${}$-{InM=6O301=`z%I=fQ0|7h`c>jsO(+XJ6HW{5X{`g_us zJ;#W*7iD`_z(Vl`5__LD;&C2&zZJlr`&n-gZST8Yy!~i@{~_X~`vLZW)ID&Xcn8t` zLFnKC;vKwPyhBJIS}Wd=N#b$8>K%q2o)&K?v4+-(cSMbN!^q=Y^oI8l?<mH>J*sy! z<wq0u7-EeW0qx=)Oa0@pkM9rooG@OzlU9f~ioT!R3$RaFAl|86#XGGVj1=#5VxB%7 zXlo34+;@6sCSekgch-FI&YmLP*ixYEyrJTai-9WX^QnIUeY&7Qyz!(jnj_xDqk+Cm z7zo6^1ifU1c$cmhZz8cTr|uPl#Jh5Wc$|CQB-;4{{#OlvHR4@8S-i|x@va#x-nA7# zy~*ew%V42++~;{W(9RUbHzh0Hjg(KN&P{{Fn}*M{7V&PLCf+Ud?bcr6O(*X*V%^TT zIq$qX=84C7=iN!(UFh9o#G9EG?;hH?XN7q8){1xE0`X>%o;6Fn`zd=M28+deaE^F2 z!(p~~4~>GXc#rfEZ#Hc|Izhb028j1~f0!ZOoDt$ZLD>^a#CviiG>G@qMDgYl<4^ER z3}|~^5{AM;@t&prvvb9JZXis8W#T<go%v(MdqDu7m-+$em+0q$MdJN=xp*&A=N0<0 zkbW&hUtKNUYm3FJrB3a7@!lXV=bpES_TD7s-=>TA)-+fl-r~`KzTFj;iud=)eAF^r zyd~6KGKY@<i1$AB`}AY!EWScoBi=u#^CA8CkoK2#g9$*}A7#Y*c&2#&93|c-)cKS+ zpN@xl;(bP+KU*W-iYc&Oyw8d8IeqzJl6YVC60dHdcq{Q+ML!#ch}YN$mWcP&K$t7u z>XFbO-Z!-KEwTPp0kpGbnt0!p0d4<~grTrhylhsyrg40<u|_<;<Kndr60e>7pJ?}| zI`Mv<EFRAZybY_xcY2BME)d_FE51KX{772-V1W3XX@0Da`0-MhFMguG_$6hqRQ%1z z-wgjQ)Z2W#_+_xgaPhZ9%LhV>_?2biZ$-SVmx$kWmiXIH#`}4H+aWMV{O!o^HVBr9 zzkRLvJIofJ^UUwj4d#m9vp*2OsuZS+--|YTO@evi_pX2%@l!s`5WhMG^t&3rK4mab z{2kF9iMJE=b{YlC#qW#Vmv;IIOc8(Q{^IXKtX(F+V)1wF2g6~O`2DHVzeW7rM#3EN zcTWO!cV8s_9)o~B4u}C|0~*BNa|G0izZdQ9H5%p#A5Q>%*?Xz@1N#861}+nSp8-Jq z-}HwW;{P@c<AGSerJuiT7k^MM7z`7DSc7O|-wGH4lf>VT*!ztWfBzUv5kF0g^b+w8 zSS0>|qoD?<b5I``3$@}8#%Hi9`3Ez;Ly|CG{6mR1gueZ5FiZyez`d(~7=E0|{^9r> zzDE3^_z#^Z{t@)!h=DKxmWe-X0Mv+oByAnJQ2gPm#XpMi97W#IF(B5_OT|BiIwMLU zBmS}EA3FqQL5uju4FX~vKN?7n91f&U7zr!HKXDWg_oNBpj}n+7{>gL1KZSUwFz!>R zb1Lypoh|<8Y2u%zWW_&yg!pHq0sk@Rn0Y{7&ZOR%%f&wn|FdhvAKMG?8B3ez5ck}% zK>A#@7sG1t&%@_D`g7hym<jlfqhI6Z1ARPyp!gRM_X6r&SO)0$Za|wC;q&_i;$KYu z#p8i^6Nq!kSf~^K(lJ1c%lg42ST6p=0Wclbh<|w!MgTD{Unu+&n?U-C+2UVG8&}Q{ ze-g1L5$_M9#J>uz?gO-$nJoS_(}0-QQs-LL_2OSQPJCWp{6Ch$a3KGB>Rmrq{2S=w z6xx_F3-G;h5G)pd>PW!vCiEtB8vZxqcQgLCQ12GTaw{=!MW+t|>P)9TuS5QA(_oqS zw|9fF&?5dF<lRvV*faXTZ1L};{H}4ZNc_78!cy^P3Q*^sQkW<Hy=fr-zB%I0ngq0W zKW*GU85WDr>z4n(P$0&G1H`ZKftWSaeP}ey5dUHFA1MRu*-4;$c2@jHiTBtjSS|kJ zjPr5YnS=cV@t!P&1>!$7M*O*5fmqzj`+u4%{?qjP>G7~e{Ab922AwwzmW%)F2=SjA z`~R`_E`V)ZRo?i$Bh8Ft>oKw(BR^z~EZdUbvSnFzY{!$tNu4%r1x?cw`cT^d0a`E+ zAT5OoT1udW8d{d_M|TmWK!9#H&;kJh2q;US*(GcPbRo+MHY@?k5|%CmD9ZnL?r3B= zX}in!|7@L^(VctGeVu#Gx#ymH1pxksk=Mf&=6nSCKZ5dpdJX{mpShPgKRXRTx`X!t zo?_0=p&XxknmIp@?_WUtFFXPOjzjyI^NYQJJ<R!~G63nnj52-s5OY>M0O0uw-hCB$ zek}t){6|ryuOsiTFEZyp0N*#ZG3R06`zGL92>TZBKDNS~M-cCyPB7=UtIYWw7XbM` z9s(R^&SOaT-2wpbzgJ?;?*rfWk^YG*0LPf~UzPw*G3O6({{iCu062dL+&|n0s4(Yo zq&<#!|GFEnAAq|42<`K4i1TlFUmXS@y!teA{upt7e1tiFk_J4$oR|YR{~g~?pl&Bl zGUrcCz=O>B9}G|eAna!$0OI}(WjKj=CyRh8bN+k@aDq7@Kb^loe!oPVCwBpm&#xX~ z&Qo_X=YI_|=WkKIr%dMjZ#@6b1vto@zsI}ZA7ReZz;zmU|F8l;x<B5_oPPq|Kb>aI zr}s1GpLa56jWOq$2bj#}n9O$q_5tu+Vt^u(9g|FU?q;&A0roRl!D*SwcEBS{Rttb5 zOm;oVWcN`fw`^l_>mpzm;24uV!07=lFK|Hq%0A%qT@N_OWIyouk(cHI+y+2A?NPu9 zCI@ygx$R!SNhSw@BUoi}Xg8n?IK|{}6o9<LcLGq3@Np(boPc2f;^+jYnH=2?K)z9w ztsQvU5w8Pzb^u=|(s$ki06xfdxeL!R;EmnJ<Zj^VUIYM7_tQ*{?*trVvM~)f%;W^# zC6IUG7?XRt0J{LlBMCgP-N?NfU>R_P$$j@SxgT-+D}bk%oI=_Z@=BdxavJ#3c$dcW z0MZU1eBenY4<gRseE`HC$^d|C=s^J5V>k`i4cHIB_Yst9<P?)f5k6W3Aiq)MHHvp* z8UT5WA#KJ0tT1`p3D^zT&*TZDnb-?B#^mfy0Pd5xPabD-ZVB)R0Jx`2z)>dWJ%C*R z;F}%>;6Bp}0KS<+fRjvK7Xs`7Jjvu)+~<(T+&%!_&ocnxtiJ*Pd<%HDP-3!)a1-U& zFbM$84ajq20f2NHk1%;t7hr|Si?}b|1~|;*%^tw@fP+llf;w%vm&xaqnY@Ji)?-XQ zAK@1O*EZm}&;%g=i;(X{Pc!*q;4hqD^79b>yhoY*{5ik@CSPIzkmq)kYkQT+mu>?f ze8(aHcz2v;@@4lid1sNymm}^AG{8;(;=T~~E0Et6PcZpP<a6ayOup(izynOa8sCd1 zldp*aP_}EIWb$=oChu|qkmg0Z0f_fve1CBfaFEF_LHykY0QtXkFOwnP<(C7`^}u;U ziOH{E0DOPNX(qq2%w))Ic^Pq*k1+XFX(qoKWqb89lV1ZIui4M!J;-~{3g8rzU%MUf z1e0I44}kmYdjY_+7r1Z4^Nsf~`6fKS;UJT5-oxZK0^b|&WAd9afJc~oOBC<`;Atk8 zfa}d3z%eGj1!*Cx<y%pfTao@Y6M*<{Mf|tk%;eke1RQ7b+i-sy;_XA(_FWGEu6?JO z{Pt}C;C#m}z)2?Gag@n-763<>{7&58Sz+?K5a(UE--SA@ECP_vyFGy2On%Q{Cf^NQ zcLT>g2LMko`Mr4mS0N_9ZwYXS$@dnS{MUH?>j#<q{y6}`?z;l;D3kwY8c=5P-|hsU z+#f)^^36>CU@wy)d*u&h0C@jE34ro{7-jkh-hbptCVzB}$@>k!DJFk>JCi>F9G^JJ z<iB$Q_5hAD`Jprb@gF+D<iE%F14Sl(5_mtA0aTd$@G<~+VM~)gjdY(z*k`T>Andci z@!6-C{JFhM{ygG+VHcARA<m(DnEXZH`Qkw)f5`=SfXQF(WpV{+zk)h`brDcy^4AVC z`BCKg_5Fa;O#a3&0C*2?2LQ)mgne@l;24v?g*cBbG5HA69>KeR)Bq(W|C0xB1(Uyx z@81Tlqlot%<oBH?nf$m5fN~r|ykn=B{M|I5%;fI@=l6~?`TM~2eSH5u-aT;ufHePt zupc1Z4?_Ti{qSifAD?D2<gEN7r2i4p{#ypHkI7Y}{jrnDKiSFTfA0bypA&fhQ-u9= z7nA>^7l8CXy8-~*Czk*ZGWq8S|M?1&e*t{I90s7CPd>rqU*X+<;@y89WAd*j0rxTa zloN0dlYeuV$^Ql1zs39C-Uc|u<frar@_!#^^6&OC`S;6AKD`~VpUHn%1OVqBD@^_q z-amba$$v&!vA!*zd6FsY6jS&;Op%^u3T$wSe26K^F{Y^ZGR0M9ihCJwgefg)z<#E* zE&(23iU(od>zU%qFvX8Ff$dBQ?q&+s5tMK*pu&{MKBnl40OS$H_jZK0KgyJjo0-zN z7l5#?C}0l&&#}Wy=}rU6Oo<zS<4iG30Lqg%$dn%Blf=7T#P0+2mza`5{wcgmBi+D* zOc@*o+{ct54*>ZN-^P@Y6HFP~33!?*nf*)|2kvp;p1`|_(@e=0nKEetfPZR*DbrEF z0jA89nX+ylQ)YpC4*AU8%anQGpGO_mKf;s+#4+*CMEHhXOxZXGIK`ArfJMZ?nzFJ5 z_w#OJ%F=EC^56OdQ_k-N+{u&+0NYTH3qycoOacE_E=E}{KF*ZqO#*=D`3SoNc((5X zApNBUzynO#p#gBetOR(HDLaoc<#OP7!Ocv0p%Z{|U*Q7a`<1v~d6+3zZDY#SsOQyH zrWAJrfd86Brd;O%0QaurOaZS~UUY&fFJ58FOO~0k8)<jrdG|@CfX^#0#r<W-7xOpe z<@Yk>`s<l;!y%@;5_MR{^Q#_Z%4?#415DY2{PrN;Yj0!9>kOv6{tBk-eUK?P0q+}- z*BeomH>H_!3-FXs-_p%YdGjz+-U3{hPbs&e9B;joDYqm3+X?{G@9lX1_M=RB2hzR+ z@9#v~cLLYDb}{8H#9i6Ply@WUyDLn2&jF^~4P18v?>*a@^4@Js`71oX?>?sdwG%MO zl>bv^%KI0Yav$)3zbfFb%HL{$2bl5!4*>5za1Y=#Q_9HmgLrp8@O%hqALs=<$&?Qt zVai7k_anQQ^3f%x?7x#KADaW944=UFPvH9}s!aJi)b;OBCh%9~?}76Ga2;4-%BQw5 z1-w;xq`;I<A7aX9icI+&aDVO?Q$BwM-~dy;5CtIa7mhRK5Z+<FqI?l~esM2Tz*m(o z0e^)7DopvxZUEg8_SF!e2zZn!U(*1?fSmy3|0vQu3fy0x1l-J&e{cfsWy&{D9`Ih} z@bygjCi3{^Q%w05aD3|^QyxRS$MF5gBTV^6r28iZxDD_mQ@)LIeS05Mjw0@N(trn; z^3VAG_-Upb+ryOa&H)hbdy7o@KGHoA1sr0^ziej;<~Pa@_A}*&yO?qu@UPndPc!95 zy8*|U0v@YW5%y!?`0<?pl=~-Tru_R}0N$TK`V&W(@>AsfQ@sBvp8o^&{SV;$+4W30 z=>Z`8=g9NtCz<k#DpP*>6jPq8Fy&WB|DQ<rYs7)QPdT;Bl;0rjZ;<Xc2blt1tNizF zz+tBRZW@65?~(6m;5vPbDSt%VKdmt3X?%bBC{zB7`=5_6rG|Q(=>;5MD(eF5V=C_j zJit_GJ5wF|0VkR2i~?4eDlalsImA>I;5x!oH{Q40#?;m#;1p9m4>HvYTz&(9_Zrd! z3V<h>+J^8TV`@kPl$jb10iI?m<{WAS_b9%%Z)0i)aCZV{XO*d48Nee<jU8ud_X<<v zE&$49l$e@8nG(pq2e^`mmpsMP-g}tZrvXgBVW##2ALa{cx)*RKQ(+@i2M#cG5bp<( z$KVO34jp7F{D4%<0o2ixOwFJi<H%<mWtu>~S)`jxGd0Hmc%OFy4l{Kc&+8_cIy(%g zGIj0{Q|DKhx_%!3I8DSe_cL`P@NImQshdiG(@b4F%GAxbF?9>dzXjjVL!6~Wrf%&5 zRG4}`-e0iH)NQ+%dZEG8i+Y)Q@d>6D3QT<-;F2qtx*hp$N7$veG4(RM--&u&{s2>7 zfV3~%&eSXBn0n<B;0RN%+66ey)T<G84f47U^?6Z|sV_$Oiw`pu{8Qci2vc9Whp8{S znW-;FeXhTUsW$-64S4^G5CHLCISF`*sjzLSufn@m0oSWDOnprkQ}-avo_&C)nff}D zsjtVoy)FRicjF<Z-UN69(%p=(n;&KB8yTR))Hk6Fw;=v4*8}clYH1Ph1XJI9lBsXO z^R2xAq`NH**a-l>+YdAKZAY295AWWt0q$YyJEj3gn0m)4rrwG4@2oQQT?oHx8vtcq z*~L`oxazyhOnndXy&LK729A3UGWER=F!isN07&=O835|={`;7EAMpJR-v2FdeqbK} z@5@M6#{GjgGxdIy`+mgvP!WLm4;*0XhmSG!BRiS;QIz+i_`ZKT0Qf$Ju#W-H$C3ZX zPc!us`<V(`lKLRtKlmh5|Lzb|A42&adJuqke}6py;Rkjz^^?O){nR8=A4Yv2Mp<D$ zQlZ<bpMI37pIKt+XFY&@fGSfD?g9Y!=aBAm!1?(MQ@?=pUwDwIhvooBnfk?>0VkRI zCE)qelT7{cUZz$EjxhBr1*U%W08_sPcyyVmUq|`=VF~aEQ@??7A3n;|Z{qtmPcZdc z!1JxAnEDvr{o^82|EU*noT=YF#nhua0gp2EI~l++rv7sQfb_>S0Lt=Ry!#&Te1AJr zpCEXEssFOf)E{hP>JNeEhiIqcXxHPY)4wA8N64eP3vigJ;H&CSR+tLDs-C!ysXy&v z>VLQZcQW;7A;8m2Jvj#`Gxg_yUm)%;@$N~)ht8`0=OUoW)KkFoo83(PFXZ`Kyn9Lm z+{V=Z2EPA3#?;>--tTT^>hGNZ#5;{VP7gEn57SKj;}cB%6W;&n5L2H<{HOOZ75r4K z;eG8srk(-LGZp4y!+>SL6ZokPJoBfmU$loV>vAjso@6fYRhK*oc#yf2IlvL-Qtx9f z7t(>py4-2NKEMeaC29ijt_A5^cLI=y=T7GG-Uc|zT)yo9<mJDDxwI&4yJoJoIY0?e zWv<|H<_h6`_<C#^?ZuH}C&f`?t`3d4I)Dqd99I``bs=8t5$1vo#}#)1ip*sU1D?i_ zV#u!t`Scvdkz$C`i?qF`nXB(!97mD?><1uT3VEi1Yrq9~l(_~EGS_ecfc!^rADv{b zu@C_GG9JJ_<{C#n6KTL9=E@?!?9G6~I5zBh0C40M0Z2c!2XGq4hAlJK^n=)@z63bQ zT<Z`vdna?vonWqc)Mx!|%(bu&$AX#I61IY)L=5KIqydgG*W!K5wfP>vacm<)yz_wT zJfz<`$6V(V9AvHw3fR8k0+a!Gcj2SVb<tkty4VTW$y|jfU^{a?5BKNoXRha?oX<bO zT$cd%_BkdqcBaBhyuv(8V<8rWjAg-WA{!2blZj+5kPGHh0X>^i^LjwdC-potxM>)* ziebLs1*wN$aCzzS%d-z({sLYxY6z#>O}F1(durY7w^wfG9$ao`_>+)Nm6;r+WM1Tu zOCp18uAL`wHR+F+4C4#~239MhF|0JK%qfkNxf$!^*<dmo#Dy8AQ9=QX5-*=&oDqol zjx$yMMa1uA1B~&kI?L4|UcV;uNi~@t;`v!#zh>2J-jPKx&u!4o_qIxxhQ(Fepj{0( zJLImb!&irSxoDQmBL1vfty(Hk-W(cAg=f%?Mbs|FC$gFG$atKqW4vF*F9PWiJrd^= z<G9g31>rx&lk+^2%*;srss1sZw_eWjiTqT4DkZ|kGvm0^KZW6co@XnPgJ<Hc##koa zDM?PLrG4DNBYHFx@p%*_(AFM`nmp9r5sr1l0^zWx`FK~LU6LFQiW!L_qSvd+!C-qx zH_>Cg+@&nwM~gfj%`Yo1pNGpXm)G0TX~crT7MCMo7)gh!y1lbrRlzTAsjY3Atf>B0 zuDDdM5AnK0yrjV#^v~Z2ms0BIHZ)8=rE*oz^FDNRl8ehrA|raOiVHVtA6#DM*Z{(3 z^pQxdiVHUumY2`ao)8B!(4Q6bXMzpkx0qNk8RKY0(QvcU0@t%+e1WI@JSEy?i0f*q zAMF!X{Af!xnVZTl8}QIJhq+M+v~*@K(=IgwxwibKG(rx%aU|(o=504^etzd&yp5NQ z4MT~Zv1ES9@C{D4T~X{zc3iTxJDE3)+j~;pV8V#{9-MqZIvs_Ln+UGRsBB@zko!0~ zMglE|sauD5c$P0^dwO`K#Qj>-Wf-m^@9D|9ip7d6s`<Hz<b>nQPuY9;`!VY3IDkec z3`8WV)$fc4gB|Um-bk#=;pmD*deO1LAg`<&9*K2(r@Vthn>Gy%;-Nb>GQ7^hI|{s& zI^O;i2nZj6lW^-69aa7>@H){SH>1wog2vGSelAE{&@sAUfrE(S99>W?b|yNnyAGG4 zd39H!>)LC(=n;*)Z=IIcW@iIa+RWPw<83qI8!qei8KO<JGpG0gz5-svcn%#d8Z*YT z^L&=)hIo!MbHy-L#Dy>0Pv#1>rv`~u#=jHoiNT%B7-nI)T&-IDRYtQ{L6<B~{EfI9 zco{ejxK5Qg4)sTsmC&!09x-yPR4SHAD3*9v0WYf1JDzl8gWNpt59j@XS8BxDEdC~V zRgk67I)Wmo7X?93Pv-K9I<BZ;3Zx#$Q6Q5>Miv)GMkM=Q9_Z}kyt8w_zH?^3E;SyC z6rp6t5D#`4tDJE`lfhXj9GK<dAxCbO2mCy@z<0Ye@JypvGz{}{{K^+PgIF!kjyabm zsajNjQHMBcp!g+yflp<rydl37Mw_AeQE)2vU2{Wzj9<Ur)1&J=`enC44f*if2RIyA z*Yh$T^kFFbqg+Rf=$BeX%zZ<1>(c|&R89E|;!D`iMIJ<&$sU^xW~qrNC-nFNXdpK$ z@l4BYk#+qk&QtyCwkEr}y!d@ZkFhl#3UM9^#djMmxBabQoHBTMv}G?vqR63Ok0;`Z zNfd)(;+5GbLkVrAqpsj?vwW4t<~ist8O;Cl=9_|<qi8ZTSosxBUalP<E*M6^qCKTW z;NkT)O9Kzu9P;M5tFs{Wc2x}Hfxr!RT`o#=bhfH<N^9puc3s}nCwCw}bJ?y&u&ui- z5@;6{rAU1TI-6*&oqp*nKS5k*DmRH%>reKeIhAk-ofpXl)l7DxQ7UTH$pxM*cSIlt zyxvHpWA*9EBFFZeCW1`9qhKJ8-rlZTvFlH~RI+K7?z3aqFWaD>R_a&Pkqn~aKsVfU zKECy_$4IuLbJA+<mAr&ba5Un_u`;<6X#}H6S`3hiPqZf}f$B7cAx!~-P^c0_A`r8g zadF9IW_V^iN#7eU?dTB9y?s;0R9`RW$*9jq-%R@E^F@=qq;<Bnao*O}Y1$8(Vc3t2 z2X3WD(p+yFWS+oAXgfRFdUGX8Z>OQVd3M0r{T1vXeqi^J5c&1KbL4xHJxRM3REdzE zC!e{$u0emD-C?}=Og&aRx5tQY8KB}aFEOEG1xXzX(4}0$A3C{ohLuVbPw>`8JTS+s zBcD~1<x*+IST2|pwPq5lB|2c(-^FjCGy1tIt6^Q%b0c8gCAoGlWY=!F_G=#Cw@78z zpsOrxx$(v=NJ4o)Lp%U3?P8b~P+7opl8LbWkO2i14KOYH&Y?F}h;^^cGl=}c$d~fO zO84$yuy(J^1ITnumQ<%INTbY>j7G2E*@DENKuBN*Ih#!jl0>8E)G`I?Sc@w3Z60$W z!yCk9?kyB}gJ9h8(5zd_7!#@WZkt#%?G&semb|D)4Dw_>y8y)(vO$o0SaiHa-BWoA zis&Q-`%{X#N)p+aBw`CGq9Yu`9RVmXXV0ISlBB7r=Nrb-%sMC`&^*@7ELqP+db+1? z#xBi7a!BYW6x-x+{1`Q_UrQ83h|K2H)^pL2QYnclE%3w*)6!`udZjnm))wrwuJw9W zK?`Luzrf5w59-MjY2v|rFr{WcKJ2<7x7hbk-(v0t*QE;!Z{p=}t$IhXcn3G|@R5%I z$10zQLbD$y%81FcoQA)}7pPg1Iw+Ew1VhRXRiXX}CD1U8G8Hrs=!%K1f>1BoBNf8X zencS+P*&NXnk8egKu?B}L4~W2?8b;L33>zVybkq>;Y)vV9Q>BJZFT|*9EmYYU(ZhH zD&IOjH#a^uM%R(W9Xl3>{XU<6n4U&Bg_|a>qZ>Ai%;0Z$<HnIS?G~h89tc_$vX~z! zn3$O9frgO8jHt9Qk&Sh8-W|(MER+nhXfyF5q_GIJA{dxwnYD_|yOC8B-)^_s))Mv5 z8%W>6HJLyga%LD+YM&};Om<sg7DTMP2?z9H>Ys+bR!?u9lhi0%N$Y7VXiL;Q*cb`a zze!{-G$@Pq?NKp-ex|{YtlG7l9UAidO~q)gsr5WHG7_JNB#eGuwCl`!lhgQZ_NMl- zp7ls7-KAmwkdR9t2Zr|OBeg(=K9C@-z=>)li0hnTP@Gt$Vi@?8@F6hiYjazO_6$S+ zA|=*|)`Uiu8*&<!5>_;e^#|N|8NC9W;AX3Gv;)Y(0TOsb;`2O<`46g2EfdH=tlBj) zZH>`Hznp1kjL65ZwL~r$eG_gNx`SCi4<=LAG!zJ9m`(lalGb;<@BABQO*3^nFMB^x zJN@{1*Bi!Oj!DdcOc`Ab97bK|@c@UVWlA8(Y_S3oF{ljCD~ZtTwy2;jBO)$|mpHPa z$$uc1^kc%1Wae8tJKt)Kw|w}+E#s891Zs;MPNxsoeu1Zw;X8dAQ?7d1OTdMBB{&I3 zmSm<#0UKE=*jNi!&9Ro+A5a8O?NOeFtSA|+e7^RCzylnT=vyjJyO>cvs|*GoA?a)l zWua<JVK7tcSBLugBH?hPuWxAesmf#BleyX1++;VHO!IRQG5ZGx`>izfr}BI@8}IIp zXS4IGPbgl!d?-I;XAjLnsILWo3#;?aS;6#)9!No*=VsCF-l7Q_vIj%aEZYQ8K{$HF zCX^y#i99O&tH>in+%zB2VV0Q4r?Ma{%8Kw~dQXq`fTMat3&D#xPo@Oj^(S^+wA9aS z%)B)-d+v~G3v_Sf7Y$UXWZKG0hv)4ge!Zj4s+!Y`r3bo;((KxHh)_F#qc|}1vNYpw zv`7=jR}I6w^75_D%Lm&#xRf54Us+jR?$IM0<D~~ARV`z9meu>U-rlkKfwWXD(+i4# z%=nq#gPs@A9?(I-e}u6{hy6y#6I2}4R#G#Nz~VodB0G&m3la2=Fw~@=b=C!Ue_khg zp%%mBSft70x0kQ$b~<FIH#RNt_RbDH>hmhTb@|P~XnRO@N<1F!R^3qVgCXyXac)$@ zpvbM^h$pVaTSB20S)MWYW!}yZeki%k$5nTWUyF73n$d{I;ZjwJ^VYc**ojm{kz78C z=Wc0=C(EX;!_MP$xYoPyEAbLc6l=$rrGbHW(MYw~7P!5|?ucEXO?lC59+%)(uzeA! zP$vm~MZ`qShA*bAGMKB%1-iyoMyg;Qw(3$fs9zd<SXlq`Y(AK51-rN(zaD-6;>|ZN zVnTLlILtp$`#dKFk~8T{Rl@9(fw%FjLrtbyIWCTDC(mbf%&Y&jX+<4VpZ7dmRyMu# z5;db<@=_q#5z)C``#GrL<F&_lx31TI0>!Z@e~s{wtpm(5Nk)z=3|bQxN$-1~bkVC{ zZQprW`q7W1kABp;QhJ&j-Xg{_td}veVFZ(ED#<@!e&B*VdoDoMzki=$ypOxT`qee{ zCA(Qzg%%^M6nUEe(ln~1)_(akcv{6!c^D7eG<bQ~UHh~-?Bd%@ps>o!%E%LCw&tV4 z3PAjs8AS{e6D$D9NZME|TBNC9z9MWJWM6f#X43}VgWn5V7vUU|Y=K5NE6<A4U{!XY zjuR?hc7<#)yi%>!%UDGjp*xXH&(FhgG|#LA2|16}UBHznju(x*+npC#xCaN_RCEmH z*G#o^v`oDQI*zwxV4%fo(_n>B9bn&qOcDYiYeJw_Y`e5o56<fOLfXa2_yFBnf|fCl zT*q(~8c+Ez$(M4)oFyvSJ5HSp<$OqjU?Uzaq1C-DpUIl_8#mpbEs>U4zoE~Zp!14U zLb)QWlNqE1@kBr{9~wpp(G)__m&quF`4D8k#bJms!N^gr6@^VmNCSiZh%ML3m5P{_ z9p!p7s`L7_Tx*z)%rf!gBBpMoTD8;f@%THfD^t+t6{(2!)S-V~$adh&t=%Y>kcu>( zr}C?otcXrr87f&4;~q8$dQam%B<AX(<d`^tW1?R~C+Edj01i@U`&0GXRDKMkK-xh{ zYVZntuUo_7ygXnG;A5K8$=-(GaSrzML?{keq}y#AHH_(fW`X<toS<Ocxc}FIz}OhU z>NI{Ld8sWvFHKIE10*d5{?#)yG;2$#HVyW=o*fj+bh~}Es$t&nPQ&=n-`H3+JD+PT z<N<I^ONL8CXMHRqC|nY<3r%7%$4E9Iru%s@-_Iw8Bwh4&g1Q?+G}qM^iSV{S09J{N zb&o{)#$l%{n)e^-XbU)NUv&oBIxrSMO2tb$(*xtKbiA8VbjQ=K@qu*b-4%a(dpzFW z?ziMU%2R>fM6(q&PXbMJABwSn?=YO}SmA;FR+rd!<;TW4JEfU*JMyDrU9X+nRy(=V z^k00j-`tr_^UAil*LIDK=69@{kvcoa9+SUYd(u09*}%YM^WKXuW)89wU=CkFPIGKC z^yf7cL82i{%CG~YJLdqo2ssJUaeYYy_G6+REOwwQL`gKQ#lbP-<B~KxyL0F4tR#(( zZ!1CyQPnRT@rNTFy^*lfvA4w`Y0+d)xA%f*Fx2Ap`Fi{#c0cv_rl$)cF_09dr+q!9 z*~51)2V2|@rK_t?3(%@a%;}7@T<svEkYV_hkK3JV^(l2M>>qxtn1aKk!Z4xD@NAst zRMKNX;3V~k%0b)~&8L#Nlp0P}N+p_Cmr5o|eOqF7Hqi@8EzuA)#2+t>culXvfy)TG zbX1Z?L2ZUXWN3^y9AF4E2d;=dr2Oa5i{X42EM|ry@0^~?s(F|z^e{9e(Z)$4tsx9o z%#3qc8AA`s8)m7g{v2$7oHdG6vWg(`Dk0ZiD&K7-Zgx5G4drxp@ycrPDxy4sy@>Hf zWi3_5RTp9+z6(d8HqqM>I0wTz95Dl^&-4!h00~eRr%)#P7jKiG{HZ+DZTc5)b0Q{+ zOaJ1nBcD=r4s&Emk2>4CoifLg)&-ypSG2!>#LZo~+=Wdqx#R4Yg*5&+R$!hf`u_%3 z?FqsFa%k}E3RWh4&^Kt+G>{E|Z3p_iJP}UhcmkX{PZnV*$G}L7wF;))tXASB3rbp1 z!-t#r3TaH7x>zjMs^xOgFeneXE*B^dTG5<fP>uCKpBzXcqa<tsaVh4+G(ZR%=Yo{g zVOhzl_OPjso++G2XmYbyGmF)Vrlcj9%%rrUeYNca!ACz8k)#O0LF*QgOd&F?B5D4Y zIGr6)(=aqxM9pZ_Dev|dGnt)s<fxte-13gFDJpNHRb(s{iTN`GZ+6}Z+SRcni%upQ z#j;mJ7*OLi8tjvPQC#1o@~DzsuyfmI=f97dvbhB-DcKoaEpUg^*{^BScJxMZ516KH zSE_(dhtRs~QPvm_#i726xz!|AZb@s!?D*V3Ieczd_^1&a=BBu;tUhw1>A7qaazh<+ z=fjej5f23ejVqpL96tL4wXY=T0osPOvf7u_6S-ur4}(995k;m+$uxOw!Q@7%XjV(5 za<!T{_3{hepUV_WrDmFqgNInXqo%<6)jU>u6fu3FQAi^+1Zj}RON>*DPlO0Tf%VNq zE(@kcdPq6FRa;o^->Nw#eF1x}MfcWC{r;`#OtaEaIb~w1a4G{erGg~s^j3enV??nh zVRYBq)<w7a*O!~s5c6oJT+SS=6pN_77!O~O-h}!GpeZHU7Iq1^3pi{xoL!K{qy?ua z7bFf%$-r|^55J->NU9Qd<j0(Oy2^fszTm`rzIWd#vo;)Yw#;|8#GT&wX%udyIrnYu zC9hL!nQQU%1zeHyBJO!tRFZQ+uiTR9>QAa#p{2il7|UQ8r^BCiI{5joLwSd%TO6U5 z_!VBodp^c<b1TH1hV099hq{xRndrEv5D#?kbSX3IJ6q)Fy5JU{LzBL<eh3R^8Cgk< zIGy!6lWtgny`l%bHqNlb8=MqcR(+v_=I+EgiKXT({b>vWeNA7<n75ODtM1ga4y`Q{ zH#j%q8B!1Yfxh;3zCS!P6ed_{^i=Ja^`J1{9g9R-WJ*CP{l0dEx3~B0v{HnJij8i% zK;QtL)&6=T${vJv+{c#KrRXoeBaWqezk_HOi}aw{WFP1YR3^lJKCY-^k{<CpQs^eS z%5jH^&Vyz9jY@y4%NO&-ygo(p*M4E1dgq_f!kKeBt#!V|(;HCHX_($Vcc*P>y}<8_ z&2;%xO>s?w+HTr{Rr=;`yX7zMwmR>ovD%86SU2=Q@Ir2_{$?9PNEW7-EcIM}DvW*{ z7t43Fct^(MS#k?W2}O+;POTpu(NBpnRI8FIld-Jvr1e^o8rMRGv<lI^m7|6}GP>Rx zKFg#$St|gUqm9@|Nh(H$Iu;#f@fU_N_mkdg>H6SvL{nlFequZ$)b~_Aj8T<J!T<{f z0q#ItgG*h(HXg)gW9R5AX;RBSY8ZEoUYRN2|24y*&L45#qBj!qc{%1wZNaY2kmGgU zz(Lde>~${_kw${2BHl$G=UyKc|EWBsy3XSyi{AoI=m|ZG*{8LrohzA~L3ox;u+U-= z@~K*_8WpSvt*MJgtnh+I5?d1*c2F!cW=Scjn%Asfkg$Zmu>Kmc5Fm{Gy!-z9eOtEd z+O=hiuXev}{<r!R;-&)WPf}mUT#aF-mI!e0!+8l8@J>sd1?-2qw69k1SG3hp`)+v; z)K0Ce7%MABZFRF&w4draKqJpKF+aqnMC93*g&Kg|sP+3(FcMo2L8yD-)lARH(u5ic zErb<G=fGI57o}`J)ygC)&Z=uYUr|??@;$enV&(9;^R;RVJqSkbMs|(5a+IttlO>bW zdJ%DX7KEk)VMCK%R2SkW(U*jh#U#w_$zU$(fr*eolVAgXyj-kSwYp1~s7F=!5II?b z4Z`M2<B-}<788^4DR^6fFsQrmKg2ENGoOrM&L(B88{U9TL1a{F7|~EUG{0X1QgK`J zWf>Yi90Vd#Mv9<7h+Q4-0=x2gV_n0mPo|d98lR$sxkm(p50(qeo$wF(@}ll>tV)i6 z-)}-IP{q;F7F9J`{~1E87DDM0D1R~`)4-K-Nk(OF=s|mJMQX{`j2a;tbx(aI0(Y)e zHTv*Mxr}OA(W7>%hCbB@Ib5LuNS~rmVy$@#+5!F9&t}l}&Ac8~19DlY&k95j)V2S< zej(kmn9+o@`5bJnIf*r|E!Nl?D|@rWooU*}u`%z3CKfxFjRIP<X=SrkT{XC`KK-48 zr_&3jxwP9fikNPJ_o!zM^V9qws0O|j)+}~>Dn;G}B&tN|gndISy23X>RAn+nm55+z z=BiYRtgr(E+XgbktwW<Om&E(}H*dMdr0>eW1>5G^J4)AV-qPR4C6{Y7L_9i!_;8|8 z)l}-L6$<ERpWk-DfPx~?(cE=k%{K6!E|jbvesLL=1C1<zMxa-RvjL%^1t4QccO~hH z;2bn<Jc_U4iI&uJd3r0Bw8e{~AYNK}S;jy93Uo1wbkXQyRIs*P!91W=!tgB_npT1m z`%E7bE8MH|RS(<9E=K9l&(<h|NK<E}xKk``*dvbw-4H1#5I2q_gbM-|Xl|QYkQ{j! z(*2g1uG%b^Z}6ImQfO6DUS}i{C)JY_$#^8<OoZIg*rt%8Y3jyStz}0@Rn>S`KdDwN z(O_#wi{=WWg0pKCzKmqZtrw9*a4ap|aKqA)gXBV6=E6a*K0U1uOeb>QP$+U$igZ5r z88*<_rX+(V^^K67{1oVXGkZRRHy`HTP^vNYrBwjGlwEKL*Ek_R$DBhFY@SqSK`v+) zlAyC>`9k9)X{CY4NRZb5QKUA#zblR!gm$!Ots7NMQ$m|!QFjQf-<48Y3yNZTTQcrY zu-$Hhpr&~?gk74uvo)CDN^_$XN3xymfk^7ANGRmZC8h_cYTm&MGi~NYt+FAxGko*l zAh%n9w|5K&lS-g#V6C2oI&(1}0cT;a#20HwP=8Wggmk6qQ6))0QD8*J1JxM+mTMAX z;~$IW^tztPN@Jy<G{Vg=((t3BcoQ(ck4HLf>z%OAaU+rS#bUlxtjnu&slz)oxNd4d zpIAIEoAqlgEuPkZzqfb7>Gia=dAv>&mH_iy--fFfdjmazhh$sm)7{q^<w37)hNS!S z;D8^#SnaKyUH!hUxOXZEFN<y+u4zMqi%yR>(B}0z#*;nXKuc?DOCT^YvH4tA3~5GW z<?-4M2y~ZWMuy%Gy@z;al%+7f!8L=HRT*=AHI)~dKAA*vI?bi?nEMG!b5^F-rS`|i zdaPiwzFaD3q!G3SVx_8CESi~2?WE1Ymu#NSORi}2R5a?Unq|@ldpbLO7nsrMOgS?h zjUI?D+YuYAzE1Ncl(U7rV9DwMo<r;=EDB_)MkUBg=w_x-tCAj5CdpT>9MH4_BxxA_ ztojli(X4JA+Xj9cR)uXeX)S<G)jg(BtJQ&F>8Imxl!Bix{)K@#q^72F<FI{M4sc=w z@lrV&?Ri(>mXUmZa<Z=l>$6>3(mWUn1-W&to#{;Vcf&}>UG8XSGTGJMKIU?{Jsx)} z7Sg0($amK*g?IJ9hF;!6P9!aTlau-U$R~9V=nCs-bgg|n>UMD{-rb+-=;#2F&R#;` za`{3*LeeUDVzsV|kbFmrksf08T^J1~bjZ4raUhdH-&s1u&Xs7i@nNvd6MdARBgsMw z?G)A_!j=u@&PJy@5)NU|fO;yX$Ate^kJl{xrz*TuvDmxF>el%+d8KP*UR*IX4WDHp z&uyC&>1ScgYu2&tRz2+TdQJgAlyJziM!n4)h$&E5-BpHYSug_Kx`984R(Rf+#3SLZ zbf#WfKHiQllj8VmILt~q{v=0NAkvwHrMT4-aroh1!+Rx3;$B%sm(|S4ZA1P2@sa+^ z*3@oyED!)K#D<4QY=eJ)Z(lSDTkUuJ;ZR>780>Tg;m^be9r)|$><EaquZp%`)zM(` zgqE5J=xdZlS;#IJy=cB7<+5=J^V+-)GOwA-R_DGo6Y2;N%on0je7yE|tJ}@hPG5<7 z3~$;?aC0Ver~Pb?9ijz4xJ80(5WSJDTTF>lp3@;gaz&x`7Z<^8g*GENES0VbPT?@( zqaBfYyJreoMJw<?TNinYb!qNUsFNg3R~y<7%`2G2Xm>YneQZqw*A5p7-Qlp(LN4z- z9K~b<^0`e3hv7hO$xIp#Meq+l+R%}O!1VKkBOwf^1!G-AGN4B*#5$HqndZea>{GtB zhd8TMi$%ggV}bhPW5Q>!1N>uD_;rw5I$FEl2`b#hL?>V^P2A;RBA5{RMN%bu<7T_% zCCz^N^VeYS#7EMsdu_J?K34mqDAT%(Akh2lj!4@NdouVdb9RP3)aLsXrllyOHD=K9 zu;6TASFqQyH-N)gQqUd|lR`*ZqXHaU81Ypxas+Ryca^oIW(^g=;*<HN1v%<%@h%L% zIJhJ900HIFlt&I`J=oAI@NV{aX`U^n<M3b<E`nw*ruGdBH$J*NSESw0zK4e`Uzg!{ zJ8x<6dklzJMefUN7#xzMp}`Gw4?6al_^X&1$?F3j#pEBk%FYct>H@Jdm~10=fC^on zGgigUj_#V)+A2jlb_QBKQaiVEqkB4`y6&Ysn{?22%%%EBD|@!-2C2em7)&(67@>)t zx%o|-=I446y!m;hx{SZ-a%Ic9b-g`3z3bL(S$#60D;KLpT$|(><(q<z&iX`G)`gPj z5L@YyF<n<-XU5vikOU9sl=Q6m*Q^3y?Ra_NO$*OniXuv4?3kJY={-|f{-;)makK-L zBvV=SS&Q-)mt<AOhcF5ziBI*>$`2^slHPRz0M!@Lf^-<7Tn8CC>vA1yLx@YZGK-{9 z4K&p&-u>=Z)T!4Zs59)!O^e}I+;PV%!i$@(EH>M^;7p%R)Aj+nRy?g~&eN@)X2t9b zlcw@J;3VF=BM<s7Hk;N)qLD~+#Ja9+*FmhuZAE=Z=TFkQCfN$a@Wu)_RmC#%k&+9W zCmCw<XIuKRISf*(IS`AV;nI4;G&fyYFC5jf=AsI%8z1jA=QrK)iqAb;**@0lfxI@; zD8CrgRy{?9bbVl8z|DK#@T{#ud-LixH}b(Iemac#<$87=E3nJiwe02WCU9!oxTTWZ zrcMmo4=BAAf{N1%EaTcCXoY%+xFH_;*?JT;r+63|RtVaUGz!FlJ{iU$YAz*awC7qJ zY)#g*9~x28b_m~nj`DhLq;o@x*!)v0LG0LgN;aAXzOo&%(~e`<Aq6|6VKyn*Aq}Pb z+*GDfPVX$0cBadQHFo(Q`RD7h4IB)+>BP1i-MUNSo1|h394+Fc@+m%m>5D;7u^(_R z3HbBu-0j!sdta|#b31>V{k9S9J9e}m-*{u_s<$pIy!9$rVXbjng6vXYgUzsuP=+9S zBbar7W!ClVu;?T*DP+ZZB)-BQ6NX4k2NKkON%-Sn>OvZ>6E+Hr0(!-ZFqVN)Th#bO zG&)^0cV?ndOv7>6X%;c@fSf(Us#OxGrfHG<L4?9;42EkM-lPV7Es8`4teuQTwWOEA z@%kVFEt^SIGNB(0V(nxac9Jbvlito=2wL6)N{-QvCZaRU(orN)d{84%A2wuK1rB03 zgD_K=eL%%b!EOQS%<CA<&|vWx7DNsm3h%6#!e|eZP@{n?&+u_`TU#of&8Aar+srl3 zN8M_)EwWyhrG(QPNJz5ob*6NeJJPl+t`V=30yVrv9HlMdcIk;#v%k*`3+Ubc5o_<* zi2rT_&edh(8G>qGX-2-(ob7#9?h%1}Dbf~I-RrGvUnCp>>P$n>1eCWDFA1C8wAi`R z%)SE8x)I6NOKey9sa#)*yqn0S3`;?}*f~jFV0j%2|9Q*;noWL_!^4<abqo(ru09#f ztgQC0ljp%p8U4Spr)MK>csy@%$mJU1tl0*5hIO=$jAXMTBkdilPnBklnjJCC8P!y0 zOmoE56_0npIBV&eL`&U}>C=#5=hF(LE<_fjmeADl6Ywe%t0ly>Qc4ml0jr!Hd~$Vd z5(!97)U6^UC{#P7+Uyo<&YgHmclTS0rC280ywue!kyh*_g^X=kCzV@R_t!YZ>z5bI zLf-{=p*0(YO3k9NVVqyKQ8bn&nsiyGSlJ3&9!20sva09DVAdkmWL@CYmjy?v{&D&z zM(qjxCAz23s_O;4kPH<<h0%hcWeP=J`N{MjjUVG}Yr!+xc-vjb7+RsYCO^y5f_&n! zw=+c>i;)*V-12dbo!mOFo_^UwMs4}pwrkrqhp!D?_ujVag4f<|MBh{180D2}#i+4s zgV(i{!q<ha%^=dXJMeBJI7Qw54!W*@>)CnHYy#dkeWV@Al$$DYqzf#QShGtZz_K=w zO8|m%<VHmiZMnyb6{E_1ZOGPhEwVMJY^5k=`&g$3quA?hal2h_F05QIxpJeiZ|v80 z7w$(@PJf&V>A4PdF;J7XD=1-k<Coh#2^U;?k(N@nJ%488cH<30pR#+5>LYBD(!8h- zb~*M@@l*XN87uyIv|2WgZT)$8&mX_0bWQ0_&THQfPESm0d)7@ZElocEGG6@n^pB>0 z^eKnq%ZbDeqig*;4;=W$*hgsm8_*F9;HAB;>%dX5Hb=~p>m<Gf?*whbQ#1w}4agsq zO@uwq9YO)8Cm4vVS6I!VvjCuX=X0<26@8ddVvZ>6n1P4Pq8S(N+~l*(<I6OEkh+a- z%<O$3z6>s3EWV{J^1bgx+QKp0_8ANF_2&2bCn*iNf=~8;&%}}%QY1WCP0M-`gvP{V z4)aP<m8q@%pVkQ$uoO({!gKmBtWyRxGR?oJPLFHa<5rzGqw1hi1~*VAT2G?6G5NQ| zF#j22d1gZTU5yb0TM=~%b&j<$#X-iWn1t;vii*C}d*~X2Radv}seDYLDCojf4wjq1 z)&b#JM!Gr7I9bW~b9IB-9UmHscdK84ASPLihAsvCM#1GWT&{xQ50nh!XfyX}=DaW{ zlm|O#6LiO*i30+vusz^Y)oyir?$t{CRhsrH9=ui4?)A9uw%)<Q*reGnH;V)`LlY12 zK%b>GK#b@h>S2*9h6Jrgz&rzYYtUjcCoDI#cNMFSL0E9eBUzVe4T7H5c+<A|U#z(= z3{8aMre?-*zp&+Hg}wOIw1bw<l%~}Ru&<H(l(u%Uq2MXDr`uBx7mE+4@KE%Kb(N}! ziP&~>gE6(ClY20q>_<OZvWG#nUhNAtDKtZ9SKx$W(hv`#__I>b_6U)|mW6LE7J$Sm z1lEAWowH`4lJ&QU>a19m@xS=-T4irxZ^o`fZP_j%9?FdmFE)!4!>U_0+f=iX)d(7P z2-#19JZ!$pz)xJlrr3x1;XJqsts2>dCKiH@0(U{Dp{hJF2A>40ikx=-#-M6Ku}mb# zVe_$^T@q(i)U-=pIjh2(c=x6jyQZ~@#!*1f9bax#y4t8H9-wR0YhbRe^!DvmCz7&Z z)}x>!O~ZgZVfA^H2VAoU`h#7^ofwVHm2;p|65+twI@SH6$9SU`v-QfU^*h$_o}*XG z=)z~L*x9{_QlqX_+{%s5+P<xUKM8e;GsF@tQ4&}24RysgTruuAD`LH}j3*~-FJxvb z($X@6X@<sRU55-~JWiv(HzI*>hlzyi`cmD92`!s;V&R{-m2Ed6QyKjSAd%s!hHD=^ zadV_6>2vXfv2<PnTUwGmBb&!3yk=h?t<7v*y8QB`t%F0H_w||HiSf+_{;G7LKE<`b z+oJ>Fs3XuONo@f~G&~S(=NUdYxS_4HE72Q+#S>Q0SZ|`Mvuy)b$!aGlnHaA0VARK| z30e+doK9lxW<C6#up$^#XqOdrH0@bMZNd<dSo{`svKY~t-DViXDOIQ$GHE$7BKjq0 z7BZ3vUUd*>E6mR7Iu_`1xsLWBe=42JrBi;hzn{a3vSCA^uwg@rp8L($P}$0K;YGUE z-r<Zy6|-fy#pER=8gW{WX}jM2*gzl|Mt^#O7DeLS6T+9g1I}W8e|v}UDqkTy1-gj8 z*STG)ZzU3ntb}~3%PpR$i_!C-0sLcR_oAoCBeYR(t5>al)S)v|TVOgs0Xk*`Xe=0_ zAdhI*SpqwF@>#L-jEwb;{#2^pVO<MwPrx#rbuDUQH@|f)XJDKz6pQHA^Tx&`X>9Dg zx$*HB?a+&jkI%WSsI=~8S||w5a=E;;L}kbB#(LSwJ{<z*B|5d{kC(Hn*o#mXupL<b z#acV2xw!;g)N`ym=gxaDY>80|$Ci8oGX+RlxH^cNaOD)!WZeolRl+etM5kDGH%>JR z%W|`<LvNHbu#gusyokuA_!JHL!@_-rTw*d>iT>(SZY%Lx2QsYxmy5+RRw%Ge2dGl= zDm^vzCHeD_cS_TK5KQTbm{A4ls{~X`B3?(GEAh+xMtoo(Zur}W`xX}ZhT8|s8u*Ag z9d)JCuJl2R*>DZ6{8%Z7^a>~VQt9Z?eNorWovtX~DOieC2BD*ql(>i$(FX~l8`3(H zVasr?sAQS|`3O=<Kw4z;D)yX1CnFa&Y-rBQWFfa#3G2sXh*juZ@*JDvAGsoyXghNk zoBjZ8SCa<r2uFQ>+Rs+2cF02;dj>Z4%x7-l{OXA$_dnC=3#I0s!a^trttXh39&i$p z*}h69jpHN4nG)^aC}Wj0Q!GE@fe+2S4;lp@t;>~m_zF$Iz5&v;T$_aT!QwTI<#sel zeQ`8p+f~QlMNVra>Y5v8tETPMrxy(j3}cIWB)4TtE}M<Kwbk_K1clZT9srshVm2Gj zo1foL2nGfs*(@Q6+~+Y{bpp*(!ULdShcwk~)!&8DuEGQq)hs6231MrMX()kvz@Y^S zfaM5nfV51|KW%cusM)vg;J$qs@e%$>71OL3W&D|RDWe?)pOP5(l;wAp0&T<klOUBB zgIb^$LlS<gG*Io#;cHi=TqwWOB7=h>XK1__Hzp_VMEc+l=WmouvsAL?Wx}UVfj=M9 zagK(Lvr?Yvu%q3(m&?n$4`4LHz9lXuUtU?Mt?+%(Xgaeu8r_@0FoY-t9aK^NGOQGs z%yME%dKNoVV#29L!dw;mM9A?EF5xFLahU&>0{HY`H+B*FbH&^pjlQ@!_{GnH(_!hC zLfHiOYv6273kD=`)=sWPNftTF$FCyBFs+Z!UY2JajKSP^LQUiwLsGcPl0bm+icWXr zcrg&@?(XU7?hfG3elpM_yi}hEWb6qgI4JlSH*vNDiSbx0x%yNCtEqEVdmfpoR5DCu zjx%4A-pId*GZOc(+u2>5aVMv>d$eai3L;#V&c4;Zi>)o#;-bz-JvydJsSx%X!k-1A zT-?ZJK|AMYOHTc<euIn`ugH{ud~kE5#&xXkoi*JOQ#fLML6z|0>smZ((TQy|(5mM7 z44+8#0OMq?k%6d>RU1FYc{6J(X4kM@a#)+kv2!2<%}gxI(9{o$k72&4N8w(N*XvY! zTn_APZs~4OLRyP2;%k+pR#gpnH8*#_AA-wrxZ4@<1SGHSkb7iDSJ>t4@VZ(YoVzuD zz}3<rQLxMH^SHe29+!`|23i7ewBX9W7)GR-4>k-|w<<k~<U#hbnoynf?8E*RpYHQW zj+Xx^d*sqWMf)G}|E*!XZVfm8q$l9SZX;()z^}n1qxwUBcc9JH+STfII@&acl29F7 z^0{TyP2v)c(&H#7hu;Wl)XIIL;u=n|Qn=IAqdM9G3cbM5eyVsC!8Vqp?1*}#K<!Ts z$M)vTGq%O2b^wjpR1BZ%8H>UFq8O;<GnB*A?sYv&Ip|fSQ}mSXm44%Jyt}yvnDfjZ z&wN!<_?OtLvA%sPyAvaX41xdC5K)BJK`5LV56{3O4ubsIM+pYXTI#l`-5w=y3WJp% za$o2J3S=KN5*i&?Qv0Yn;*vBCP3s<Z%ZW}Et`x4$kT2LB^gA3rcMI&^*bh&hI*Qtr z_Uk^~t3f0pRe!7%e6rPtKJ-R{daExfDPyX$#S`+27eVgVy-{zVTdExz8SysH2^%X$ z{9fH3adD?p_D0%(qOApPAD&2itH0mxftO0eNyU<Q(4)|{Hgpg5kIP9J#RJ$og~UOT zTeuVMp<IUUF6+8W_v$FVvsJu`^*Ys25x;iG=^SpJ<u-OqHTW;dIzKaD7h*X2!JdYY z{{=h{p?%Y~W4K>o)|S<UkHo7dR$@Lc{F%J5<)QEy<_pIAJ2=w^y2D#*?0LScg>-?X z(-#cF0SB^<Brs%b30@E+pDNO{kgxsF*@%CGgVRzF4qrol4k4j%-V4nCPPJMn6!F=9 z-e#jx_OzA~qlv5T5E`v%wz_#mye-r|H&aq~>KpY9hN;>z9I^~nN%ESb86^ooDAlkq zhOk`{^9XUESPE=U*dXZ@BIF$4o5b><wAMGuG^_}`Xd32FY&urlbY*Zc(~EEPZ`%@1 zPETXu3cyc`8y;yc2}83{J0&>=J7>CHhz*y6+F<9lM=&`?c%=%@`}*7&OI8+wlXW!H zWbZNR_SFEqS#p?jyqvv}y#uv5XJP?wFKdZ;iZ;v80gSkg!*rMIgFL`9Oz`54M~F=; zHtp^b6D_DuwED8<I*#)VQhMEgWObcpjfsMno5wzEdx36p#vbiSc?LY&!wa~YLniNv z#XN%^Z3u4rxCiGu=Teb~)Cs36DV04CjqZjHvu}Six}WY>j&}C^u9>mb3eEJ(*XYlt zu{D+KX<t7%nTSO;g`?qjdv3t>h6~0G&*(%b8tU5I*^7WgU!XslPL1L)Q#Blpx!p0I z!D1o)V}U8pno5+LhpnYgSvpD&?Z*#dGQ+XHK|)zYE0Y)`{R6ug$stosxoHD1xD!5^ zU@R!j<Fc&w-mZ6C=nZ<ppL{`Po0H2IU-;UND=wJZ!(UXpXW+i`d&hJ*j(!p>ptgw1 zWvcOpw$Qx0y+!*_)iHln==}8MwPhZ!Zc0psj6P^~G=_-2yD|3~g*8{~uzsep<&uq( z(ZQ=$!TM6zIgwNCbqTSL0)${O$Y(0`9o$)*Z<P3#T~>i>kL3r74UsDqi^YZvdd9kx zz9_A)*X0NAx2p2n;WO;m1GeNkN;A`nz35@v1F4>U!eYG@_LCQ~UF-&MDq%Z-*@PGt zcE7^RiDfoSld&ae9(q!L4m<1DZlcQSc7+?lz;1#ua05~MRVRf;dobSJJ&|2+Tr`za zXH*Q_Qptb`C9Vb5x`iy;i~9H43;zuV*|Z(fa71W?RM%%G;4ddlWG`HDx59p;rCp|B zTxX=yBh7=L;a|`|y4Oa!-_E$<xUkm_0gt!lh17;d!+(SI(JHs~QBycHH;z%=)R5TZ zfV29re7V}1w$DaBbxuq1%4mx`>XU~8GLHrS{524Kdfi2h_JX@!2cL~xGGaHI)Nq<G z?J6|d<qf?KSFgj9!17_gpC7_lh>xr`j{Kr^<EI^Ixfk0wL<=>98FtxNxEgIh^9yH# ze|oS>BFi>|ZYIgU3Ot`kL>$jkuXs3-)U)Ga-I>mchTOx6aoG&Ed7SH`W3+s)L<I1w z?{`k+7V9;wopK~kh3?a|yIbC_X}9>{DA~+csy*?${@E&ZW@RRsv};AO%*Y%qG<UXD zc6&abWG{wa{oZG!c{&e}&MmR()2EWE13pf=6!_D)Dps5!*r;>CsW5XOl?at1Un{W) zfCCotuv(ETx!4zKvw_B7Ih+2CqEQjlKkEsG!_cIpa5&iNf#TtIw`*Fv+Z|}d*VT7; zwdP&xYZ~2d5B0N0K@n|Ywbh%~Bz;b_Ym2kNrig;gUF`X$iLu~?M-xud>%;n74weEL zI!J<;!0G}$Omg|G#IUefs#Q(?6<%%jKqz1ei4DoQ_h0bxQ<-YD)a+CMs~I}b(csZ^ z`ZaVb$O@PQN!!6SCu|j@<e+cD>W~voO*wYzRHaxrYDz|>aw=2FVBs5A&B&ZOdQ>xt zCD`;<Rx%l3a9tr9S(O7WXgSxjzh?*8SD+n0k%6@W{1Cz_0-Y*LeGj8D`Z$F{6wvk7 z{{o+JOoAR#bUFdpK&qb%C!m8A6o*-fR<5VQGY-U9{SVQ)prZDq99ZP0H5jZ7lGiY) zO~NA&ql>I<_%;p|963U@q9sO%%<;T%!-uXx7TyI8{KD@cj?qX)eQ4)JG<e6NA-hLM z-LkQHZ)<BmHYK}o>}*HSr9dBcI@_>mXWHO_*EgbV>NKXcmX0>3lhkFdxZ65#NUaN7 zllxm+Uw1b7t)-J^r>_Q?F4<%XeXc;3?&2JZ=#q+(E3w$^plno}vzf~c4|jT94ipme zh@jV~-P*m`ie@Z!%o*OG&w-f(&HP;6&f%e{+>|7#R6PeDeeMzS>_vW+P3FcbnS<v? zp&#r9oqJ#d>Vv;ieVr4%fvzIvPYNQAh=Asu0=I9hsNqEtiZAvgK_%}~=|q8i3Itnf zCVqD$vJ;1Aq)U1J`sVQ6t_t57iR4S^+WzI`B0gALZ`yJ94PD=vsFZJ=`bKkTwUXGW z>r=Ou%gf7!0zrL_Kr%~bJ)mc?8bnkFlX6{N;f%U$pN!K(Va>&?MUrCixWf^T$Ce(3 z{1HOvOQXeC?5U;r#tVx1mt;)CaKmH+Yb!ac-vP-Y#LM0HSIpX5DrAkLF$;YgzZ*~y zCwah}7NlmNsV3BmTvEjjiUhV$kn6Y@V_?3ZWsrBNbcwa4%v&riMY$QRohrk14ZGs# z!Yd`i+9_sWNt+jo_6q}6u(f#(JY$|gSZHjoB5Nd~F_O=a={{keZrY7X^*uZLGtBSn z40m<mz%(AFd#4Xh_fBzM5A9p)U{?x>gT+e+@k9L6(6;^;oM0q){C_NDIP-ivC}Hzs zG&(xE)$83lI*J`gE(Z^O+w;O_r~c<2HH`tBZVcdxTu{UPx!lZ5Hk(l7#AJ46CYS3E zxeD@K&&~;+n}a-)q_O7>4DFd?H2<_Mm*DqeF@oBa7IlQn8|cY878K+JCpd7_TreS4 z!4epp`5ZSa^<edQPue9i4PI0+D_DKQ#)O?w6FW9&Pa4N|M0iaUE$w6V;Lpl*G-H^i zk%>-M;2L7@nKNu1k;>}9=@LUIFV+soFJhHnG=0&}UBrUEfn(FL%NTNJ7R+26OCu+U zNRBp7-j<u$MX_1s!K4fGWYpzecy39oNL#{+RbFhKjFs20jb`Pl+}~l8Xu-LopAuFv znk{;!vD^h4z%1qsjAmxS%0y#`+Lg?ym=A-RF&h$0M!XhclHSuP4QPF0nyDU)0R&M} z*hHzmaMPdXFxb-K636bi=A)^&5yjTf@X$;~i}-PnfzKbY?;hUTiZdBo`RiS>(yM3* z+707NxuxMy$P9&3PVR#de$6>m=6DnvRwK!l9`gvHD%!Zj!(@^0i3<#*ZC)&D`ZYbI z4Y&HzA<fW-W!cBUXGotUp6bL}1N4z#F0UsO;>;Lu`37UnC$P6(&*1{T7S1yN%WpzW z&5}7{^Ho?lD#hA+hfLVkE1a33?LAU<*ZU49ZJyeeD4CVs?5j%Ua<d*pen<1@g;YX? zZfeb<=h2eFa!iZh)Y#S;CQ~VymiJRaRKZbR@V^)gQb}oXu~tfqp)6u%eW9Yb+--q} zTV3txbbI@Nq6}*OaBWyo0=}0y1A#;)5Olc|g&(;8pZLz**<O@UOtELRTcIh)*WIDI zyEyLxxcd6~UeA?F;vF6G2j42=?X4sfR@*Is`9JNhZWP`kAt6#hJ=ktYx^x0t*7|U! z8Zphp)B-2VxC)9AJ`A9q@YRjNU)zhOZ0si0*O4<@Pwhmig9mHh!GWD>dmG=}?s;g< zIC*EI3fo#HbKC55GSAPA3=B+6PWDUVwFAEn>x)b0Z5W<6za|6%gn)fV@7r|HgR_pt z>Y4$Oys+$B-I9fWGll~C#Cm~2lI^F1np9}X$!3K?e+<@Y_~{MnF}qJ5{)fyxPTtv$ z7vM(YUFr8{ei?UfJ-?LUCHXV&<%MR4FZ|q#LF+71GGcel9VLHYv?tV_Bn~C@#%D@h zLo?;Fwo++!?t-|k_YLu_9qc;jzZl^{I~|kM88Y#WllUT0Ee_4bLe;pwz{jUBgehpA zOj&dU%^0VSqX0Twy&oqCK>-?9&?J}_kq(RmVAuFA9)uN{8Q2)t4ZRem*LJVB-(wh_ zey_LPg@A~wJC4^)F*<xAMr&$qj6ySaTeT2Z{x489Wo8v;%_)x4ww7qO8S#NEM&mV@ z1CeBUmfBO>q2^Y5+H^0~e+ooR>DasW+|8Tk$Nl~eG|t&ox67+sYLm^okF|P*Tj!Q{ z)Xw-L&(xsceW4fWP~V!{_N>-dHrjNw{9&v>`LOhs|Jh^SHA(F50Oy4{+LnLRCYQpS zW0^h7zK(HDKLmmSyCCT^Wagu}4h0E66dk|lL}p@f1_XtP3Ai7W19<>Kp#b5xg2Sj_ zdL55|z~;GLpYP~!{Sn*pR?VvL#r^*|nbOsBkiw)Yf#YD`c_7fz*5dB+Vryv^j{mhn zAl;<1Vs!eVQD5hp7)$oVBD01M{nc5M`v0|(wqp&N%GueSRiOV>k*l_TXErMZFZ&Cu z1#5J_9nDx8d`9>#(WzUTV2ObhjMRf{AT=)yIs81MD#A65*kwNsDH(FaB$d2@(EB*F z3QiSy%WLb~(;Z`D9b2nrG_8772pNY<OQkf-8ackFp~OkvH@9ZsL;?6E93e6UkAGB? zB<%-PIMNxrqY(GpsrV$xr{KKk*63~nzCKl19=P6$jTBb;Rvg|W_<g<X>#<AWT2MBq z87gJ~KU6h~S$swhiB%sGXRxZ~XHj+?n|AUfx7K+1(wc}^u%;;yss^zz#sx1W!cGcB z>3!2)sq(C~t8S(0=bN|7M+0s@R!QA{%@uHI;^KFo%(%!%<RZSsZ~EwfEI()6e?ZMs zdsFjH{_mWHQRI?v2}7a4jgH0Ohp&Xm%h-e81?d4-37jrMKdC^j9sy|OIN&*;(qTi` zVpua@y58Mmn$XV79{2i}R?D?YnKmL%yG*D-CN?IyreVJ(6OF))ONp0o>K9J`haho~ zk}u`KSD+We&)xF5t@vAh_in=|*Kc^jhnGCHBc_K>l8$8xIafs=eggV=5c4yp<Hz`P zOh;i$N+kQxP5B5G;v+gNJnT{bwEt6l2ej$ehWXq8P68P*qUp}oad*g==dbSS?yCL0 z`R^UQokKmNxsJ^AV6UJN!e6fAPmp$qm9qNJu3*_FLI-w$0phCa*4`$}B*+U5hks9x zcFmsm=8>+!o?O=r896ej$>L4PFnO^jqjsi~>UD`sbS9Ph!c->Ohe<BAj}LS0SA*wj zVqHa8rHH@M#0Y%=xvQf__$HjPpp2lJAW+&#l{!Ew2i*L`_5P0Z@^ZSPKZ3LPlVj^m zbNyHnr}9Voc~K+PLbI;39gqRMBbrK$jrRAo&ynSFuD!2+bS#y^Je+K4|1R3V-t!TK zhd3+%Fw&7bI4oqa2ip%~Oj{epFb*)DOxUf^BErW9*SG6>2@`;==2j@~C0;fgf3?da zkrD#W{}7H3J|A&PAP(5(4SoZ^0luOvPqsVy0R~_dmIh$`CK7z>ZY(B>&)wfbvTvHy zhVC=p<iF>i#riF*nY3sLjU^@t%7TRvHf%kQ2`6|I=Wo1e^hT3rN!i-txLDt~cH`(x zS(-Va`1T{p6GVB6R(bm9_$bSH2x9{{`Lh;?##2S`ngHuTO^ER|HIif<3t~+Zv*F*b zX`|1g3CUN=d}+OXP{_wc`?!lmDj<D8H`GrSt&;Cy4Edz6GqsTyZC#+IquvtzmZcd^ zGH-X>S(&cwH9PA~%W!_&Br@OH=r}wed$c*}&kS@MVExdZ1Q(=M2d{wV9635#<0e3} zU*QvqUpv%`=&}KG0R33h_1}XKD=;IP@boXfw1~h#s_h`+6mi~j-k<}_c-g?o`n-r- zIlRUV$>f)jmsq1eFd+p$MrB2>&`O1580N?H|Btpe0gogt&jjO-yfc+jr1A>gkxHd9 zb%&Hn9i>t!s;jD7)z#4I3q*ChJGq)_ph4}UDTA914&!22Ko|^-z00KW)dq}Z)<D}H z#yK{|*kkV_W*++i&w8ES-7(lZ>#fH#_A<LqXYKoae?(@aq*Pa%*;Fd7jEMjG{_p?p zFZ;v?=WE!0`~itf4C8^%WioI67xOi2KaSV&`=;=|D!mWR9q{L1YK9b=K<zBm>heBO zB?NWkg{qPS9-RaJNGN%bQ`{%)%_I8+3k9W+V>cLHI>c8y`s0?8^>$E*dqm`cT>jGS zlaFN3ap<S!U!rI7eAO8Xz}weQ?l|VEEQSD{nz0~!Q2IOZ&%iuZj*dOyFCbX)D-Oi{ zzG3`64|?;rT!5=q(OoT=`yWt_jLcqO+;FTs2pB4`$47oB$kEdrV2ebo`J*Lw;0p0m zM=?V4)16S~!W^{|Fz0k<yPXj6p9FIqo$A1xoMY5v?oMhlcV_4~%o$1&IH`&<DK<Yv zF6U0=<;(KmB!EQ2FkGbM)|KW*`GhB>3p^otqLtuAOMjB|VB)Em1`z)(hWhUaeA`J6 z$=2ICp4A8Qh~V+>Fm?Xc;z-(V1Q)O4q&&80ED5(If!nxUE!YR(Gt_tBw$6s(S#R3_ z=a46DNP5V@v4~6E2g2XQz|dv@(Y_f~d%`m84?26g1QOy2H1W-4g0tqYwhpZ)TCi5b zsw{mEb;55PRgpo90jhljmv5R|G(IYi4?w4CVSKC_Z@aHVA9TR(LL1wmjmX;S;MWB3 zD`eo@N?J&;HuFjnBD4dyOD1P{Z2(Om3|d&efi{YDH1<1a();G#D|)zv)+2L|U=3{k zA+Cxud}#o8zIX0@fONv^W!!+WL#_2A2AXLUxP;;!E}`{M+5*D@O+he<YNSIH1OO^7 z(oJ-(%#8HyD!KqNE85jPoq<zPrR9V^w-lJ};Dii#Y^(L*K5*Bu7&H*Zk@6u#<l<3{ zqNKnoWp9BEhxjqtMK!;#Q%MkUA_xl6<gg_bFEZZBLq2>LN|5U$(nVm|f~pKwN3{5> zXe84D0cZ*(nsz|d2kI0;JL#IPn%UP_6s<3RH8UsvG;=kN1q``8vvbX|b3oT_y0_qN z@ios~bDqb&H_;oM+t4i?<KvAx=vY^!;kgM5D#lCF@v+DVkuYEzU>Sae0w}FgpJQtu z8KD}D4vmtG<4K1Nx>bHq51$84czmRF*U9DQP<pPTyc(7e8*c|)X5e$IB#e(MBa0~$ zfWc*q55YLu{Umb50P*&Ow#clPX;MaI=^|zZ!tWPxi%f0TGNp;X_+88peT^hq@t({q z;?9w1!Z6>|AJpHnv@ibfSJdTRD_&{a%|yk|C;n<hClT5ZlKqUUy>X73bD=QZ+q?Z^ zKivHE`~5@^QC~EeZY^<CXv+06CJ9G~D;P+~1gKBIoQqMMT;4%8AjAy5`OxoWv`qNY zLxyoSzF-*Xq1YvL;@=k3OR?dMVJyVY8pf+GhDQrmChvJJ{_eP_rM>{{a&g%I$RqyY zi#Ys3>UEDk`md=jZTvVyG(F;=NFM`f{n-+BK(9cFCrHA^EawWV-Nm0zPb2Z&+{#q3 zXl!m;4?JLvX?<elcXE@HgL=Skxcfh*yQZgCAmtvTyEZqCVsUEajfOv<4^B?z+`S7Y zHfS}{f`S=NW<ig_BO9bO4HlXCajuKiEJhGj!l0r?KB9u?zZj~|E)UFM48+_3LJfG1 zcf7L5!;$GyB2k(iL88q1@q6WSb+6d7S^o*4#}H2NC#c^749^zoNjQ%%9>t)C@eShS zV+=u4&;m(}j}*vOpgDpuW`$r7D=D<Ke9Bxrt*rS2%e3${DB53dpAJbZ0{K~{X}NKi z=-6;i4B}|3_ycyteWQp4K3t$j$zZd}4%6%??L8s5!`e^>e=FB1c;A3c&hmz;gWuS% zr&)(KM%cU@)qwm?elFel9C-)g<9UqXyslb^!%9BPL<K=6jRAyRV>%DTEQ$n7LtH_E z>`WGMmK=)$C3g9Hmt)hhhn@zpXIsY855=ZiF$_gZGAcfs{_uy>ne;D!j|aB+g><I* zPp;I|Yg7c>z_fT3yfW1TF`d98VoiX^54x``&^IkmSgkPIfO?9Aw$(E3sgw`*ZFI!G zy>A%?G|u}a(+ty!L~9hjK!dhHM~JeBFXRap!?07HAD(j*^8nq9(8pNt5!hFt1T2a< z4&Evn@NTcMTV{<)KrSE}(Ry7jf_Qh;wo!ctzggmUm8;4dU{m@O+5i(U815761k{#F zOHCI66LH)w-%aNXa@b31O#&pYOD-K-x=!GlLF5if<g=P2Fr_O{)(5lYl?rZvW7fB0 zLt1~oHUw!^HYxIR<-(*Ya=CdC8tUy$Xk&w#=ATu4<N5r!Pj1y&KZ4f7?y9$UC?w`{ zIiXG#%5#X)l*Bs_?W+f$aOjoqsEO!DA{t^GWo_}hJwxH}5aeNcW(*l25S??hyf88v z2!#i-{$2#Vr_dO&Sl`t7MRNf#j~TFFE}oz2BP|{O-0RN{ghPSRk%clW^#oF1jAis# zw)vh&xVNXLHyqiCrPDE!{3Fq~LDHkEfPQFKELfbqQhBvfMgOu2OZJ-V9c;-{0zKnQ zWArHcG4D%|>Wi;q4`_ld9PC#qA{lIzFzh_&9s9$9WHQ=caCJO|{%A5eaMHDd^w3CV zY<_+$J3N|w*hoIf45rlpu<%zP!*d!bvK@tyI+CWm&_}P}p&yF(QHs$%%{WMh7w@<+ z@~-D@wA_SS2Lx-hKGk6dQU_*}+9o*GBmD<qHT+Xwcn}*o-FuQdgO74M2h(Sdv6j_F zYEX#+$8j(ST2A-&S}1LQuZ`1a4!BqiF=1nuKpE2Qgwv|E))DGTbK8s4k~ky8#Mmi7 z^NtA`j`&vx<4DXS{w<VXy9ln<Xvj9J)aD>0Gk8k`t1Z;WNm_2paPk6uuqw>v;b)hG z`PrpEz7xpz&iK{%8F&}q<&Eqg2_ySQ@X*4*+(4Qc!F_1sePKvCl4aQKAjXLTZ_I;R zig{2I2K-wO-E!$ZAGj|>VqMLW!!TA`S9b%Xxmw)&#cOB9`NuxL@x|YBl`sG5Q)m9g zPHo`+^}(xy-}t3Zx+;{9`G4<yP<iqgs_(>mCxGu(0nO}*O#yAPIq-uRn+hbSNCf~* z5&5#hDJ}qn2wWII|G6O{s;<caF$;$AXc5ibN#Hx4C_V~$tRbr3)b(!yyc9SUa54id zFd%@Mb$ZgWp7TEO!V9MPO-m{hFl<bF;CAvaUPKMqJ{Xmw9M-5xj?hvfnS$R`Ifn`p ztE4jLl;$K03Y8=4MK$5_@NS{(dds|yS_y6j$7rBOF#fn`ebIZ{7x5&4QoBxrkWx8y zf<+Y;3H8K!<tX0+R|QTF+)164;ck%?XjoR`XeFpvIaUM%<IwFQN|$%6Ai0GuopsSL z)8NTRW7Xa5t~iEHa+zb`a?cRPCQ|=d4$@x>k)K$jnyN-JIX*r)IX<4m$340cTkGjr z1D+p#ji$Y37>-+>Q5`7CAq<Dl&CP3n*xWDXa;ao8mCF^|NB81!yd)bNF-Bt9e^wg< zT@$>9wq(o?<}X1QzC;_vZPf6T1~%IL(mp!YL++fjFpi^`ad%=I$;wjZ4I%liuRV@P zCb{7w*0>CrBb=6;yUIn<>{8w-LHE`ycltFLvIuO^_4g%eBtfB1gKx+V&l)tXh}y#~ zqDnJ^e{v?<NWMXaI+joj{%LX$o};*ves*XJXC97YCRSXy?=}}1=9Bq8A0fu_f)A(> zkvF@{MxFq_o${Y6iTv2(V|h_J=O5gjm^gV-qC%n?u^;qVmhVA3Vqdx9_AAW~Kl}2- zLl&VUe1Sq@HGxew5x_x6nD7D>icm1U$%RxqJOpKRqa^l>=6<;>ek9)90oFf=H$NN} z*KrMklA~>Zgd-%Liif!ESnJ790r<&W1eb~65E-KPiHO3rMf`(J0;UCJJBhIk63LHK zlNkUuagbyM5)wEJ6}`b+JiQaYFdT`%sZC1+qrv`EEV>@`r{jKqHaid+LZ;ZzT(mFR z-!q|S1O9Zc4`KC_B1Dh)!r_oF6clt5{L;viO?2)3Uke3;k#xWpR7ceiRGiae@mL}k z?+qXmQ!tngh`?x24a8ytblr&e`qXWDB8(JDWGG8FMSN`3D{(3GX>}z)IbgC00e-vC zGFz(T5;h`O*M<Eg)-<;N+`*zOHk$t~zPI<m2eG2Dz2~`CG(X5Pwz_&A@5*33y95gD z35vuEdk`lMN19B$(s`J?OhRj4hJ#5TC-Nj(1q4fgO(rDy#!-(zwqc54k{vgVJ01h# zxbk1rT#C!rFCGx0-<Q2#_!fPt5klbMP<%#cupDk)9v)g;TwPsU92#yPHNqf!!}!p4 zxOIf{S?@2xcBw-UyXXD*oCkqxM<SnyMEA1U`Lp-Vmk>s5Z+&55WO#UFVPU;}^nUMK zf7JWdi{4*cI|@tGFt;cYyrlP_eSs}Gr~zLh$M$s~8l=(5i9N_lWoS~i)Wbsy>2NIL z;HIcunwwQcvH5Lr;tKOu+1Mr)hMrO^w%sFYHa@V0G~fZTc<1?rz4k)VJ~FaBXR#E; zN<BT>F=ws*kE$Ym4zhv;ch!VWpJ*I8_n51J@fw{Ik_F{Xe;9WBy)6X;b&4XN92`hZ zWJZR4zTuI~gqUa_d+!iG7atv&n>}-8c5Y-ez7n6Fxo}}-I=<3A^8QY^B}g<N>Q`5; zD4$Yl%C9P4Qho>ZtjPHG%z&X*V8G-Sb%fTI%;~Tt+on8DsoGRqGDab~%{?O?1WJoE z@Q&L$PzvB<DG~-_BLFrU%gR^p7B7<qKx8V@emmG+Vql1&!Bu(a?7;cCKiyo*XnnqP zyjRWi_V%WG;=O%YKg|Rf{`P5^HA{wfBRX9j)pqhuY%`GVxt_eydCIQ>qlXAC{%l`w zyeExUW*{_6^Q(3=@4G<%b3nvCap)Siv;rHp+|R^~HM}9HC9;ulFp<b+6X2@!!4&dr z$EX;p^x6wf5IN!^ay=Kc9d9w)*XkXo^giaTVo?N6AJoCL(Q6YhVaz79AiZx}>u6RI z0x(%s%dK(Ez2fcx8zet!05?)Dd(wxl0H>W6<Jw^(VZVZb!uSvt1yGPouz+Edmaag4 ztJ!L|+&bS!5DL@$(`h)g!hd>6h$ZaAKR5@@<$61>PW$MZuJ7UdylMXX^Y`C>9^TLQ zy!N&CU^nROovY5AY%t7IEDq8_!D<C*pvX{<a=xdZ(`{9;^}`oxHBr~MA<>2Tebt1d z&l6|sX#C>W0@J%a09A$x83lMG<^@P+4%&+1iO@mby<Twclj?QIwz~#46@~>B>|Dm6 ze_=t(VbFi`2{?J-E9$fbsr*&<7x+y(cfSMjpTSIqIPOeluzf^QYI<tQePrH!;t6n` z)>qxLdH45s$TIAcqR*gT%v(1Rx^5ph+SM;fE&6%%FhK+uxmAi<h?GDeN5HIrgIc9a ztj{D)a+Mb~2OUgG1jO>6Oc`uRbq*g;N6*myM=T4`Rp;iOv8+7pf34lF_L10ke*G}G zXu1ne@6f*HysdF!Q_up!i5Amx)E3fa=Kvrf7Lh>+M;UqBW-O}JG(>~tdriD~&(sA3 zZB6*eklbvWg>i7cZtf%4@Gd~81BS?pt5fHJn1G3LE>R(AAN;vkoPomv&Opl2mi|Mu zE7OUpkWdp0BL)qGC4ET5XR~y!&Re)@5DeS!II|23ADh1{TYxaIhucduP!KU!`!U<| zkTPv37ZJ<xRj_ccVgw-%tzZd-Xf#{E4wD*M@M1nGg~(efM8}XI6_NFfd`j>otQ{m1 zCz|?L9pDZ~s{kDWQ_CwX`yds1&dQ~unmISsKMm#ZR3fA$HM@qY*8RSKKO7w;DY9rF zGvs9PuDgnp2#qAFa5y=N#j5TV2wSTpgu;LAYvnILY}DQu+uMsi9tl;OJBK^X#?5dj z93A+I)<8n<=1on_;-ktf&8I#xgX@D>Lms*3djK4C7(S4g07j_K{2aMU#!S2ut0;6j z<xt)yWl$?yWR{Xm7XEqN@`~_3h5x4TZ9g#iAi_7$zy|W_?mw#^j4FELKlb+YXZ6I} zEr3ho<u+Q%-0EmE;my39*O0bhkO2lEnj)Ch9RY!AwpB%5V5>&Lt?!#&X$DEstZEhR zB>>)S1PAi|_&D|PZI#!SxPY#xbe89RBXFdryzh0ECgTRR=RNuLt|%9%g?Y3tkLiy8 zKpss5X~F^yBtFS@4J(8I<*u3)ijH~}6Ao5m%^h(ipGv7qi&w&7yUnJzk8Eg-;hBl5 zqGJI4&AL8Wn7gvL1g_<vc!C52nU@SC&pFyxY+=TdQ195J$SPgNEX$MM3Fq$)hC2Fe zum6Eq?16rvB?i=i{&2Wo_YEX8(b0MD8tC7N#_sJOpkET9P=fBpcya$Rk52HB1r9mV ze*_@`p#I!y@mQpxc0W-fmS#iW-fK2?3@J^JTTizL>pA1v!L?nm;;lQ5lus5lCzVf< zS8|yxA1Sd$;=vlN_^r+t)($7qLED0g0eN%7fqmCn=cM=3t6Rol<p5!8yXwLKw+(=Z zuT{tJ*6SU`(N&5pZ`wp`F#NaZ6w=WE3|rvHt5J~*bikzMf%&VVR<$5`hN`BjiyO^- z0(l8XkoY!V!180_ot9&p8iv+~EI>j``xKF=4*}>IE{HhCD5V1k%mSqW(QkyWVV%%O ze@In6l&&{+wW0LrXgW2X$}cTW3?Uun(JP_`wHR3Co4Awi8y8}HNZU0!Pn|Z}=+{21 zJJ7$iHR4!aLiwVTs|I<uLd&cJm;S~r9rzrolU{n_|J0H!W_s_Y_<8Xw?@P$DR_Keo z*tV?uUI>u@C>VU>Yr>&tn_qeppL%&9$~iU8{N-iTgq0y=mjst(x0ArfaA!bvLW*x# z>HzJ)S_OX1An?Erji}I{k!2(QsF=G%m)3h86xM@1w&itH`yS}kT~lu|;ks*z?;$4v zjzMwq4^@LShDO!vomQ8xYdWu$H%ho?dL^agocu(jttYqA9N;gPFTzN;k_4xfrKLAm zoGfBhZZ!msu0U{#zMX>I_cwN$zY`J5pjTc<`Ohxvw%3_Nbi_<Kq{))%fv&(zicPcG zktew$J@<d%r1p~6q_KAEN%1bFWx;LN71~csg4V`**|mQ0=H4EZr2Ds7b)lI^9!%e3 z{k-vV>+S;(%i!p+4|w_g{i^Bdk(rqhxxL-$-_?2o&jE$B=oZ4xuDXo(w0^>9GY5Nn zNxs3Z7Pe3z>ugf`lkOh`h$~Ve8WZ@1KYO5y;2r6Tg6sxP_x2Q(aVF_^M!-EvYaSvC zNftn}27<9-Fa&c0aP+V}pkhh#0aSM9?3@sDvv*qe%r7G!!{GA#J=XNlpb&#Y)5N#r z<K^YcmzT@&JdS(MPUd^Q-;<v_+nayG_haL^`T5*9$zBNF8o-~mmPIdVPAQH7sXs}; zz$_o>*EgM9rqmIfvUJl211ZmK<bqm;4<mjSMh%p+d0<%wroFRc*J|d@4t0)YHgBR+ zG#rbXj(96p7~aObs~Y$;49^w*!7>bI-IVnt-Typ$17bo-+e^?K1tO}zEpeZr0whs! zj|t-lU`n}fT?d^n>fi^fLNWMb$z4tEq@9vML<wa}q)@CibKj;tZ!9{h^9J>kascW_ znUjyAUt#4-NZdkh4OwZ80Hbi~ru30h^aiSeey}a8>V9zz+>(Ks)C~(AV_3KeU&E-< zx7y(TQi!H-`-buX0**RMCPjo=VVfis6=AZgQf?J#Ij^%}jEDDIRFcsy8-pfmgk~zF zS98lk0=cAj43K>S+D_tO*)|$#bF0<G@P%H#jKmZ3yqz+z?4i9jb+2Viow+-c*_r1p zexh<{U6<t$uN;R=1q$FkHCN0fVLA1%xcly}+}(d!RW3Jw`m2|J`ZA=BhHb-Yh8}MB zM-WdgkS*+%z&ee^J4AF<F3WN>Rz9Y(AyWLw+%TAPBx!^AB?R^D-4B1|VSHEcUd6U= zDW44@w;JU-JA(}lwb*N819U!I+BL`St%ELt1{$BAiS)=jf`M1aN1{oj#f8__XygqK zZ`})0lzF3nuPTD%wJEIXUW-eBafO)#((A$&3R02^!lWP)9Q{IR(mWZ1DaJ?zL)5T- zb6{%V^Iy=X^e+<+TVpZ_TYT{WsewT?zV*rUV(OzGO)aKB`7K<jdcJjL+PrW~v_@I6 zjzCk#5(y&6vqX9q&yHVEyo7GcyHYm1D}BxTOWpfR8xos0y&mm5-c`S2T}8Yu!yuy& z+Ir_^Tkb-5JzoJ|mah~*F6KyCj!wprLPMy6&Lvv6{V!@zOW|wVHU44@y?rI;-Al}Q zCw&7DJEMSBuh^bpXt%ab)6g<#-0-c+GeVH~qGB#@{lmc4kPyLXVBL>6r_vdYXwgY5 zBaRS#HG?(7k(c8d9n%5>JE0=Bj%FZJ_TGhALGN(?7AF_S*Zs@52tyTvT(tc?$@Ren zhd(Y9=H><m=jI9pM?f%^DJH^!{%j_hiuDgBdwN77F@%(^n)fC>m5lcc=)+^#SP*I_ zD4x`acrKMfoOo3P!b#)oJ$*g|Db@8=N1%b2G?VwP>Usb*h-@up`+N25=;%b)uMG{A zRtl3kvW;S*wQhosdbv~@9z$K|{fG{OcpGh=f#Nj-z5}d%lEQUIDkEiTS=d=XDaai} zUBO(fR0LBWwy1!UBQ?89Uw3c11~2a35?!(!3Y&=Vme!aLs%;BG*Ln~zNcgx8JW>Y^ zf$jvAf*#FL?hqO4s>djpyN{`FPJ6vY=BY}z;tx0;qM^fk|7_2!p`V!M5Y*lax^H|X zIPi%h^#IM+y+?g3WrjS6y5%}V>^7MpfvqBQhm*VVoId7*LKMV}^#JAJ4ZpP~7S(*c zF)cNcOmy$ZC!rV8^@)kWv*vi{@fb2zMn$Bjuh<KDUPs?uIIYgW6=a&nd_joRjU=Ck z+6F2bt~$b%xlRlxhU`Xw^>QwSm@j&EVqhSZiutDl(d<AUC8q9M*27D8=(^p#5q3T_ zk2s^biL6d0%;8KVDexfjX~X&>G!LZH*%n;r4hJw_M0hPonk83;9YaM|SP-CTOG|SR zqiPbRb|NSsMfLt?M@tk9dky}4UYLY6?J2N85CEZet82X-I|=`7wR|!-nAddue*fAS zsr{hRgo9&XIv7di;?R;0-kVk7yn0G^nlmBFRiC5S2UF2ZR1*-93<e^;>@I>zcjAXh zcpabCo2a@(l<08~?LZcU7zkG&vn_t<-me`QU#c|Ur45K)nCrXaB1qGA$oKY9N5U}E zMJ$tuo3W_fU4ZeGx9=e-=-&4X)2?Cq$-TU-tJf;NN8gMIcS>)L1pb%sHyH+r?s9R_ zGCV8bS8^I05_Te$DUCkl-qdSS@D^f8IL$Wlgv-+ga}DbhjQ*uT4MJUS0O@tZo?&e) zl@h&(#sV)@j&UJ|<06$B)5x<~ZnUrziaFA=uy$g9+w_#)pDnrp$&1;3onBsb4U{`v z^IsP11OO#ywS*uv-cblpcR+i9U%EH&{~y@#u8ZV*aSHSxTt18qN%#b3=yLI7_{oGu zLr+yQ*E5x;GKISf-C^jxy}kcnn*VU&-g`j}w_#`t8C~x?wH6e^4-1L3okqU_TA+ZT zFr<(?6(={<?CJ`*KFSIQs}k^o@SQplL+|Pk2M+WP5BC=1<C{X<p~pgTZC4k=nNaEu zJ!pnvfuZPyXsLT6Y<<E=#z#xZp_I9$ia{-^mnJe=I6Yj@uO<TFo_Hh_-%5pgv^Yf1 z-g!EMHuCVxNHq>^M$nEw&dmsy2($|=fw-+p1D@0MM}G?DoIhpiUF*1S@*R)sdJSm$ zXdU4GO@R~~%7-STOA%2TE_RJ_Jf-q4T?dG`yUb3=Ts^fo+7DeRF(0oLZMUl*q#wkd zw+hGlfzh~QTm)Q%KPL;4boXU=BiRBZnkNI3XDqt+Lq|7sz`Y5H-`%IfJyRnTL7G4W zGSvX<Ss+ejnk3{>CWvr$auuukBL*@B5Q<D^jJN9hFfF=BCPmc;rCpJBu`3jTIK?vq z$;>3Zf})}A==b2MHN4~f(nM*kqff_AYYSpmAPr(V1d&#InQI^Ey9XtFyH@6=e#6H1 z2u*+f)DjuanUp77%QCg{3D-`p&~^sVheblmxchzgz}<JP>jC0Q3ErG?aAaP>uc7-I zUQ8egO6cTzR_oPj*P1}0L9)psWv!o9md_z>2;w-JDIo}QqQDFxAUwGiJG27B{T`S# zPf2?y(N2DNxPK};M=NUA3JQgORwo9B(A#*1o=s@O0~0E}5cT%1RqP4Wy_b9tkU(Y$ z-X41&^19_tt}F4{=oM%asB^lZFOp;sPu^_QYDelpT9H#mi&D(UQ2xLu=rI5vy71(> zob9RhT)d@Re5+R~(!EYq!>HG*Uf~F;*3m~((AAz+x0bU9`BG81Zm^Mr`XF68xrW=@ z?s#tN`nF3R!MCkz$Jy>c>WBIv4I@27eHc~*(~Z9iX>=UYupwm}dQp?S9mpU8;Dvsw zz@9CcmS?CQ?B@cREEsTven%}cSt0X1Q}%M0+6yZ<Iky&i-~73&TXX*%{^z#dH@6l( zADnD{ee3GE`MK=eWY7w&i6>fT=fi7<_+jhn`}mi+<`>V0)^XPbTsk*@ksrom^hWW- zT8IkB;<Z<|I&e2hU!gJV4vk5&N0A{69UbV&{R<eo4ig!C*DR}hr{XubvORZfF6U8) zt~3Q^1bJVEy5f$SzI@NxJ<HuG31PXnVEj}M&4zNj(-BZ9quAB#YWCzdSKXI(Up4FQ zEl0`)>(jl@CG7w`B)Co9s!&~=T!rm@q;rCbarZij8BXZ{+g!t+e(jomWc<l<{<OM4 z;)sd>3i2d;Jh>Ja)w-12cAZTI?!gD$@bbzh_=5xhKv<zloLs)a?>-&u>Rdr8-;0aK zNc(WgNC5qYirG~lW5~5nE*y)KZGYgMx0H7VgWUliKEdVk1LjjtnJVDV=>yWE4Ji}A z9>8`5C?jBFNQ)B_ajZC##I@_q$EJ3$)#6||q{A2g?@)5?>YOz`vATL;d;QEfspQAc ztZzSh@nZUaGwCDVgIpUHDD8!}WAl&B{mbN^$al)8)U~zOlv!&{=9X{wKGHE?;H!N~ zZ?z$o6>%>Kw5QPi!iE<zP<3^WNdJyHz|HKGI`Fzr#>m73s4Y<_E&sQ(_z$I1VQ9*C zbQk;6ekpHc#%_ZE(E0{U-CbvRZ{%6zGfr(_891bvWEbIJotD*jLMYzh148i*PG|dH z0(X!X4`U5KCN6|!-6qZUHoCW+B+fh?d(=#*6FcjHSO?w5A=&ErO@vNi`k#gXCtXPV z9ap5(5<8!=Heb8p%96qm^11Tm8`9>>i{Ix@ts~{S$rnSwFRUAe*6rje{*-v#BY`v9 zBc|E=z$sY97EgXC^kfd;v-xpde^7%!$y=9G<y$@n(L>dGavdmfAIwd=W0-3%n4naS z$TKly-N(pB5zEnN()2>$AOnPmlZ&?}!Vf+anlR6%lAEVhLXZB~k432-A9!$R=)n)@ z`e6sYEhv{>qDC&<P;H3caiB&<d!vy8<wW6Dy9|}t3PNDI0A)b2X5w#57~OkMsnuLC zg2A2(T^c@1`Ftp$X^Buizl4mYo$JRUNqhj;U9=dh>{vlfpou7_Ber=M8_U)aUk;lI zni#m^;{J*vx=14qU0n<+$@!qFrl)ysi%*mdwi}2i4Rilk(>%@YfZNmQLxLVBv<#pL zvZxdJV$&>y-a!A|M*zn8dh}!O1H|yIv!5pw>r}Xr%!y=Fvg|<b2tn9!-u1jXxo#Z+ zI(FLm9ot9UE3J4#bx=~PV|gVz+cAsm8>h|47GFbZ4<IEt<;c`TBr7?&`rD5b2g!_P zuz1nbA4wvUVNdensp1gaN{;~JZ{N^w;C4K;+li|n@;e1@5Z3}hD)ZIQGIk-1)=JaE zmE5+b$(UN(-FwmA9$y}wE^W)8T{OwOcoTI2CLm`=N5;tHkt^dOw;`Bdu|yuztc$>u z>aslEu1j}{{q(w=N-Kj`n1oFU{Qk;Iko=uIT<^LPTv-WTDa6h{_~7|ip=+nq(~Fvh z42Q9^XJhLfICNgQaN6i3ST;nc6JgQ88nf0HQX|Og3DM9G;7#Gp(?uNU^2X`J+PUE{ zF}@uXO?G-y8=LG}ZNVZGdPnrmyq2VcLoX>cV^mTp3@GquooS({i$8%v6FEiFJ-3v) zB!_Mt!ME%ucnW07XiJ1gDXtRFA=nQ&icid;lgFg0U*lFo=fAbSIb%XCD77s+-P>tX z&y1wgq1RO<nd+pDwK`z;(bGoCN6xu$siGkvwOp{cPK%q=*5VRIi~M>aFEDu!N&T`S z9|_U*{3ISaxkcbIM5u2}9UJb8MEp@Gf#a|R%JgPqeZA4K1o8~PXSUB!N1fkurBEaq zL~N8mBpjgMyEpu7#OK3ZBAAHu_h*Xn9{A-3e3V4e???90Pz1mGqu$?PC!q%CgV+Va z!3dANfdZ<q0iY~f?X^?RZ^uDaNoNX^)6<g$1Z!;_)n^LwyfD)~0*rX^#l&fSo`kU` z{F9*W?84M9JaJF|qmTCA^TfhJ_dYnU-TlPU;<dZA#~$k}8y1+SK_}7XOv7|1%dde& z*LTdF)5!5X^LeB|1Z^jI3YB;Y$}h|_zr|C~Y+qT;9bqlpdDY2c$Z1EjvU9zfehC>N zA}P5+#8i@6!f5SefUHjS_(N96-!r9Yb^6w{?%iw00)ZIBmi0Q-$2+#C@*KVvwZ%M# zOHFm>IV{)m)ugyD6fNcy(suW{YYYoY{5suC58?P|9Z8neRWF2Sgn&S-Sl#-`6&Q8x z9j{2Kqi;x-)pebO<)dS#++}>+a=WjLh+*x>**eGM)b=J3PHq9#jH_L!7yHdYBlzaZ zm3x-EHdyTa0~D@b_yYB_&m+4d8^lw3+DG!L0H~8LNZ+p41qqHs7gAeP>-7T&A!<~v z7Y0w2fynkcjRtQ8u~C<n|Llc8J~%ZMm<ZglR4U=PG_};dGS|MFNZ24Szx$DA5{YL% zLUkfr=sM4R^5vaD?7>at&eM7%NvH=5CNsQj(|hvy$q)jj!G_%4-FC0)UPIIHHEJB) zN#D~ne6=0^>IQxQf#>bdQ~6>fDF=s6iMzUj&@+!ccJ}=FvvS+LTDEQP?$ZC!@hqIy zXA*X~$GWgK`r9||xo6|;-7&|vpL^4ro&!GLIRZzg^HptoGbzYAc~GkUr(Z{M0cY2} z_0{0#%(2ktOaqMt+%y0;H9%05y}Br(J#08&0+dBeEf_A-aV||40_5N&-YlMd1m90S z{q$eZUOe0Ui=cS+1FF)*NQ#<xRy=Dz{j|+{@oWw8nNSYF=h1R-870Av2hlGfT}LP= z98<_i$JsDYOs|S>JS!f-_w3V8*J=N(xcICHet=68yEkr#8j2HC9_?|&<?ZhtU}PCT zK;uh!*$j#-DPtP3s}E69>0?f6<aG;70bGGP)RBcP`na&)7(+I;mKPe#tq4)z1LT<K zA1044N)6{kxseWQ4Zgur+&a`z2WgRfntT8j66{vKDSW(SK+sIoARHP-mn$0^mE}>W zygkR?H$x`GxKsM&jWgp-Yy8Z{<wo0KzI|lt*P`;yM|JpY<tNVm;xC?^0L71w#2eH{ zF+|iS%&|rsMcYdYK}jJhg_{<UW-Xy<3bDwRz-EDaC<byxDWxX=E!+a;jB+rgTP|D_ z#`Is62V-|U79JSLSB6Wy$eWJf3=3C<I@DY0&6v%1i9f6l7D&<(`;q5JtPzjhsdh#+ z{g{6$w0yUbP6>5p0QQKuDI6-?DbfR(p27k0f04jLPd(iHbc5a=T!jIfi>s-9^Bj+r zo575A8pbzcZuYU&!Xn5cCalS{o~=2vWKv!DchS+2lHe77A^iXJ8ZXw3USZ5bl8Xw6 zL_F>n;d5c}wp##x*j&G5GK-pk76_gh4}LL{ut2#aBHuLn27*+pXjJo$X=A?6eW|bS zOVs}o_fh=@VX^M^yUg{*)fo>FsG^&tB`@3o5n{&aT0OuHGidi{HZw6Xw>^K=oB=bx zFJ9ezr*ON^u*qL$f;v~5fYpP#bm=$3+QfvpFUk>cTn-MffdeQqrSx=GvWOGO73io% zFvKFcbb*{QHsA`!dr_2L8aa~rgY;AO#h%?+H43jyRZ|s7@xdostKz#SPX(V~IXGI^ zxw(t7u2^o+m9$|xw}IJL<9u^j@IFM{rL)qwd1(s)fSC9zuS!Y4@`8}DksuL}V+`+D z7zi;p6)N)6sqBvz&-W#UI7<-b^-!YkJd$$Lfno6F$V>e$&cECzj=m9N;cu<u6kUP+ znUGHt%6}r?DR?!~{9(1G1_Md4BLMW=vIBrWHdI*luz3g&*=mu=9${1wt(y3DR{If| zs~Oi}0e$RZwF-TYO|}=%bJU<C#J5I-t|h|YgO6W^%lS19n<49sF{$Hd3y}rLzmjxx z;JZ;>LSw+IZvBol#x;!uZB8jC0`wf$9PdVzX<pNQ&19odJ_4Gp0VUI~J0|746*q7T z?lB0=Em?Joo;2jKgTUpP*@Ol|!hIb}7S&nCvVc5Vb}3c5U0v#RzK+-pXj1zZh9DxQ zF+kKtRFS`OgRR(?HAg+sr7~_fa}G{*>#}yVqn<R)Z`b6N8jY7lLxJI9JP}ZQaAbQ1 zK3d?ElZcmyG#N-Tg(Z5`iMCh#=95pR%``mEZR`%(hfh8!Hs19veOlj7r}wdIAHC~c z^zK_t<S_Y~_$=%fz_SwHVA7BQ#_(6%@<R}@I8M_AFo?fwpI>}LsL0}#%`9Df<txu# z{F)CzGHMVbAeA(p#<fig*Di|dxHh@6a%N-cj{ZdMnRl!HXPckkYpZ9@l<!FNkH6>L zs_!QhhM#`}FL+vqvWU72zb8>#L6=fJNEa%CK!a2T7?`5%bWD{AWmoAQswrh;6Q$9q z%F5hKBsw_qIsJ2^Q!ADE>1bqd<g2P!NG}@T(?&-Zl1BRw*Ts`(M<ZdxX<ja^Kc0E~ z>_|8Q1?}?GnV<Fte#gQOTbnbp(e+^a5ZBRfKE*&Dm3JbKN*;L~DBipjh4LyHqQ#Ly z;y7j=98~~<1|MBO+CK<QQR(!pXkTyNxx_$n*&i_TndOC7_MVIO#kF%OqdzI8O6Pme zRnGMG;rnLb))CCbU!7L{=X$U74@?GvhrJ_{o4xD3b86s@-d7D3Cg(1dml9`to1gx# ze(_HM-@B*AzN(FmOt|Yj!TPMS2o3Xw#4U*W%~}WSF!P{x!cN^J^#jF_m-h84hjQW6 z6zs4CTCjo;Ch(q9zy#1AAsEl04eH0HjZm<$ME%I`&aE~K1^703qg)FmjmVzsfG>zI z@EwPYMvk_WSfckxWx^WrEfvP46;+Wki-nm_POYl)SjslOXO4kH+D_m*o)|kkv#>CX zSn6|6uHGXL#nAA=!kJxNf7*NB)4VR<UR^?-prGi>)9T_a!t7d?&YD1^Ks3Vb)un(y zL?EeQQ%s|Z5$)bF&2Q@Z%B#^SuQv6)Zgtr)`HmGb25{*F1?%o0Abu7x8sQ;v$|zB7 z$ZH-!{CN-P={P^7a*(9#<J*8z8eeB;%ZuGAYY_h2p$*T?cApiA@;j}b6vl}uZ<s0r z(@+Ph3#awnchGN^V@a{Fhm(Z`=SsKAxxe$h<K8DEkI)|9m#FKpY<(0bq8KWMPU+3M z<VxhWDy-{on6SE4bjQo-U~2FG_>_hI1he4C7qaL}rlJ`g7kP~ULWAgfRag%#S30Jj zT3LR`vWoqyD|dV6+ubXx{cm~`UfcOzDY24oly3)$C*f?D_lnnaeKGNVZlA8d6r2K~ zA$$>K=q2K66SN`l4J7SU6LtwdrEi}%MQFWOglBt5sZ0dpx{mN`mf3ZJZ--z?D|#dT z!BB4+77P8!2_id@mq35+80=1y56@|^3nNF!kukA0{gf=jJwBzzH}@=^=GDHl?*<9g zJ<9oP>Lqti<K@Lg(8ZlzGmo2=dP;>}Ak!1f^X=_!RoNk@scST^C4FpT9ZP~%xlECY zF<M|vX~1Z_u=pbMAV>mcLy=yWf02HoKGrV~rAEvj3&3Q+oILz1;C2t1uX4D%v7xFP z8@sd@g~_+ht?J2@mCLJhZ=Ea%b!FuN;oCfS^|kTdq?tiDz=5Gsv=9_AGgzvWN>vK} zL-BlQzdm~fu3GE)36aTMnO(nY5o=laRcmVz;Y-Ei6x%8@s`Uj^sYFjO?GN<`5ex>O z<xm>Tlhsw(&Jy^XS0LuTBhzm$heY|5mqALf77t21>I9;ScvxsLT0R2S?5xO9|0zbD zvxEv!qXs)Ibee962Ub>`4!FFslDv9u)7Sh*)VmZkV<K3HmWBqX1?EDjB<}AW?!99W zn^JG@j?kzBxXEr$ghRo_#k;sa#6*5QvbOfB*Nb>Oh4u>36Y{5nJ&9B**r$zBmwvHS zy5fBy!JRYiij8qEz`7Rv1?VS7y^*6fQ`>XdV<Md_jk)WAMcSkaEWa07d(3BW$0}D{ z6Aw{$j}XqliwJ984BGJi!rrd#Q_OsLZ|!)A;r#_|lCl>?X`pox#APGvKS-$x<j&2p z;}OJ#BrBkDiSVJr<5#5EjYMxv%Z-kvxltd*{;^99_5j~=?>KO8I5>6%xY<CCnCG$H zlQpv=0HS_o#OSzZL)OEF&B$pkRo$!jeVlAsR2q@03J(76d2?)LrtD3vRi2p{Gw1J) zMB?GlpfQjcO!QhLAE<L4uI1@GTuw(v5S&OpluGBPmsObaK!K^P_Voq=kBJ9TlSL5S zjFYgjgpFB)C`!o$#Yx~W4$LZ0SO=*1NRz6F{ey$%-f!@7ePkmLL$6+c`;n`BD$Bt7 z2U-@fM#u(%P%RndgAj%f3unBX5yf&MaFjB&knhu~HEzZ(f%#Aj<5KKq^H`v?Mgv(l z3|QtPu86LGqzL-Jjc^a?K4dgl%WRB8I|cyps|%oOU_pY?D{z*<hL2hsA1>tsM5hax zmlT155X>Wq3uTVRpemH@#oBYf*7v?A^zVJI`MgEHG!+ZcP8yaas)vU=JMy1AFYpnz zMfnQ^?z*`{A6~~BER)eN0zjlFoX{!9OsXh#3w>KNEK#f5R^2jcb*E1o=+hb`k9o9% zgh&`G&Si!8gQOOPfC*Vjcni&uFtvtZ9KI^5)eYm|RngDB%`jB-Y4f+%MK5-Z{>ZCE z&H9lzz7$8IYV~~#<<LBn{g(#kvkB?M-O3K;8JR(_<%k4mLZeGy+8j$3!YSk>BGXpW z^rOG=A_Y{3m3|09j6Cb>DMJaZJy7k8Qp)7fzJ!}hF41SrE_=bAvH^9TmmiO+?^dIa z%U!a!zrWYAc$*(9mFDM5r7<7PA$p~6zGG5kGTtcyBa7_70P=?-2B^{B+uL8K4Vv%7 zG9=jTgdc_-2sAh?5Q{bd)cFc6h1~I#BAxQY2h$Cvf+YeD*2LIjAPExqL(wVm`SsZ| z>x)DX@8$jenMKQ5Tv!lw{)unrLu~G!_WSc>gS@wRW_@;Hf$sbP>j~6|C7+pC8Yp)u zJh`62I0u&gU+Vh5jLy!SbBF7sn%ZJ=a>Lv}mKh#}`8n|e)>FDRFl$W!CKqp*ZlIIU zF-Q9I_Ul<kQXABBauR`+<{4Ukz<P3jdPFZYQ?QP9sprRLFrYl}i%7Gzu&}gcEuGYz z_sy=KkpMF8_c;LagTrW+7blivxcy1ve{x-&5k*hA^XjCEj&07)L_eeJpNY=QZn^;S zgU+Qap&UdQLR6d;U>lbTIk}#{ew$tTvAOj#Ce5X{W6n)uCN0g+|A1p3AkqqJCP+k< z`8o8{$@LT;yUj`eu^FF#+<}oZ?xg>L@e|jTBP_Equsf%^)U__B^GgiAapK?;?^DNm zMY*SuC5Q5UcdY#(Xh(CZ^<v$-*juC^q)@>IFYlIAhk{&l-_@cg@brHxdV&h^QWTwO zW@x_oTjf(**!wSuFq0Hti^zlxBnm=O3$!QOmNWx!Suw_xlxlG+Z%L8{ZERY<HAVt1 zGl4G<yR+wON810C_r`JWjgYCj{UYmy{BS4M%A=>PC@0hfsFXfO3I?@9AGBZgzk;z` zBn~?X2!|0XO-U>skSt0g0|F*OB+#%F;hB%{sxmk%eEDd_&twnAE^WL=tCTWXb#ZC? za{sPj>}JkpDNMYk=^+D#4*P~S7*$JCn-sr+{zZLcM7wutW#!!Eg?ZIKzq7OALsoHJ zM`m)sh}Iv`28K7MO6v1&oCegF`vtmelD)B)9>)qTr@f>Lh4KRgRiHg4?1F}%>H&5d zrB;u$y;w&q7;nfBQ_fa_Vi<2Xti`s^YQnBr#x2Dg&#FP4CjkE%?zSn?^=e|3dM+Ev zX~wnZcAmRtG#i>QoMWO3aqphIw*Ze{j*yrWd(I8Q@Z9W<i@1dxb20Kor07uju|Ne2 zx+%F1)+N!nAW2+IG{(lqKBJlR_pOB$F*{k*b>GtB-FH-0O2vV(zCbJ||9#@!xRr0z zKBMJy2wo;8*6v<H<lR#7?AfhYpfBhABlNSAvs5Mc2!Q^U5xk`a8H6peV{xckfQzIw zP?^wbIh!va3r(3g@K*P4!N5PAwQ4&%07XDuv*z`5-GN-SCbkjMVDDOox9m=BN9@5! zX2+y)sd|5FRO!<ZsPh0|27)#~6$hVSgPN8ZaKX0$BETGwBnCS;On@&VFiDrQ5F6s0 zsXun=1Nn`BVqj<z0<zaS$zx#ggwHF=!q~aCeZY~v3`{DcS|zocrtNOa8?S*?fMpLs z86cQKkI@G(%X}Hdlg=tR)WzFjft=LRh6)w2x&(9I1W6EYdTr>Nns^W8#u)nsUfKWG z!BA8AduTxF-Xxk<I6N^l9KUg})BKyC70p{B@(b~}D^s;FUqbM(f=x?-a<C@);NpS_ zfs(+ewIeW!oyd1Z<GYc+4K<C>-~R23|F;|C{S%>IqSpLU=zj{VuLpklmj@9y^*}ep znrxqe^`HtEp}3CYz#`s}&vvpi#Wajd4!r~UZM|w)+kfBh?5-hJ-@X?(_UuCqUt?#l z?!{M0Y7J%Zl{pBY$A(Y`9Jfe^U=@Y=B3|`)1i}4l_>Vq5G6F7QwE4$IskHmi8y^+F z@OTvQ{%iP;JU$BEVq~QG2fL+`f!{nhF$qZovL`!o6UjxZK>wKLWlVMiGc0bYmDQWh zE86coKX>`z;kl3Q!gjdi?~i^|Y&tb)SLx3A%eW)j?=J<iJ-Z(z5Mi88bL~OpO=w#l zI2igJY@B!=yjuldRwjNe56v1x4lAo^s$T^HKj_jj**sBGh=q{Hj|iNC4aZM`O9CFO zB-rMi7z5l-5_5R3o7IW2S0uv)MB@r4<MCwK(1Z8;{r3m6XL>Sc#!9hxJXRVzlj%8= zmDhEnO!tMgXsi%UzG7^GY(UsksQ>jsd3`_Bm$+_@j7^wi7*ZG;fxJwuj!hkVlc$8K zv8oDD*vMGHACD(YS*2SFzZS38dw<(7e!Cay7n<LQQEj82$X1JRl8I4bb0+ZG<sw{# zS$zi|c;fn3Y0{HLh7Zd*81YKE(SUuFVcQ2}d7)_<l8PGGvGWk^2}Ox&jRHn$wuY}= zt=ih2VN?wi-&%uY`2-=JvY7%WR|kYQqIpijbmT#*w92F);y%3{a@+|-?iShnvw?&r z65%jM8+Rj+OFE_1<}vb5_LLd|VuQ?pB)N#kjAjyMa~;&(k_l14<%>2u+^Tjv51s4y z@xbu3v5r0tLn1c@Xhab}9Oz%th>ocNPgvBnu#9T6*0AT220qO_#B0-=hrkb2tbz#F zZ6xP#U2i@Qe6q*J!BXZ&V;F<Aof|om@-GnngCTHnl|?pVDuV5k5QR3NKgz(&wDRCT zKa$Lf|2pU7s}i}_)gRrxulbtSm#vGbulx<rGtde?qTZKiUe7xjtQz*}<+>$a`AVx& zvGFVZ@pWZOgeN;?14Ltxe1O+EtP4^gz@`}_jX}6c_ZrM0AVQ#Pm}za4Dzj!ZVdo$; z6M=I(_iHu!9J**0G0khDilxRh*$RR;hkJYbdwUT4yBN1k8^%EcodxZIBH@!wvl<3z zEZ3Dhl^Z#br8@}P=gPXJZj|}2)p}i3_O>9r?!W(L@r2O(8_4ohC?Gr3#6<hZsx~a^ zees2bJErrSwRT|t_R(98Ji*UOdb^=2SexCvGRkT?TUq7B$kB@ySv{&kHpgnxJ$tWN z+q-E%UEcau4a35>ZdV&Lg7~jVS9Xa*39e+$8<1Io@{Xf`VloT3X<6g_`L8xZ*+VQg zt>Edu{0CN|`S$8lZ+zOt#Wvs}3~LZ%zIG}JB8HC;&NW}J!OGIY*7#He!&XCOPz$S8 zt=5g?C!<(>30EMWE$BY-MVMm>n+dlTdqL=#CM$4O1@MDz00ha|j4V1NbRusTj4Uuo zV|+l5^Z*WS>UvK^9~igldKmDeAoU9LXSbBFUh@*EqUNW&Op~7TV_xn^aHjwt-r%Z! zhu5enIoQ2f%Kd~}7=lr9OP3<OPM5Nq@U$mcBo>d`Pkd=W=o=o2XerlSV6Z<qJG&kZ zN2*bXC=CIdK~-r(Py6UtZbuO3h&gP`#9TiGp)HL;<Cu#_s}X=g^F$~<k^&R69BYV5 z^If+2q1$eA*W5*`%ptaf>@0W>-A=>Bi5b>5yz|YSc`w=cYP;v!M_)cRfAKzN9pygg z1B_EYfYV3<!;Qfh2J&YCDLKc~^?~<eiXp>lXgKpx3ivId7ziYbUjK6Be>H?f1S0v} zlKPjo-??k*t|{xT4?ocJVNs)jzURwZ24Y5IkUF_3+qtplfe+K1kz=D^&d7SryR`yL zO4&UUO_eJlPpwu9-sK2!;KI?+wGibZ5=H}jn5R}q!?KGxL|KaJxF_2DzD|phRjqc! zGJd|jSb>U%{)cb@1(v5osIbk3TMrRt6r~G>+lcE7%{gMGZ;a~Mp4AWS%|+6eE_shd zP1A;c(t2xBSgixJmGBkeLt1xeNU+WfAW;xS83L1ppOMDcyor9sIx1Hx?=wMQIeG@S zCw%Eu7$`XpG<J4s2E=*bnymWTS{-=EEhi`=Yw%*8g>MpwOdv@L83(#KLu!7|l^`oY zPJ@UB$q1#}3a}4w5HOMZek&2r897zOCJqx2&&jq(rcy8qmfI?7P`9kfU@W<oM25sj z|5~yqSSW;W-cK1+aUKg5>}*do+LM)A7Y1a%P_8DHGdb<#^`BJyMC-L0+&ln@R;?QN za<gw%`Qz!|AX70!!eq;VE-7N1);0ILWQUQh`8k&=V@j=^7slJiI?<#~jTuckk;*e1 z)@_wk&SYe<5!^)5XSdh`uVVCiYCX~4Zw2)=*eG1r{neB+po&-Rstw<Vj@}MMXaxud zZ-6K280!(z(mD0O@WJ1es05-*mmK+PrHC_J!)yW!J5@Pwz2<2@l$nGeYck#uoJv;a z(5vx{^KF?S)63m;z<7|ddAq%Wb&f_5W7r<W2G&n}oR%7VVi7#F=SdLyKE;LJ3U#7P zp@vpa->$;9sq@07a2i$1*wJt+Fa|Le)y`8P$G4gdoBo(_zuFp(H%?q>pV$WK;~ncH zbfK*pd67~U>B`+1(;;TkYH;XxO6yp%tCodVF}|^Y6UcuNWWBH5Q`B4Kim(nLkwET= zg99YiweXZx<qe*8X)Jo)k62te<pS_0)2}S^P|G7eNIoPhL|YXT9EKwh{I!7tI1L8W z;5~WyS4fykraXpOLV#eH&Ftz8;`x$sV{p<1fzfQtbovuyk*M2jx&{{?++V_@RqFAc z3F)A~5A}uO6S|)E(W_8z8sj?iI8<-M4NK;e*_^M46)EI<{cn%{)961o5Ay*_P<Ako zkjURnxTR^eo_%kN?n5pz2p(3Gs~}Y<Pgy?iE2$%YKjJI;^3AU=_Wo1vUx<3XX^o6v z*QnL-3eH#85OwrhXEgs+qOp-Z(YF!U^v(D==@F4>6+UA9E^k&bG-+l7$aAJ_fM3MN z-O{Q1Z5?Ahuh$`itQ&O@v9|lc34h!idNh{a?0FSXl2=ftjlc+u{3&Y2jDOR|CR%Ke z3Mc^$i4D4tkR<+DDV`5xGoFYV%d~`Z9k1z_vs76NRWoe2p7KDLkM_I1pvfOXl^?AY zX4JVnRoeo=RhN~e%nkIZ?hlWvt}CcIKD^)Ax5xP_)|1OP{+zIiP0aa-*(naR#YcQi z;X-WNaQ3!nAJy2X16!(#JZT?cHW*mP8$2&$?na_>%N5EcUrACw@oA%uk42k0)bw?@ z-PZ;FX-{*@xOFIyQ5Q$_jyy(z1{;(~r7SBhg$<p|c%zPwRj*&iT!5_sZM^Tk>0Y!* zzM=8_N8wHxgkPjxzSm~?ZslH-O<*Wtkt)EwbmBGol@;3Ujy&l;<!bA5{WY!6w^|pk zj<gR&?dnzB^p2}n@fDBX)(P3{V+?MmZ4WB1Q65!ZuUu1}RDM`_hw>9AxAr86X~PbW zO}okMBRN#9KD&)46d>95$7mnYQLXdT=sZ30D=;>p?ABM<o)cVsx#u*$Xg!j+a|m`} zM8^|hCs%qvHnEu``htXzD7rLODM<c6=v5#o42Bx*OhlBD$gs!t+3B;bR7BPz#7Bzy z1veeh1wJxxd44K(;r*>-MBjgeSWUM+4b=h+OI%9Xhybe)nPNeMRw-Y}f$jCJVuf5K zR#Mf>s<AL0Ok6i=XCDy_^N+Hx(;ogbWfr9zL;FTmvu_@R!TTZ|5kypeYOiVo->0Do z8dWCI;uf!u{Gk;V@e6qE;q67xxyW`7k{!Ra1OVSkFCZYk+1#^!TAXYCA5$NjiH!F) z|HC6^YsRIvP~fxc#y-(ji%%KG-r(Tgci(Z-Mgt{1LhU0B19GT|9Of5Vh)I?Uk!As_ zHna?As@vDN#@v(*76_l__xq<!b7io$HmMIF%6TRaahcm*gAnmHbYUedxZ1Ube`v5c zF*q2CkdPe3gGL~^LJjR7MK<^RrXK|(wFS&L$<h&dr&O##_&eA!OfeUnJ@Yg<(!fH= zYQ%jznzmNDxKRwqV6K|E12ZC~JE&pEZHsrVRyO>A7`%;QaWE{wAPJ;eC9iaQ#m%FI z(d!J<^8odX5haRTb2BRCVdKQEApelbiKF{*vUvEVqYpQIb<NtDoh5rJe8^$w=`(YI zIf1B7b<@&7hBPeAFm_CK<`NTu;>N|&8dN{NIMGh+HWVr|6z>fN%!nK=z2YEIB9gPL zzKlk6^fl-JKL!?WqkdrzE^;-azhiwZ>PLF2FtOrvHp@Rj>--jE*fGG6W5Wg*hExvl z3f)>3L&`Q_km(|dL#sF_Hc5^L1q3Zwym@2%Ox(yv&JV`=-f59%d39<czat8<g*(`& zr+Ni9Ja*>;F-A1vzaJSIxp*b@ClNh|PDI?Rhbxn@c{T$v;8{B~@+ZIXT3%pjy`y=y zhVe^bj;)bwh`gXArHG76<aY%`f|SljjY*FioD$c(;bTt~Xx8Bo;YTQC(g>51H<iqV zYvEinRrj(t9p1#hc-JMPUh9e3x%u3qAEFszSyn6}EH@U<#K=fuaWOG6GNH9dcf75` z`1Gsmc4#+yNA|p7g#ao(Wen|8(7rK+Vonl-lJg)YGa*KRCFy&XE6bezi&k4+DjHRz zYLRVo@`o<Gc4Td2)<RusK;3nt+NjnH<0dCF-Fjr`%+L(nxdeb0f?mV6QKlUG8p@2Y zgo83it)XO^4y13dAh{4mmKQ75NU}k8fEI8v>r#P8(u}s{q_JQ|I6LbsCv_fSB;2f0 zgaM1qPS4%35JNg1R1H(dh91p8HaDW5KL4<37@BF2S&x{HO;+SO@(u2fq;dgSk)6?I zr2^v>QZYcBO3(-<LLCt@#C;GUdIGCsJ`%M`xiZ1APX=^j<piNY)Lg)L6&}l)7N+Pz z#;-sFR}c6N%}Ay4#re6}nY{n48Pd%~vTOY}u)op&9JbH(-}rRLgJO@^2?Ny_r<akY zuO0}#!7yHcso?MkVwlHrfw$l-(EercChYMhZ1JY%|D`b-=sb-fQ36Wl*4I@7V?uK2 zHRT=!5<#Zn-~lO3KcMiVSZ=L0qs0Up9W6%d0XLWso5IsQzAP&Wq3kzaZ$t(o^#4%e zQ@W<7(}l&Am8my?zqT^hu)UVCv9;+~3>2mcsgx#fOUuWMh&X@%3Ez+z?~l{}y@^k~ zO4mO-Q<%t(ghIs=-_?8%Y$T_r%||r%R`DO?(`H=Gafk0BnwHixhIHC6KeO72rCE#a zK;otV<OAxkwJkCvlhF1;m;taV>NjtK5I6SrENokVCIJt#fq6cLw>)bym=y&#N{bl8 zkZ|21peIDgF%B!MT_iV(GyyeUxl#$Ohp@a>jk+<WCA#GKZJaAFA=<0DRDQ*FBnE#} zJb|$(mF5a33wI<>u3)`~lx{Vf05D7Ps`PEWv~~tIcB1&gw}q|K!Q`1W=;yd?4YaMs z8SIpTo0J$ylF|tfUo@YBeZB=4h?|S@k7zPr`bD99Tu)Qpl9BYlT&n>6<8yN#Z<U~* z`M91Lp+qKWeg5By$@UL?n_DXx+gR3v)*7P6lq~^+rd*L_X%GRjo`qKu#TE*QXKjH2 zz0R?#4-mY%j(lnj+p?gL+GPU7PjtL$p>34=F30$bWeh-{taGO6J_CPqGDc-g3Ws5+ z>`3%Lgwm!Dt6QE-mLOSxdyOkZSkrf0jjv%eAmboqMN6FEN~K!iP^(Zhx*=QT9{o;r ztD|mp9QCq~9@<N34bzJdah8+C0E^yW#Z)A%Vh*@A_ucQrKXLz?%&J*!>^5IGb3UN$ zg#6=oeF?H*lXRKi`9%CX_lNMaDYkbT|KlD0kfsH4cWsiR64TyXUIY>wcqte1Fe-r! zNg$0*n8Y%IktSjrxmL=mWr^mNB@AISykcpr4@RTbfUx(bX?e9c^=egd?Qm?gsTVRd z$qzE+iI5~Mfke8TXmdC;aoLmwnp)T!@v^0YS;tgG&tfd`ky|Lc?Rp&&Q&Io<N(M8z zrYdz_N3g}RMuPoXP2+mV`AU6Dy2n;asS4S&^nyBJhPE1QSFPsfNo;ytz{+iZ%axz2 znDCrQ3>=+?=mXi$vJV)Fp?pnLfO63``W7%R9c{5{H)8gOYFHGjFQRQt8?DozDeH^A z`I&ul&)h>!UuqUNO2P}hHv=kwcx+ya(IgOxBWj;WCx8bxRcJg=0M@@E=>P!4Y;nT6 z2nF<jQT@@Lnk5vd|C%*p2k9eskU3IV)UQ?g7{S*@`)(->3%A}<AfboRV8g~er4nx5 z=l(?-fjBJaNByWxPEn-h`MC4Wn8<CZq+_BP1SN9^rS#3@2b)jEcl!JFD@l@*3ETEk zRodWJ`l^}C@aqS;Pa6(D9%ru+n#I`!7$xWwa#<iG!cr{zS6~-mS!=M;T5Hy;Uf`88 z)FQ74wBHN8)SPzz#=xx&^ZMfQY6&oB(z76yE@qJ_Q>8$3xH=OcGs70MHV0+x+rm-8 z4R?GlolIR9UwJD08SyLkJry_fZ9TZt=GgM$M&cnq5eq(l`Te6qL(ls@vKV=$`6Wva zM?$+2jv9=Y{aEWs#>$w>+f;-=UImZ93YZSb?Y_}4YO=YVf?JFpwX>mGqJ|@SZys=j z&P0wfkAR&l<Fd$f+qMv>ibm78>Fu;@hv?(x^-ik*%iG}%%lc-^AV8L@pxl=46lw7w z0R<NbcqK6?==3bc6rN#3jDZPqtwZh_5Y|A@f`SQBcPqGL-UUQ-m)ZP>)f$JYG8!DX z3QYJd#qYNb!}j}yqSKOJ2lcpP7|y%|bU5W>_OK377S6F5WZ4MaiaLPXzZ+>oGGR-l zLREwlD4s{5=Znq%^z=Rs_JNS<sah~tHH>O7SW96VTUAboT2t_$wfKJ*)Xy|iHv+JH z$#AonWaoeo<g-u80H#}kgTV(X258*_!&vJL<qcyZHlAPnz|i>6VV|)xkW58BZ5W@9 zq>=*~ZWA>tGic3^jRqb{tR#Li(jPP8@r;#;$1N%!{f#+_Nrj_?GC{e$1&uRSQ<=*+ zfdvJ*8p$L_F0J6;)NBTbgcn-Wi%r$wOM=;jxvLPQS(b|brc%<w;QM#L_UnfJmyyUN zq_EO+h&QFBM@CYK30PD~U908HH;Yy!#N1o%iCvjCCsMke%4Cy9st3A38XHetrB@hc z7Y3-MOa-?A7%8Vwe!CXdJ`4*`fIyw(w6?DAv)?(dMV@z-py^sy?xbu-4DB874zMu7 zo8$-}Kt{u`qo5s0rHhzsl!XkL0<$6b6Lr=@tSt{D5{UH!pW?*8MXdM3G34PLo~5le zJo}YxwH&=OT2{AxMKuT;t|PUs(qp|ni4l4Wl2Id9^)|AL3TOMl-$Z88z;A{^PZhD8 zF>j_AJhrZV3i<bg6F@j{wG2~3L>pNJ{Q$eaY=A5q)yjsCwgFmf!Rl2l>t@yh$AW+H zrx^<z2mW9DeZw;Ft>X`0fkl>1g^gtc-wW=2{1`n7BUAp!I$5ZbB`m-j(dSYV!2WI! zr$JXsdT8XLkkFN*6QEb5Ni(p*&*6hTilLH46^C?5Se8|$gI~h|KEFoCD2#mU>L{!3 zl;zSIWCyi`eqc-q%0h~oNpeTQjwGAF)CTbkd?3<U7~Qz56Bi<?1W*Qh(_ve)&<$3z zLG&h;mIl?AraFD9yu}8_Az&OxAJl?5DZ4)^6F(35quNQS2z3HyhJY23b40YBG#ulj zRh)TpFc*NB^2HkAVz+3jAU?I4+*4)cr>W4W$%PeHs{E}VJCN5cWN|{rp<n+BJl4<C z8Ve~Gs0hYQObr7&GqM2q+m?Zk_4U$k{E}h((r=W${>(FmQL}1>@yutIK5Bh*=`-jC z9wWlHBWwrAJQFh$AT@JDc+(#d-DJbezaqI#CTo!rXLf8fc!|=^+hT6+QV8zIB&o23 zLY6r;+0+P)l{dpfGx6mzvd=H~+&MqTj@-=yvD3Wi+T9Qybo>cvuCV_Gq|PW49UH(7 z;zPveP9t4+B?o0xN2HP}G)FbyS)*n*6;n0L7j3a?dL2Fm?0gzRA@n2ABTX;^KuO!W z{uS?CUjbME#{p(-^asg;4Zwj*T_AlqAQm;jGFVK~;0KDJmvb$$BB1|h^TXmz78as` z><*}xH@&m@aZ`M?O-=Y<Ct`3F63t)#xurj~fooAFjb{V>Rby&KTHwm~PSBWQ3XlpK zJ1KytXap7bN)mThDIbLKv6jY0g{98JY#S%@DoHt^B3fKf#poD9Ue?YFasEDietu)C z@P=oFc=ip2Ee?fbRjzEz&+GTK+D&uyBK+bZt4X@tGl@H8(NrWP{v@k#A%vVaWgGy8 zK)wSOs^CEhYzh!*kaYrR2IoLQ-OinR#nAAj83a<XwjO(I%TmQ;AT_u-^u&dWI4qt& zzmrOa#CX1ZmtovR4jf_>W({R%S4Dbgs8XT-x_bZsD;Bf5Z!O+4JTmEO3MYnyFCHCT z=~*x@ES5?LAE&0$<@`7ndN_rQCvXl|h3SXo%Z7%Ub@vEe;ovQT0n(JsU`^V<nsl$S ztGr%$8~79w<rSCL*%zBy>~=<KU8P`$`6S?z90C|;6ba4yR<n%fec4dJp_$ycZtnGh zbD#J(MxvH5!eNpq$hZe$G#vg`t;PnN=C^`+YA~e-u@V2Nef;8|fwjaJ(9iqkCf~w0 zh=ca=CyNX7MXXsf>uwx@^%>+q{_|>8Jl{%BbJMTIOL5JQO{smz<$r;%^2Jj7knxCv zQ)iS{1A1C<1TcRI6sVt^^_##cOXmblSiL1y;lniFLO1Y3@Q%b^k<K09-zV`diFq}R z1BydpSEB<>8wds>(dhi}u%Mr7qI$}m!Kn96+Z7vIBmi_@JDf^~1!k46w@_H3cQtSG zK810a#32;<&r&eIT37@Ps(6}80#Eb}Ul|WURxe?xm@LW;s1%*Bdzggulhd1s3fV$C zb0dlVc8{PVt{Jim`g$+?^xL>O{hxpFzEL__jnJKMZ$37{x5!RRl-n38pBfvRq}Fm@ z45icI`-&Ah_bop~y)%}6Ke&E6^7&@<!Of{DA+`(U))T|&qNEcIyrByD#VXqG#5v$) z$sI{Pp=Re8Qrg%9m-vKQTX5!zLb5<CW}Nq&<TiB7{-Z1<Jn0w29gtKC-Nr%dNGim) zAHQN)sHD3V(!8HVyuIUNMie-jE@e<fHhPg;8aX*We36<3ux*Xd?sz)Y(SrW|(N};s zc-{Rew4+~pTUNTww%VaDwMXP)dLlp5s&Y;rh@Q19%m2^^XV`<5n>IOwUMIOTt)U9m z5u)wl;2O!+p6D3z&H$kvV(N}%R8Z$hVHFYTs$#KA6qcg~gj9+S{><Gw{Ar_sA8(k% z9YCt>meYe(k}}*;hSEEg2YA(J+ZYqM)LB@o)DU4!vJ=BfHYq1J&2)K<yih!*${i9c z8yuAZg=gdF{yEpNZ`aG)TCRhjmn9a4_m(OXk2TPbC*AwPiLWKvUb}S@eZ3E>Ns2;C z6fNmpP;m($fB_t|jp4{t8x2Ks(NGeJ!|;`~)riMSCz{vJ&Gfn~d5`yRLS+rg!fYOb zHMof>=KXcg`;MCTL|7QNLkwOG|BRnx-QBp>Y`a3zR-$7;YLK*w_s~$uA%swj_)X|& zcvpq6bf;QfTf@H&-a`(FZPY+uI$yD0-K!zL7~Juy`fgQoyBQ#P>-!G90}GWT5px^~ z0YWf93noANNW-IIYOH@OYX}7*#t-7~9l|z@PsSqWBBAFE>t~BN7=ItZJ;7rgV<Gh| z?Ko<8p(tl52Gzz(azVBNd<}EY1@`w+1vI59bT0wKC_~sXxMZ<nQ5e+O05uEK)Bp|1 z2hHD`&mz-fW<Db(<w16?`Gt9$<7yUSVA|oNbw6rNFR0VYTK6@-<KB0{`#QV@r)X1~ zCN$7T(*A-(-7F6W6-sD`&k5O7q|Jpz;bGa(!V+_{cZwQYR-oE73Rc_vx;Psf&&|{M z<>hkx0@?dI{WhSKp{2SHbl<~DRe7WGX65b5k19V7T8BcTu`3)9xAYui!^o9Nj_E`8 zW|IK#`iB$|$&6}8n4UNXsvs@n<Rb>CLZuy6=?FJ<<W$rL2j=F=;423P+efek>=sR4 z849c+EEHlPtp$d>#}F&=$8z>G8uC*|=#W8tC`@JRsGV!LePpXcJu@>K8#6OKL#p@K zlw%7?*0BT0|0~S@k3h0BgE%Q$6kV6XanJY=ml|uy$`<s)Grk2da6V)%0Fo#GHR1pZ z3(Eu4kQ5BC=c8H?W;DFJqFvMbzg)R^vGV19{hGG28;%-Zc+eDi@h1=Fh55NCOWC4- z@;4MEzJYM?EPWGpU_-Ab{d0LC#^?RXy1o%;{!RL4%uAJYx^l_<nV)o<Ky!-tu{wB? zI*z<6iA%n+L`p?Poh4c_u+2j$;gegN+}+qQOjXc7RsQ1Ltg}`vyxUzr&Qr`WTB!gm z(!Qu$If1SKiHYl`ZRE;a$wQl!pICG2RAUijmA&-D&9*~B`{;bnb}UwcJHyCkEK7cS z`eb45+}ynOhppP1#S^@mjM#QhPYFIs!)JT4XdkV^b;!Y~@7x$vN|Kh~G>dTMhynxA z2s=B4<l*#Rm4oJNxw<6sXTdul+3iHNHFra#gCmcA#D_W-DhW&b;eJi%9T7WG3^WL$ z29;cATujux%X`I<fSm4oJECv8?`?kjZQko|>&%(gQC~<;I)iJ<7egN1ilgbi)jk$C zv(7j_1RF=Wj<tG$-g;V)Oj!t;Pg2MR^GiqKVY-FZNl>su8}yBo4Pc~{5bG)1<((Yt zQWn!auBBVZ&y&X9jeL1R980&I11zI<Mw%16pXLZ4OMeMB0JjRADxDMj0BAjO>!B2& z&4KH~s<{7)P34RC-*13O1Vo{Wc-?B<C-^>O_jT?QY?H<}di#>|b-NHuA~$9gy9SPw z4eK5w(rwd?&~3zobnBWW4P>hhAY7%qy)yu$EcvDr<8j~FyXEceoe<km;yMX4<I1~~ z8_HiQf9ENQsS;AX(P9pJHWHV>iXIVdR<g*Zj!wq%IhiLKnUh&%7qPTv7R_}bmHa76 z>4aO>AuyTDLsqqvUMfRPzAiFYb7gj`an5>G!2^}FYaBrPLf2AgY04ZeV$mrfRX$b% zszaFjSP8Pj>Kr=DfMHEwa1fcTv|SMh_8_U1s)aRQFyKpRiGb=4gyGm7r-OJ90(r!8 zj3VTRi1j2B{YZS}4?|zq8&HMza-ZgxhkASa0>T}uee%_=jHc706<QF&)6?Ne;q$?| zDlq03LiL40saP};2>XN|SMlc)s$T>~1332u!}u{8i1_?Is;77vPlnRoCp+;i)(#H@ zl3@(!J@%?_K;E(U-raSZv1i`U^&5nnc)e!1WeD<9ibhTAX&KA~oVm(SslzZmU%ZW2 zojjG_@@KU#zolBQ|M<xfIZ-^QSz$G6RoXTF%juyvW!-2FwD^tg`I~%>1__28tVweB zC#PotNsTJtYjvdyv0@(mpuc#H=KgB)3r?;hgl7XV<Bup<$<}AG-KvGisPNYVWh<1; z<?_U~?aPm^uixp-HQcJ>_0qvEzLppmoZWuyrL{F92U3i(NjtZnP}PQgL&w)sUtP(; z`n3!>E!B4tF(MH`=eBFh4j$6|wt^fELb-n{p+7Qo{`{*?tn&U3C0%cg{zok_J6cd@ z3Lk#u;^IqI+&J#J(eCpCGKZ`}UhpK^utdGhL?4a!2pF79_NCf`8yvGyIX=W+&@(h< z2sVg_qyTlvhGepMAO0|sLRp#{)e;EGnax;`howii&fRys*?&C%mqT?79~qtw0wgty zkLnvvWQL&q07}aE`uci%#RL-XiFhE8wfcu9CT8+EW0+t~8y)IT-8DUPN+($(P$7zu zk=fZf7Gy!dH91j$&_#@Wt1q1@B$CM?e=-R@%Crxk!J)x~GskHjkwxL-;L;@boaePl zYKYw}+eJz1D0f?7;Z(;Knj<h|&K9PkQZbp|@|DMYhz$uwWfeBL2c}h$*5hPBUa~k_ z#PLf9hViw0q<1=y3QYG##siV9sDCbz?<c`>*M~f>eon^6sAY_5G+H%aYMF^%qsYBP zd;A%Ak<SzTL)i%^D3c7N!pkR(`)UybJPBhOhtZcDCydQ&uRPmtO$3oCrq>d~!?Ve= z<B^bI4rYKdVAerKAb;=|nWd2Nvu{v)dsByqg*gXh{YvJsU^oXs`5s+y&B$gz1G+x= zVU~S?u7|obfe1fPLnnyrBvn<C=}*<R%?51FtOmX&tvFSLc!KcC7B=Jx_{X07&s+G2 z#<m|;EmP1q+=bCCLl8##etI)v!R8Z5iaVrkiUPDj^auU-%4*2XVcQ}H5zYm6k9<$r zY79?M4faEys*$ayr3pg<y-5*@I}Dn4XtEPLn!^6iW0`-=wM5ugyIDsn%N<i<D~jTL z=rxKawTnp-P8Y9IJBTVTLYt3^Np=~d-T}P9&I<Ajrq7dX(MKXc{H5VVDpT>g&DdZK z3kl8;?5QTZ5$*=mhCQl-Q=QHha6MQL<n(c^#??2(4mH<lc}MkSgVAz~1Na|oFff>H z@LXW&X@Km}vrckcMlNpdV@D(17|g()17;l*C)7QX9B~y_DTJuJ>Kw^(9Q&Sr$Od5T zkRfsnL|<Z(2R2v)QU{Ksi_`%$*a|YrcYK85YAf8mcz^TyIB1u2C<N0b_o(?lyT*?0 zUI}4NHL(8G(9RxkGeZi+t0Uh;W>I-yun@9v{{JKHO`se}uQJj2L;I2`DV0)0?jb3a zQdVYGMy67!%&N-DsI{xRy4~u{oxQj_+HKR-w%eV?TVY@v1}|lNY|8WldN|M)3~<^U zk15O>Pcy(+Gce$JY~>jqW8OP}4y)f|9u#H<{N7;I`|kZCq)=|vX3m_+B_b3Niul+2 z-{rga)@uOAQ9&w*jfS3rhGJb7iE^nzQ7Dlrr9#G5jc;}=&Thj=RxDx5J)i6NV@%xw zBIy=jM^!K!En#=a5^TxDI4!=r#oyfZ$F2f+#UHoCD?i12am#&l$=XL0;Kso(A~{9A zM^h+215w-zeCnw=s4Xxb2@TmOxRx7OuId=$QfYb<G1?5zp#WsWbP%}3@WNIQV98Jw z&;td{1YU~lwrrO*cXv(CGLETdSyJ}wFt%<Mc6#>70+5*u63itc4I)i0rtp%clS&En z14O*8*#`Ys&%P-(5|W1}K8nNN$z<Mp;)G}!ZOefM>(eR2vD&bjd?nTGOiWl$JmHN~ z7t?nPwI^$W=5{zJ9rVHe6&RGTkdYiKctndx4TANhr?E&%Qmany-c}G92v=I9@37K{ zY{z#!n=E)#wvc>?u^o6l=q<^e7RD(>JRv{T0{n-FChmPR)-jM4emRrNTp<(kV=FOg zK@({%LAZm88#&<HbK`qU2b?fdm|NYpxCxviK_Pn?mx0$4tq+AK9!#ePiwki=C<fI9 zbt2kgn&d0u%}TS~CfY)E`8D+es7p<;*h*T+6%VWnsz};ae|1ps8h~3EcNlfJO!e49 zAqcGoFKg7RIK8)Ch@w37TW;0zg+i4Y-#_BLQOf(=HZ&63GxMV548hVmSXYa_UYvI8 zi|3-JuhYarG~c;uwIYy~X|}OG3*KmUc71+^p9Nr~zc0zA4haQ)d2sb3{+g#ighN_C zPza5hJ!5L^H)Yj+NyNHc@&Ec`h5V-VOM7eZn`>_2A$GUh2geJc@pckO2tYg!9dYO- ze>v$BW&`5qGqHpfE3(g#NnWDvjU3ob+oe}zO<IY-AFImiSmj#39!-5}Zw)_v?1Edx znF6}!mT%>|?q9gsh-%WJPyN&9&q*&^1-AvXTF-KwDF9SkC#5B99P1>RVhU1tDugA= z!C*~M$pN-4BbQgt@_Ap^GIwdgK3@D3qIX_T8@to$*<X0z&oNIv*8Tm@f4*<$JP9Y9 z@*6|O#EatDbo#Hx{@p{#0x-AT|6--Tu-g4i`{N&XX#uTS$CWd%H&V|4>vteAK&UT| z6o3|M7(redW%A<N7Fp!Rq%Igv7xxY(mq39k#X{Zh5x*9<<H6({LY+D2nz>}~N7_)% zVrozz(mhiHTGbvIXvH+c&|=+or{lFP>(i6qj7EWQnnd|gG|(y;hb9ZCvQ`6PS<6Hk zC9R<t!ou3nHmt`Vul)Suk2#M$R{QzK9*64{tsAuaz(+sY{Vyjz`qB1BMG~8jdVSbo zdQGv`Ty!6(Hu=4PeAH5~H=GpGSA)zkP?a(zbPNEbUIMz$FlyaDAcZIWfJk=?hs1qc zSgIMffDPq8?u-6=U}xU<4j`96Xu%xU$;}fX9DHy1j~4&zeSAlrrh0%6gAN^UKsy!i zbg0U~GY)LQb<Yc|H&)a@GSR4i>tK-35+d4HpuI(=6P2ypcrLFecy0?;!!+<c%;C|( znF&mZ23~?m+~;V3;B$mxK({$^+}QaBSe7(Iv{u)#4WV?~$46{qS8PbG#M8mxrFb^k zOyIqd%>kv1n4oYNCY+;dEMXr!rPXfXPZ;oxxxvmc@Qo1$pKRe|&ppN+_wu=nG4DUs zmDp%O^PZ>6p7S0A^DF+K$L6}DVIA<cR5r*`#HeTh43-eP5p57aPt|fE_<)pTKy_kr zJSiF^t0ZiwT3X;^x`YNWn^wDf(*)p-7w$wdNibU8VzsBiYZ#pi3$}^MG|%MTc#D{T zOg>M7Z-(|dP{l!B-$92JiYc1sJP-)O3Ed|$@Zlhz!@MA1YRJt<i6T>>U<RtJh-3FO zcR|pu<eS%x$Db2lt=wPz)BFFd`!9x5Bmr1AXdAp=%+YP)xxZ@~*B`$UiwV7Yf922a z|I^O}S+{{kpD|Oz_q%0rP?i|hCyI+f5?F(jXN64QWWp1(6Rr$RXdEzL*f@@5IbFx0 zD!2HLj^t0v_t|N+I*>=&4pKtW_$1zrejM7!ImJBr!;tR36K|IyWn(i~GaIWl6Z}iR zLsqrT5UheEZ>o_^usX$(iM5A*r9f4zlr~k6<^9gHz?y-HC?bUioSCKP2g;fbLq7@y zXl!KmuJ^s~QZX9~scJZs#+49K%Ji<>RiZ2S7)}p3iiq^+cNrTOo<%Y^VVT?23)$@W zqobl_K*WUtRSicos+x(0p)yeoFvg@*4asvM(y<QMAhOe6T#h53tq{RzV&zdyD|`@4 zK87sDOGj0B{=#<-uFFeEs{GI&{J}#ObDR(T!PL~RbUMF6_c9H^y_5&`48DrAuMjO^ zE|(}CYD!E<G*>CY9?|(668}Kt>ap@P=1G@CzjQZHrPZpLN{xYw_ngd(v=~dJZkQEO z&gBjGV2)4SWdg4_H@CVvM=X)MUpDW;3OA}w0O|n*6Ma2hnLtBmB0pC?zA`^Q8B=l7 z=ECCCR0==P4J~Zaqg+}@@tbF0MW+1D&}OB?D6<h>*;Z>bHsJN51(*kc<^V}F#O=)N zSTImHi6l!8K8WN)v=4<(7MB()vzg)_QBjEHGsKT&W-E(Jr4!+hcN^_b6a&FA+}QmS zDzHHkic9CP#<VeG25iF~d`BaqLBp^o2@%bNK>Sq?V$*}wbZ=oTa}10Tbe|0nuZOqM zy<594V`}(l;23*XACZ^7Lc^j_2E(WwtTf(zq4|QH7Rpj{scDHr@B|&)1dlGdhsKhm zQz#@>jU1?_0c->%wBvkF92QaqA+2bjRltrwM<xF0TtVE(WbVI?prYy)HoyDxCuY`5 z@BIF^8m;&IXXlc0$-Co4#1rkF$L1$LfjcH{zU!?mL*C(yVS2AddV(@)Cc}Qo0L2_? z4Sf!LEyp>93$Ydv=V#kH!C=ozOYAh>@V-<3j~m=H`?tSrx1V{Yu_Jn%U@*ATo_g}$ z*W9?KsbBgH`{z;TK0iqDx?P|4GID|<{smPL-fArQZ&7q7$!`fV-<4{_R0uP@`&0H$ ziKbn*>)!+wR29QQh)XOAAa*Uwy1ARi_3LyQ{g3mw#}Nu$q8|79+(O;y{aMoeH3a4v zH!ofRv{0#luZfV;{cob<TyQRM06r57@=d#C@OgRqhP(bjmZY`}F>j<`wxGYt&>hl} zgH~JyXNad;t@ogp#AEk5PyT+d_uh=hJC^Yt^v>_&!mGVb;|o+?IYtybpZwBlga;FY zd7V(;-h9;>P$?0$?yYE%P`_=(lM5?;)wE%F(=s<&vx78m4R(RffJOE-wD{SK-=tu9 z^FCPn^=z&Ofm}IO)BCMYW%v5}-(W^hLeoL|c}0sb4oW7iC^wdYWOmyL?sS-BlqDBQ zpkTB_YT;Ur!Z_X&uf6b|`z8T~7@L1<Ufh2#be_IOe6EHo%j0+BY^hj0RV<eNQ_|Eg zr}Shko`3h&WFns&Gv4yTPx06KP28;Ef;svUf32{EuXX>-9MV#k0U-0*o%%J2lAEk0 z0QCdWM)N{Wra&<o{3IZ=NVPb1^nw6RY41Ie0kwHW-Zv0kzBUqjaJ^`yt>XHFv5{{R z@Ad=m_~J3Mipy2=n7qOE<M51>Q>_0fhPh)He_Ag(DUg3%M-(&O($%w{whi!``2X}- zT=&tPB($k(9H;4Zmir%Hzdcp>*6X;Z7I&<r*M~HBBqj*!9APPYeF#7_+>s$otne0} z1}-~(e5XVFl=nAqMGQDT!hN>m;HT4pq~MF{dC-`;YfpJz|Cri0?!LwG<Qr_?;#e9O zX*^GK$W&i*+n78X2HJQA!EIz46DQ%deE;k~OJ0e#qgAK+vcKKkbAyfCX+xsv_?wr{ z$TmiKm_MUFf1TygdL!YE<#ETsoysGJ0Sd(YB8Gw-gM(OJ_!UCNg1_y+2yzFR7$}O3 zLDiA<gAB{-O;S07?1~S{_69`)T|)Z;+6T3*$RUjagmQH%3{^&f&2bArfgqs*Nq0D! z+fp+C;;x_onA1en@_@zq35Q{3;_KUnm@TS?g;lm~;Y6+xvl{s<gvuT-HJA*cIsD*= zc_kDw4dVyqqEK!!;b{*WXV&9GAVCkUYuWL48{O7NtP4n5>v3jMPJu3?g}Hi+)`@|s zNNEO0%gQQg*usd^x&jm6Zc?Jb>H0uk2Dn;6|NoX`a1w<X#m=@2)WonX$rV_G)wM~7 z{+3DWEt7N;T&fHUEgn!NfGhqpE*D2yA1GI@#Hbc(b6(Y`ToS%dN3^g}lt+}Ta>Gy4 z=i}qyOj?UPUQSGz)7j~4DVl#Yx@{QutKl)D8Qu<?!HJe(d}IOR%-<)~E4iWJXQyK6 z*j6n3M9zS-Xm}=pvW{DSPGb#YU-9PR>lte;ns3qep0P&i0vc<i*XVGcXyDW;=o54U zI15l8X{>Nr4=8-<EZ<OC2k;(sYCp>+WNWEJ7+2^2{6!o3l*BLoVggzf8{!*;{+2_q zT8r?tj)i=@lh!1%>soj(@jUXqMQ9AAR#(0`x99B?1bDCzks8_5V4t9J)TkgRN^@;~ zUaJ*^fYxq)er@+(ztUWudF4w&eCd^$<>o6W55@$@yDi4Y7o^7<<+!vBF~gq>dqx-@ z-%N8ktrXE3GGZ4-C73<37IUgrvXo%rq0bxFuZvTs-uhNJNM1kp{Kmsg@fcL#??)PM zAQ9gWWt;KcZ++{jQ{sB_;f?3dUEidOoWa|C|DE53V8}gu7xV>@z3=)Ap7udgzoP5M zKe+EzKT8*nBU7(#eh}>q`B$+(Q*7uEA^$e&>xd!GmMG?S(4}CYZM$V<7Z=W)edwXH zXBHN-H?JGc%#34PA1fBd#)TLkD-;15WqQZ-Da*c}co3P9cy_=&p;8JQ^n8TY+lj=R z@yK<Q?Bk~%ST-Ceh4#LZ^nJKb-h_L)FljYsW}4>i-ZEHh-=TggAJk7^&@ne<0&&3+ zlD5Uoy`A+oH(U5XqS1X#Sv}}3v}Xik_)FXlLy)rO!TS>L{#G<L5L85}(9UQH0V_XH z?~tmq`}O*yf#a|!95kgYLkZIiBfCv6l(7E<;(%=hRHtj*NL!aCPt`uzg(Opq=HtmP z4roHY#`-*L)JsM?9gTYCL)u>-{78yg3t<$R=a=8xy(+5R)?_Lg5|?^{9z?<&_Thp0 zuAQ(#8S?{dnggX89?JcYx#Rl;Xp7o13uqsrEq}~9Wogk@%7@0S59Kw?tU1)181Kfu zP$R<b8_4@d-G4hgBG#t=&X}uAj0J+z)BXZ?4zi$sUn2Z$<12J8ednH@sEaT19C61K zp~?{?fcbt}b$M|ud0uuPJ2JW=)+_H?1mOefHH^4YrAWFTnW2#)m~2xD&xTN}Xw?8N zF=ZIh@0*&L2?S<lroJy~$aB@G72PnS?~GeXRh6Yu)ua`FXVlz?lHrPi3Lul2fdjU0 zGaVf`YguO#_t~-q?E4aDEel=X&Q+pkgeX@KqP|>j1P~<_LO4?}Rk@8{z&vg_T|k;0 z{Izc@h*Tp?>=?fc+TrqBgc$FeLp1~%#(xBvGw8ofOEHzJ-L@Q9gxliHUOmrZsy9u` zFf1s4ZRf04E(hh(;RU6@KIs`*@x;DT0wHm|=WAeWz+`#vc;cF;m-u&yHofkdKbjjK zc;oc*o?hbR$l30XVd>?!pSdBXMlm+gJgOxe91$0(ltY<NgCgi=pv&e^x^y4|IXGB1 zEUJ*xZjr*lHL&m=ZA`RP>c=gv378d#>+YP@07{1Z;YVbUI3l5RB-GO)M#eC@pFRsk zoo>wyPkL7E$>F&c4B@CZ&D^7|3G?;eJNO(=j<V1nS#SX-Szcs)Adph^Qk^uOplDe8 zp(-9YCC39)IS}N-5k?kB6w$z`o$}Zi7C|+S0Uy2L|IqP&7`Ot;F*a6?Ub=KWnnzFh zjsbk|eexeOP40jux4>Z#M^jVoQr_g!WHRP4i%CsQ%m%_$*N8DL<$#Fv#-G;@^@c<N zAiyLMV&El#r>?j<Ua<8*Nbn<S=wW(9O?AHM;Qyw+;gMPcu?~641AB}DQ%$}74x%j~ z>XO`c<ToaCZ6i|1A`+RT6HtDlLmaQ`fuXaSdXvdO)O%LCcTmOS((-w<V<1Q|J6BHB z{a>V^$~+(BCu*Y%#e!gT#thUk@Lz+n#&d%J@#rc~Wwyx@-^}2z_#@KwK^E+~|4Iv# zf}Yz(Pqpz}ijSdS9YmYM>#RgkAWDcb<3O2<RsmhXnuF(?q`NhNnZV3Z!t{OgI>}KK zkFpFY0de-(+KGWxpe2>8vjs3iZ2ZjPu#l_67+RtoALj~+Asj<$2IW*GLxKg=F>>If z)4&|i5&c8jF`-!`q#YFVBoW9z6veHJgR+p9<^|M+G0?8x8iD6M9e=&yF@sw|hMHMz zNCjQEL<>00X%K`8$bdL7GfE5LFG1eBoo5gU<6<=8VMvFERkAQOjdt4*2RaZnVInsG z5WKLosESzBs?3dK^0_iuuk0H)Y^q0y<OSwYJpITTS`=kM1;ApUe3T%7C{m@tYFW@f z4CtO1-xr(Pep%dLDLx9L?yG)D-jV8)17r=vl7f0w+|(WaV|pSq(NMSVAsI9#L_$Ex z(&=C+68ODMRl%rITpLafItb3Uj`E{RuwEd(3fh@!6$aBsb%C0c>j(Im>?`Ug_)4%h z;q%Gy6{NYYZnjQT7dP><SWcgs8~iA5`8cyt|Ft;2yeuyRznfYtAJ6~v;77XQZ~8`4 zDr=kP*r;N_W{UVs**@_B$46sgOO?TU<q!dhCHa?Xu<x2;G|5+9=vuXLt~PI3W)CCO zK@ehexHL&xrnhXs22VcwOQqS&XH^J$9ixNCbC`mb%{SvqPOAmx(ZyKV{Wi8h8z|!% zmmAUj=AciIn1cn7!5ZAfsHDjAM<s{Nb;Zk`EcqUd0Y-dJ2{go-DOi|nRwwcoUFCH^ zNbTn$wuK350YM5|Y#%&2h(V!RyXa9&PbGo&7MQR1qNRIj?+~*ISw;}_lIiv+Vv^u9 zq`6guPQr%;M!>JjpqQ|0%2X2o##69`5>8YaKQmqwb0FN~Uy7(&Jn~25v;1jiSRheg zC=y9d=Vp?bOlX<=U}xYa`ih80KC|!{@mUR&e{L2}N#s>LMSj`=x(%VU)L>#O9t@*b zmX8-8Bx(ISzQmtCZGPGv|Dal^V+veT0rCcA=Ab~HY|{Y#0829l6|j8_$R13q*=kdo zBtw8S?y_%M_XcnYP1roXEZUSA3EB|Q4a1^vAl@Hg6evp(;7ruUa!ixVrNG`%LY7Mc z0@Uga;CaO5%a`BQ`xEc&9pb>FrwYnW_+CQD0?Yu<-ckg7a|NEOphNxXDHPwMF1yHt zw*Q>dpK30xmd~ab*887LbN*=Ou)#O(m?E+{ETW4^(*W0*8JXDB(<xY|v26KE@mk~# zu41yy#J@(pXE81bWIjXg^28^R{s0QDZM9U8`lL$TvI2HAw`1%2EqK81=A(N0c=!Jv z{$0cP>kKp)h7$>QvP6(_)`DSGzQfN)OS}u-09uF)Zd=6R6zW(L3wW%hDwt6UE$I9l zpfxcL_@|A>l4YUYZljMSPW=|jOa3hcqMr$n4+MTO8)&-YcRM)PS;^nYs%kU}J;d?5 zhlcJ(XdvVP3W)6QB)zT+H4*Q>Uf<lT)e7NIVXd~gS+CEHMw=mDN2-jGm+yuz`yp@c zxp26S>@cq@hZkT&q|yjumjdH#f{Sh+UXYt~7u{V-U(odn=@MFtF#BFx98w<40`AG9 z3USG0n~r!pr1gRKf$urE{=K|8q=drs2QP#GM@O`PE>nG2;2w{vKBl?l-HCCaVy^!( z^9?y3xv*{uGHa0@V|_V@v5+OKHxw&qe<G<p?A~_{$I<($ir!Cr;h~FiOq@Q}{ZZJB zNBX$Er!{SJtv;8FG=sqlR`)9y8AdofF)zl7^Yh1EUt5sXe4mo%sJ3|XL7JSSTBUu^ z7tlN|uj*i)jG}$kl=H}!`xeY_SBK5)DP#*yteBNP0Hqby3v34lKEf|WE}jQpMKBOz zHofnP4(U=QbIYn#V=^d3{@~>7WbgPVdq@7WZ|R?fjw?V~TgxI1Zouf;E0L(wJ47QZ z_pkUq-S0adyyCwLs4(!F9)BkJf6ht8vISzfW`L3N2f;%RBduJgW7+PH6e@@>2bs0` z@33dGToHj<4ah#f`ivf_-ua<YPNBXlL-TwRz1APyu&w}?ir7kE0OS$q9RO0r6@=;m z?*Mjw4by;_XFlvl>v^Cg)Kja=LMLdzswRT<P%1Sl{`%e|e^l3>Kzt>-Vbm8lX?y#= z=Pp-HHXBP&NNpdlOjlFG$Fj-fFMMITuzkEbRgK3N?%KNhxqGW8o2v^*4S>WZE}u+! z3H=#)&Y>PIumU{%GNP7Cy&|I@A*4W?K|$ea@+^JC@`H11T9KHD3>E?mE@B4SO{_8& z*f1L|NKo29eM4LHORLW{z{G<uD8yG>XO_aim*@`p^EDsyfHqeQ@WVE^c#YS8Doce$ zr=I`8f`EXIRS|-c0b$IdKl+Exg=8RXpoOvc2Ro7nh)_X?6NCnby}`kYkRpQ81Ebz7 z7?NJDP=}ceUefh>LfzHy1c#qup|(c1)1qq26Wxwz$s^vjy<>V6@jo5r=?VV{cmNnK zVEGU+w1h&t_Nr}irl^S)Z1FYQt{K={L-F^$WEd~KFFs@$bj6Z?vG-f=k6Erf4!*91 zdgzSQBDonO4BkUMtQPnecx*BEN=F!;QpE&08g#wm!OFaSFFLu$-OK4^69A+i4vX%# zEl*_V9iXm6|2uA(JPiT7(*md{;ieHrcAK~ug<gMM-vFOz=+SWaRC3WEpeu?*5YN~2 zKyf`h_P-21kMw=48Cb8e6amhHSRxexd^mwRaoz}S3TB?4^T+y3V3xoR<JLp8kVfB; zM3(Tta3VcAl?7WwH@zFl9(9D~8$V?hBj1)trxBYjmP}QK5vyjPF2pl)>k{mQ)-4vd zK$sD2kOhN=ECRZ88>=h$Gg*pP^=PdyiU6>>Haj*pI+_R`3&pjuR6LQ0r`Gi7>RBjG z-8L>oj)wp|oYizOl*~u-v8=#N>3Ccq7te88=lg9-SYK`nQYJM3IPtk}qouihg#mBJ z)uotWbB<m476ib){u9$s?NrSTpjrIS1euWS%Zw)07q6QBN+K8|g5A1JeCvv?KN#GY z$)XwaTA^U-p=06LXkjQ8Q^)Vu)To+w>t-%Qg8BRm;z<j2KAw-K2@MA4{D8L8^VR6M z<0iwF8LAx>0W2iOEDd5F*ffY~3`0GRD_qZx-+sy?l}EFtmzPp!&qKuJuD<EFmYUvp zpF@OzmGnJjT8I2?k@5F;X`oAA*3~QZz*BF-m~tyO75c;Imt~wQuMRWHssbRNT*XQ> zSVl2qs6}~ohgz3sBC5vnML0qM60lyFD>;s}0PwB3QbR-rTE!QHYZ*8xJN9d7%A7C^ z{tc43^!k|`qKpe^0x`->+Fh1iZ^fuvRJuza(JG!AprVcF^f24AwwsbIklR5T<LejM zBeHkU9j<dURgaSUtT(=eez|qWexY^OYu6Ov^4ysSWhxLP=p0JqBS++4Pe<NW&tJ{g z-xW!f?<u>L9{##%etr0X`|npkDf`bl2L1~ki0+tI;o!w_!B7R%1HFL-c_DxZSitB3 z5`lQvV4ZWLWEu>^%#9eulFob?@y5j1$mHa3WvI9%#92KN8A9M|F`18yp4G!<BoUg3 zpNo^{p@rBw`mB*1nyzLiM$K(ijHlyzbvB=l<|fPf<C#!2ITVWwZI4Eh=^;44`Nt$C z3i6K@GG$)uP^uJWI!V7?L0;DNr#=Ry>&HyppmVz>fBH5ZA=&qgZ#)Z5DtH#tDiASB z4}*jOCGI(~afe6kEtijOK&iG2(Sn@o4=9&xgTaFN`(y&LBgL#{+9nlS{s`P0g$4^f zY1Zoz-a@?&7SVlGTYu8X=Xh!W9sLd+2Fv96^T}w`ei$2kNT2s60<Mo`^K*1NMJ#XX z_u`HX-11@k)8RlJhukuOzQaX52Vf|7{x^1RRPiUDc}u_M;BVl2vtC_X;zjF*50jbK zKmmw4xaGe|GkQsz$7m{fE^?*G$&q<&iDxX2pbj0Xv*QzpE#SIvX3~>mvnqWV{p_DF z?5iqU6Z%aA0EYrAg3jiJlGZNw#ec)5Y&R;9(~Ay-!6fVUbN=f^|MkK5k=D}fJ=f$x z#vP0WkM5CD+kNL(FL_mjpsV*alU@(Gbwj#YZWgL_3)SQJdy*cI-;0+wV3m<UQ0YTI zD%=p?WF-d&i>TgWDoAWASUO_!Xsi=3B^SVd$*?8A2&@VH*uW)OFgf7B>Nxa6teuT$ z&-gKLtKG&G{1~=lS@b28$v=k4Vyb!Lh1k^rKO9;4_J9|TBn*BZ9RIwBMTF-)hJAwq z4^+I-(r)Q%_io&~CTF`aypJf)p6~Nqhw%enZ)gooPIAk;pNYl5*9X22&oOU4qUoSG z@V4q!z?<V=y{_w5caU87D(fuVF677!`jsng9v^pomod;4%I#91`0Ff<QCE2n>!58d ztA#B$mSXYGo;IdjGO}EllSH|wEAiiJU;2_PN6UNOV7q`O?yDCOuKksQ=pwraIejoz z?Oh_L18oFSEuY2noa{G5Sk)dIPHfA8lYJsL8eJpu<4tASua=Db%$^CKPK}wmH(_{h zl$h<JDL+t_et(hkB=;9NA=YUE^rjxFVVd;M8}>4@usD$r)`IVrfBeAPj_Vfb)rOV| z5F2TX#s|02uX~;*Jt=}b`taDR*F1hJ3KgFxH(W!YHvfBo65#iw0GTUQ7(5Zcdyt}D zmik5U<|jiZE=|GN`60JwZSle<A}<usfLkx=`orlb_qK({$A!2VAl`Xp?cU;%>J{)c z6J%x&KMWpQ_Gum1LX?8E<LrPzgT#|ETC>rIABoJGr$)0|-oy0xd*2(U=Y90yiHV0l zs_Qog>e-_W^h9s1r1e);vt^bdAEkeH%;7=NS3ZS@=&@J6p9bC_eJ2kcUM<ld7-Zng zu$*W`;>o<Q5nv-FBZ;-g9RN4|p$VF$si~1nW@Kur)IXAM@A#dzolItWx>%fs6L$Y- zusrNFBFodG|0JSdQuX3((E9C-!zU{M(*asnIdAGuW|Koh$?W;_ZpG;|UB(E#bWOj8 zOSoZYaBO-sAW&({MKt)}NVA@N{97-F*Vn_B%ZW1&KYRvh1bHlWJGqr~dL_4+ICUzq zN#n)eo?~nsq4q>80<%Dad=-HxG|8{$_PD@nrHa?2yeiWQoXc#So{ZAbz--lyZKY@C zWErm0Rhr-Ni=}jy4sQCV|AJ8;1>DYGu5qQ}^>g3chqueNMFtsSh=>(}5~NL2uG`kH zFa^nECbl=X7EFkHQc>6Rnipl5%H<+&wk1j1l{~*SFjnvJ-pbM7kll?MgcbV;0f!ML z#b2Dl&?Dn7mUojS8<N=8>0Scm;5>zt^NMy0E_spEj5;%!ip7F);GTwnXvhz1iPUg> zCNoUVe~}a-z_`~7)krKJ){+{6xrJsjDOrJ^j0FNXA;Ov1$Vk32lnf)pTOe{g5)2}I zTO<<0^<dn89ZrF2_;?t*P&6DPy^LZAOW3rsu%xE2ecvWsBCh#qQ_5`zj4=&9(-1#h z>i#zjx%Rr$+95etB6I>oe(lo?l(La!>l{r}sPqT`Fe=)&=s91`+X*<kzrF>P@rh zk>XwRRb77-q<Ekl9xV>_G&)R+iG`%b@6%!^q+IBa=~-=E@^tO0hcf{Myz1G2ag0|D zyvsvkVA(*eBVatdq2)0Svc^z^xqQgrm}TCx3=ys18iA$bxh6*nij3hQc8!jK1Wwm2 zf#n*u+s=G$bTl_Fx6p!tzrtC%dJEB2XAw-6w}+KAMHH26i?XQp+rmcpZS~9duF0bA zetmfO>!17FU_DWB?ic<p61~y`K<;6qaG!GVT&NVDpAXH3&aPIgIIhmG%I97Ei%iA= zS^SGneRn4F-JcqKuDA9;p2TuS*-?AtdiLq3Pn|h)N^a$&Y{%Kzq5pwCNV{bV@Ruc^ zP*&|5FP^;j-jgr7o!b4z%g;UcG6qj`ungW>lVa;3smdf@BA>Av{?vDoE4aIp1^H0q zRkINOEJHC}-6d9A=Ih;o+fQr>wt}><@*nUS2fQ=?dIw;g<q3C3{l>hqO3$SHiw1ih z^9lxVG#iR&Bts3|UqI@mb&d2tWH-V!{9?SDE2Aq+l{7QALigrYOmHYNJ|#IPgE*06 zH<PRy6DXHNLBm4Ns3Sn-T0^0rN`q+}P3d6{e1q`|i7`-_Xe@~EVBuIiG&M0D4M0H5 zYpNbc<i=2PEI9(F;XrOEuLfd?L=-uQhZ704f0L_vaiD_S#~<0jKt7N7k0P`fBIn~! zG+Gpy)Nmw$;E!RPM!-iE5g_3y9a#(`?qfiNBEbZJ1O0n~VGt^zWPxK?f^8y>56BtL zR0{Y}!}_hC-u`L){r0wK|LWCW{f_Uz#=T#Fzb1=RITI;CDip@{Z{x;I@iDrO=Cb$9 zQKbkyIi5?wb7!EkCfB=VbUc#Y(R^9St<YHvF15BIP8Z+#^nH&Nr|x^~vHPZqkKOn5 zi^Zww;`~s&FcBXrOcYum?{9s6<IMAqZ=5-^@x=4i#`8}+@#7WalX`ZhqGzcFw|@gR z#4lnku0um}4*9trKxCAs;idiolmc#mKq?T(qK;v}gb(g3lq8eV?g1P?OHYGG3sPIL zJqFxC1(EbBP`*{dkp@Um9ZV7qbI|SpVND-u@=insgN-J_t7&NyPTU-a9IA#D)p~T< zjz;X&$KEkgsn%-M%E&u*OdHAtbEki%dn*>vNAjn&kXi^1WeRFY8wysmXe>Xn%iH`= zkWQv?759Wk^0BB^i22lRV&Un<EAeC}5xZJ_v5{YbvK<3wDS!I8W4p0rCmGv4_T1_I z=?njx{~ee7Z~swQh&;dJQhr2_#7@h%zcn`82Qgz#vV90P3W_B`*glFqRaZ_ccPY=H z#oZux2o9T4K^ox^%kk?y8+O69Ws{QwuEQT$UUt7$ITXH)K+)!pLC3H}|J~QTqeozK zCbRQ(x$l16yYN@u!7jv>>G5&$TOS{v?jKR?Kl<t;-i;LAn4kV*WLs)^pL(aEey964 z_B@B5*r!zr(<)bP<+Xw{T!cvCB%nk=S`Z~p(IKS(<IkAi#Ii;hiMG2oqK%2}r7)u? z+5^mxb)tR9ESLdoDF=QIEF7c$2tV6U9H%AhuHt|*>D)ApbTe(5Y0CiFcklyF&*%sR zV7?|0eTaOK2E)L7qx&AlQ%Wr~l`}-8#R4NA*p`q+N%k#3IUHwioyqgOj1fR(j8HkJ z0v-T`<jDe~;y9>FuL%r_tGEkjqKQzgs5t3Qh$H1Tv8kZ&89=MpmW2l^_U(?+LYqX< z9u%C0fYdECVT<6G2G$f57xxH*@4=c1Gz=k^>XfQW9^iI|8XYz{`4xAM$^`hk^7#_8 z>b?V74EJT4hu)Ttp(pj;z2||3fk!GqdZy}?hvv!wW$L3M2TO^^A6V9Y*}Wqr0y@}c zEXBA|Ky(m_=Kp~5INrue1|BIj%t8DjNZblr`hdzj$$pjFSWBS|ISB#{8JdP^slGy4 z#1Mmrq(q1|GhpCJ!dY(=yn{A*eOtT5L<NRh^5t&N=T5(p`*>?QKOE5zkw}ZoPB)PN zwza#<b_Oyye8aOH0D_*EVH8AL&1BSZ@B?U6VV$5)9Sc9l@`jOr8%{#MgOTwy?+aBg z{DQYfJ7Z-+{fQ<Kw)_Ov0nTi`P1?ID($RZd?^*+KDhK1UZHWLwvxz0foMJ()=EZ@G zF!V;nu;sD*;IKW67%{F$Hu8Cl%o)yC#L&qZPS&nY8#1cgO@o*m@6R&8?HKm=jO2gs z_wpmTDVDfct`euM-<w;bClH)+ZSMChK$gK#6p}Bc(=So*xnZ!jG#2p3K0#pI9N45~ zgbRv>bppN3Gmix-TGQ(2En4po>&rWc&`L+=xIO5ScV?NCt`Pmnegy6lmJ;GXUAVcY zgSkoACI5fg`^cy!MmBk8ZW$XJ%VQ(S<jB}Ef(dWv@G3F%4GKJY-7^<oH@&+p@1W^D zzIUm2riDO9!^0!CZ9qfE<Gq76X!+VeX8Az`MB@6m2@3G}xnmoYQBk^$D(zJq4j~@S zL57a>+TfcVal<R4x8L6k-CO3#EgGF$C(WWcLUkW8i#MSfyal`hnE+aj*9uOr^1Xvz zoqMg&-l4(2vx8POc62=B1^|;AOkb4SH_;9^KxrD_f6idWWA-xYft1%kZDO4OP+<#7 z&jNdlaV&ROf<WEr5P))gAwXYx8Oz=VxzGrOwXs4m;Loyw-)<Wl;h5%iz!R_HE;`AV z1`g=n4U_K1(t;9E*}j|0W&z(0{lH+^Kv(-^^E?B<Byza`rl5jx5jiN;U=dsNE>i@G zNNux|&+j1XP4RpA99`)!RAhfi3%G4Z!xxs29FYr);`$2>_SmH(9A$z{W?Pu<G(ebp ztbhru;822mrB+i~nZXje%naJix`^D9UVsaA0||9zVcGWw)aGO9_5jxhfThsxQ$w}2 zyNRsQH{s&ElrJqWulr+d$Yb)#gsViR$!#p@-UvJyPO%pOn~<r<;8Nv8K;d2eRGv-B zQbARWXr!VdH!{!#wjM_S=cI}ja^lH<@bs|%kVycbI+MuElIIn<*rqZQ`5ZvS0D5Fn z12JyF%h<!ZUc|obRX?kp-q|^=WfM7ag8;BJK~csR>QvFhfAv%k-u|}o*(uoBY-zh0 ztlJw9nbKCC$2ejSVX9-#K!&A>Vo<Rl$gUF+7{c*e8zrd@S4ibmp^l3bh&W*Q^Jlt- zhLVdLj^&}dTW{FC+V|R{Bb$JlXJ{ywpU9-xQ_jbg$G~S5b$yrur@9ogH@QuZY&5+~ zqV2Vi*J9)~l1tF1`oiM)nBbQ4G%?=3BXaqv&)PS==Xv}6<j9?il0OJTQfk2CUkTM# zKmmN=dC(5j_pn;anCJbrM6=||YY3`C4a$B@y~c#=lBTB3ZtII5Fqb@cx#jT+H(RKZ z^tIJUaa>Pzm4I0IZ5~>!zElw#wrqQ+<T=yLuBg-`#`Mgwny)EN>!Z2p2fn7|{xda= z<&79`k7_Ex+qZAG#lHa`P(hp<nfDA!H<_V`2Lf@S55Q_cP9gmUtJTQfp;AzBc2db9 zMo_($60ZT%yOG|RkIy0ghA<3cW-dOzgHsf5d?Te!FPpagnba~te!*v_t1p8swqCA+ znFR%mUUl$u6`ZP%Hz8CyA)aZyb~6vUE@62s1II67ni1qLM9I^c+#$Xj;OpKZhHj9D zil34^Z*6uvo7VGU-ue&LgPTqG*fw`O*66CoG`0Oy1kRYm&RarhTi8%Z9mBh`7m<P5 zlldy)pgq%y7u)|b(Q#^0vJ{aPkyyw6CpRn9$pFEvBIMFRa5>WFk(5H(K^PXVA$cl1 z0BF<dAASQtbnw@byPJjpO$3YE#^%=byR_>U^Ws(V?t@{7x0mR$Wp(J!ydHWx{!nJp z2}rszD4$+HCZ|VHb}FojhIRLz#kIGm5>siR!5Fwv!?y~#GB6*czR)n3<Wa|h!>spb zw*2Yj4Pn3?tb>d4wA|jh+PsSPZy|aee8Lc8_&V=!h-HA*fjxf?7(aO@EzRziBoEZD zr<Z$yP%2&#LtYV~Y(dcjduzP6rlR8&soU%oX_rgewz!6F^{hSh5-qQMwpTnD#Vu9o zv%iKy*xi14NlrP2-tfu_*CcN3fLAD4X2KtEds|-7TCya&UJ-=J1vGmF?v=&h@EZoX z9=E(=VSJFxOXVOrlJYq#tf(R-6~Sc4e1~MGXfELLZh8;x!mUph;A>aA?W?ehcn>6( z7I_WBP(B;BYtoGjk>4Zvpn%LaYHXJ0&<+GAhw@37X~^VGy4Af!Y_V9ug8t$%Hb6{Z z!Wouj&}rx6{_`llOHVAkV;q#^6zg5yiIyaE7$i6s2v#cefM5-*=ivz0V(734T;{Ht z8L$PA4InCDmFypKOh&Se;XcU}xRD0^UWgxyjb0s%MQlmJyN=x3k>`Z7I7<uLadmXG z^p~_&+1|p`JFxnB&H6`ZP;yZepC=XrkL&B4hTnN6s3qwsm6c0N<vE=QK9u|-)uEFE zn;Vq_lAtxE4<of*g!>-N%l$)HNM|{!f&z$O2_03cF#Lg)=iom{940%k3`z?+CX=lT zqm|wjt=+WE@!@%p3mf?1RtsW^ukV^2&UYubP-I|E;1A{CF?jem0e~7b6A%<o%+j8L z@@f;7pQh=1%OySmZNB8W<vMR*oiQnQ-M(?572xLXhUCMTX=LTd&?@def@l#uECzNM zED-(YDt|H9^Z#^SoPNPu_gABNJM!<T`weD%jGN5lFz<s+GI%ySb6a5s#^24x-#_fF z{Byu6c7OkQ>euGj<!Rc7#{R>9+x{FKy;S2Nbk{0ywIZ<wxGo05-nK06n{$}d`#m`J zOuphlP8hx>b`H9Jhkgtc0*B6blHd-V@!v5x<4KNct8%_CfWxO)O%X2<MXk`Y=Av`J z`iBZo`Q%SRU&CA+7OKP35>81_G)DNxys0dDQ<?i&jCGxyid0K~j+BM!!s5ALt3PG? zM~(rmhbHgf#HFeH&h9_Y4h>Pd!V4>A?98o$Cn&U)RvPUo*9dQZ$|%u(8j3b0?Np7D z&P(7HmVw=_y_;^4=z-vhx_Zz=^i91zb8m3G;Q3jKA5I7u)&@a@X74Bec%jaF)pKNm z?zvB^@p{X<pr}1sWAIA1mp*F+g4tErMnUrsA&Q}eAgSemIhOh^#CQ7UuVSY0BzrI| z5a0Xnvcp5_0L3)^(jJ&f+al5Ziz#(z2;hf7nzOIop*zkK9<=|snL_>Afu6#^inR{i z<m1XaFi%TU0m?Q?avZU?B$lmJPPz`X@)P8L_A?=VY=6x9(7q@xm3^MV;>&u+F%8n$ z&1>2`som5c7-0Y;9~UE+BJrJn@@?zpx?IKNw%hWrLGD5)F9}0u&Qs=jpMh|UXA@-9 zQ|ZCXW5n@T+caIIgnX9ae}UnDK8C(4%R9oxXrZjt(3cQ=7kC)7Kp+F*i@dg3z@@g4 z*bX`ZUIx>F%%NyVh;SG|Wwa?|IS>I{SHU~6#|>2eS0@)2CwF>T$8E#2Gq!5?Io$!^ zyV&)E<%u6L$PMSVLfU|ygNLUj5Xya78^k@8Or|E}*7U=*z4|Fwdz0Y1N`&2owShF! zG^I-!Em8mgfT&fExDjnb7OuhEJ2lKK1Fy1;YdX5(R@C2+VxW!5bWK07DA;!Uh}M@h zmgvqVbm#XfkD+WBai9cnrkx6~N`+Rx{sDAsV5X!_h?UGVei5Dl5!G|G5bnh_bOM?m z0&_psfn|3Lo0_rL1&-GPR-3iHq-r#14ONx<Y7Sya_#(H7w7-4Djr2c!7k4Z;5U(G+ zeXGsNXi_t#@k8t9_4KXmefB_%$30y{mKCfu)D9F&c)Z6S)o9HDS3tjBoH91$5TjB@ z)+;x%E-@`Ka6iDa_0ryOVmGNX46x(8#qn*W)dKw-3}J@zHvi#(jx0+NL_Z*hwg}rq zx_JQ}0Om!xouc@u3~~o(0c5Ps5<LdJb7dwyv%?#!f9M!s)I`gAZajKAnxE$FqlPi? z(E@qu<pN*CI|*C}StTd8tVV+jNh5$(3Rsx8MV+@849@$J6a3@6u?X13p>AzM!`XS> zSdbq|MPv!DO!4+d2+}3v=o+uW@ES`@^LE_;U6AXDf<74rx2iyqLA}6AEW9hjx;?BK zoMD*sdnlGLo;kg(!c%ek^fQ*ww4$EPCe+ksN)08_!a|Fy!xt~U<t-O44y#7@fug2~ zWHJ|;oSF*8Mf$}T(cV~%(cZgc?agMi2JE?wN+E4rdAa%W6$6N&U8G--A5cW<A8dBz z{UQ^o0A5#V6ad+g_XuO~3sSGpMx7{n@+4xKZ7I-QgKKg9LqP4NZ5|GAsP2rYlVk7- z>!c`*OcCmu27BO@a)E+YXi$C%aV{}FQ7TQ0Cw?vbKs=Jm<-a2GfUU)wdah8IKYi?2 zI4W}2g28J!L6gE1wn=F~98ic$#wZ}N*->LQ{j`|X_2lqyQrF7j>GT^7_$*bcTTVWx z>%m;=R@#{B{&}ml3oSSEE6m4J#)jiq+qThOJW+@;BV<)2k|P}(4I4@V?JADx;u`RP z#fnCtC;Ss$My=PH$#VI`iE=q<+_+&pHatH+JUnbhB8cpMm+ImE)RX7Vo%|<{JOLTN zeBzN^@Lu>6Z<+$61blHKHkCDC-_6cPM@OSm5j_~xBa`n;Bt3{>GNEaIZ?#&W=ljaP zrCj_L%TE?W#6r;!WC3-k$ZEXqT8O92=J}*y8_Dxcvu(8<stWWV-%@3|pKZO1Lan^3 zWur=xhH;<hi0!k1arH)^L0(kehnlf9lxHn-cSO>q*W;9cc{&g1Mvd}K(0Q8L+CF_S z9D0br=Nn83>%^`t3&edzwyg-F+z=a6t9S}KN}G;mk#NuK$h1B^B4OB$@#e{5aq`WE z*QG4j5RL9>h0SO-luRZ^flI`a8j3~&v5o~mS*sMPS~qEZxXF?)eaUWDcdLStqQ*=v zAEGrll+VquzgN?UBI+~3K1X}`zV@q#XJW%DTnSY*BJ^M=5bJ)Xoldt03WPD0CKg@t zk<g#C!KJLBeTgFV;#b$mc|yhr0WJ$Uiv8CjNZ+Bs+70p0G)$xRN$Zm}>`mKx>7j@4 zM=Jp-_gKNFN1r;2&+W5MMUg_qJ8L)%`k`|4^+^u{@$;l&lXv|7vgG!bjlh(9%2wa= z8FbYvtGDl!c~8*?YjAKqioN1fr3_=BO2vcf_i?wDk}m<l=6F>#*tHelD`2ri)Ia<W zCf%w_0NX(1C^GJ>Q<6Lg_e6AP*oGs7V<W9d2mj4(%MaXMD3?Jp^X2kF|41mVMVojN zbsAiiK|e@A)AnP-Z{cfm$Bxa(2e?O{{NC^Nr%yw_^=<W&3P}Se6|xQz!iDElj(IFD zF!(JQA+`=n70w{3WDd|Q%qrlphyeqO0cOBuKmaYO)!R;^Qq9cIXR4Kk@9;m4Z#tXf z$oe67|BTDuf^HfAqP_QS`Ng*H3;5o33ASj{SCt6!BW>^_IyjQWUOlK5P}}6-WeX(> z_OK(Pq;;_8R2L-Vbu~M%%+?W63>%mvIGPG{PjsXJT4MzfX8}+k2ZggH&!3;fOOYyz zKA{jD><z=fA-D*`iLTslMjafqo$k-BAQ2Set{^WN?vR>u12-v<{lG|A!ci!0g69!j z$W-bLK~`aAn}{R=3ZjrYQpEz%eH9UApMx^uIRu+!9VITj_!BR7J0_pyD6>ot4tq95 zfCO&@Mvce-jLrRL!;F2<v+aRLD{_vbi+cJx;>930le!i_JfxIB-U;~;YE^kU)DV;q zfYhvixv-GS(f<z`&B6m{I?F=KS!hW2!06tp3aeT*s?~0rcH#%+7Zw(N(0HKGY{~l# zi>wgxJFUSlNP7c#r8c*19vG+wR?!{g!2K@eL$sPQn2JDAjIf|315*-9%evIB$~A=N zF4i3S#F0H|;vRWJWS{Wc*eCo#*H@@pLV<F`B4u)WY&e-59+TS~LeZqtke=X!E$*QW zJgtYMlyuJ#*Dm`7uFil|h4(0A4g*mU_D6DgA|?6UCr0AYXnaK8IUx784!z<GJlFrm zTj0BxF8bP>Ms&ZONx!)a$U`m1;ro2`e{~+i*^HQ11`67IqdXnA0j+2ectKSHw|_<a zf8t+Z+`SPr*F`g8%mLzwr(@CId&I+>0y$zXA&m0@M?A^qBI^(pAfzA+=l_MmT%!Na zY5A$C_)KU<%TG?mr$a_w!@drfLOnTEnVZh%ON&Nwdag1BUcPq}jZWjs3&u<=atsI4 zp@<+SUVh?;rs0cIiRoj7e4f7OJ6Z#<pq`wZ)bfR(fjxu?cOMPY6Bi?~LV=$c1+6C9 z0h{VCV|*tO>+(Ld29HdsX;>D-jboBiG=-83N=V!jtu;uLg?d)D)xhDXPDm&HEE6Bd zTrKM6i{+3W+74!|A<En9rJ&BF8cQ1!rSVJYxqfus{?TCg_)yFmnLbr+&BToFoGyBg zpnYInpUc!o%y{?h2L<m%b+JChp{sfyXnPP@zosB_Ex?kjlz|D$YQRyjTu;*%AOUnV z#1kAuz%SxlnGW+>S$+~#6As_HXR-J8XG1G<3+s1%FmzY_*xZV^Yw_uig?F3X&xNi% zz1ZA!;Ns9RJfpU^f7wbE%;k(_WtPoCYU}uu<Cb>cTdeUXkKd=E%!2!fXb?VS5fNIh z^RVjB!Y{ic=UCQe30@IEU$hBUAW8r&gQ&Gemyd6+FD#Dz%+HK1F05}KUmk67JD}g0 z&r6^c=3I;~&ohrdK7im5i$PiuEGytpu%K0--ihS)T3sE`3D;@Y_Rn;-6%cpZ?KrTN zIEdb9-n7Xo?EcXb=t(k`pDgr%6<w0&9K%B3A44dh+F1W+94oBX$Uv`lRry}!hn1f| zv+dV5fzz0)ZNe5Q%p3sS?(Y<E>(r#w>)fEo=1s>K<STFyXdvy7T<T~6r5ib-5|MK7 zE55G*kVud#Y9vS@5I!0#z7IY-(!Z=a{wj9AFdRoZGWrRI6RGr2vIj+!Do8aKi{gf< zsmbnN8OE8-sF5a?O+KTiaUv<#iW(R#)X?-VHJQ+2dKyd?F!*ZA-#ewLTo9fN$c`2r zPU%{~HhQkuHY-!rnUQ!fAX1yd0qa~W88t}%L<wh61Wz+%B8pV<GF@!a+gXa~G^qkT zzc@Z%WQ)!6jgM!H0uQYz2DmPYU$&|tjuKW=kR(8Xh)sn4pg=y24WdsaXw(r;HwTFf zAfOV$xQ&cBkCv8>*KaH8n)CVSFP&Um%nRkw^COuL@_FD=>HIIA!1>#c0>t!(KU~a? z-d3JC`v)_Hzt2>vjUSH5b3%FI+#h=9Xn4^a{9Ex&(2X2Eu%B^(7a|S>S*VL&wv6s8 zcWcM<j;1;J<J#TgECG=_#@!&ud~Qj*yN$Jn=q=4<o%B6f1~z%~8C0eO8biMjHh~@i zQw+9P@t{M2xk_a&U^s?6ut~W{(*-lZ1D2gxUoR9yvndLN_4PB<D+WzPxu)_Qq4!#p ztEjJ!q4(!0c!nJH6&|*nOg4wesP0)R70nr12ILni@)jy1v|t`NpTUocGOB#gBD!c$ zK?S&2_axmrUnl~{GBz|dH8!Rid<T<IPA)|^Y%VWPPEt)KCzqEu84$$P>E7_p5y>AJ znHf%P95?6Y$azxMmkfv8&gwnz9T{d%P8uUQ#P3ABm9<JEfaHUmREo+D)*Y&7cQu<) z#WRaz<LY~AW9c(f@17ir5f<;R#o6;09&MQobGejn=JL5GlL=@NzF2KEtdWti>DsB~ zV@uuN7=v)lx5q96A-IdAd_(hzV+p8ubo4ckp$_`KMKLC`WP^tVI_FA8)bvbzaE7mN z(LiJ%u0q0~)-UB01G5eKEHo$Q<>CW6M}6$OCTvVe!)j4`(BLuXfCws6SL|DsJSEqE z9v6gPf+ko{m<@72fFMnAyCqzVI-Gq55W>m3=-yIOZLkTpWy4#W%0sV$BNcdR#M%OZ zrj3BRjCQQq!F*^Q(;`v2hwioE)nL(0{7>^NNb`f&r5tF$dD7MQ$LT8DM@Atat~bP? zYzMTt1UG?HA{{Fk$J8LL@}6@!RZ&-0E}vdHo(_g6<?#mG3K7+`S_KLhI54w+#F{I^ zfcgpo7;SkY(wA3ORX8GUP@>~dFnxUKG|Y$E{ITQ5kIfVB;~fb|Zt^=u`g-pO8W-lj zxV|L20k4wHmFppjyg4KgBniLZd{N(R&@PTnCxdVXgN0&UDD`3iB-=Kc2zW=nA6wfi zD-)H<#LCJx0tWY=O;JrZ>DkB)jR990crY|Mq0&^SL|YLF5ei}p3Nvy!aUB1PItE_i zs7ePvc<HDSG)(^+&8k_2G9*(uHfNgUxw!~HcJO44%sb|>`H}(-QvvU#VEhkax9&oO zq{oyuEAK)HU7(PwF?C^E5^h#2xffkMBx1d>R@MFJA-dd;-c5v#0jDH^<Ml5C;D<ln zr1h)vQ(NwAxw}L+q;(M;`1tC;CtKdry@lE!9Za`PsbCO@+`PnpCVu3Rf7{V()hb}J zxoWkBj+XsH?cv$XP<wbUFi>y{uA*SCA^;teACQ!@k@nGn_rC+Dotv#z1$3$ML%RM$ zbkIb2b<x%@kr;SM$LqhJuA1H@l6kyXq-p3g6nZ4hB7#VA`yeXeV9G$cDix#@3=f9* zCQVwoH8RoIxpmky1c>_j`Z@QwI#X=|C(z_XqflC7f~V7^$-$fW3zttqO~?wzkP^Xq zcw77e>;$vWwbTebS*8Vu7JFJ~xEy3-qYo5C7POFJl0n^DBS{UcfVK`rEIK)lSWF*V z+1}nhy;?kpaKe{Qp2*_oMA6JZ7GC*JiP$?*tJ@dCfzKz*)C(~+^pQs33sce9gXccH zxq>?~X7NOJbToTHez~}M8qZoOe?Aa?A!Q~+I+oa8Nxx$)7X9$K2P+}<3xUQ*s2}?} zuQb*gi!*LLfw7E+?H3>AgUC-2Pf-mXli>)cJF;w5pfSKND#!9i*!{ddBRv1PJ^N3d z9nFm8&zw2$?cYB)TN<A)XGdW<IdSsR+VXOF9yv;qV|QPEgEf-Pnk$P-quJ5y^2*X; z?rCH~H0XcBJGkZ@h}!uxXYym2(X-zE!^vP^Y`(m_ymsm2iBeIFX3O*ArP;YRT)unk zvC*Z)6*HS1$t^CeEMx!nq?Rz~|C)EO;T`za8L|&!HAGZ!FKT8j6M){c6sp16#*wI@ zafg#by^>MwZ?*$&8q<x1@9ut5+}P@F-AY`*&{K@U`NZ4<e`bM?Q{6<S3*>!4B9>)X zbK{2fzt+0H@7E<CM=pmKl@BSOP!vufxzf<!uu9IW+mHyzYnXm%twos5l{N1gWizHz z)J>}zZHenA;w)j*^d%HsW@W_yWmFE?xoOC9aH?L+i{9A?1NiBizZES-V}KZ7yKpQL zUGn39m!gql3o%?8GOAvD;h|(OGXiS^Ob#QNU~<SiUp0cU=)wYgls&bNtMPFpi|*-w zt~;LG`CFlU$o-p`2nK-Y@dJs0?+FAaCg_fbyeP<FJ%y+YIm9u9h!FP9)&rps-599f zkgt+k1B^!RbJG)$T^o)|_b598=^fq(uim%0^q*I5wN?N&ha#<TYy@7uS?f~()?2Mh za58Y~>=$qVoKZskF|9l+4~1(4mq*>J?;=1E9Ci@D$J~Kd=rwF`i0lG<p=%$c>vlX0 zbq|02e!aA|R?@~Qb7N48@iW{9T*K4xDEauSeO-J1sORUVdylQ>XN8!}Qxp`YDg7LU zWP3cxK7S-H^xy_FNGTz6F960!n6NBX49pwCb#l}BZ`L9M--N1~b=i(T`+}+dK(x9G zHU)t-b}j4MRbq5Z{~eAWq0np@wgG!H5cC8Zp{*H>wp$jI(z%K5Ez9X3O;iq_25++c zTA?<9DhFt2l5MT8r@rNWRjKA2TpF_!a|$!_b=CLVElbu{q-AYUZR=aCFjN^_VM>uj zl|{7;f14awU91`CUpFV_|CIi%Mt|VHw|`sh*WbUyi%Q;a2o{P0W;#;3)Jd|T{|Y2( z+PUZGTBbsJ9{gBBApyaG_-HwnXhGGDPw1y^o3{KB8h_$^EG#P+ONMF*8@4CB10D(B zaR%&^WULSv{Kzv$5#n4)M+!5%t<dWXWYVRds^K_>dx)pfC(G0?Arg`IfA#wHtKKo~ z5icEO0J6fBV<^u8jpj$d;l2o~!N*ZZ7O)AcP3r@#C$9U_O1{yH2RbL04_q7^%2<f{ zS9~9~X^HAx0jcW|3JsIukSpSfI+6)QB8d8wnVLb!8Ki&F5KAWzr1KkMVsersHQJKg zLj*x?{Z}Bo_isb&ul|Ro|2qRu8@K{pm9EcBp$sFD2)&s8Q3m9s(P!Z=_Okym%|l;s z-G7@`(EY`Ib>KGt)6j3EOEgd(3zDex^VdO-2$fW;lXXwRp_n;mU=$ybpyXg^^tQr+ zU_1DS=O$<l;Mpy3K$FmMtpXQw5t*`flxLK8D_|w%xIkwyr$M8G16)I`SRz+tEQM+g zt_$)2`58d<aS1#yhgtBVGQb7L7kxn`tyz!jAVmk1M_{e#=``}f7&73XtnH_t-nLY4 z-=St}vDAx%^>T01xktb&M(Mu|)-Fo_uXzVIyi3R_Ledf`_vC)#P21a{(aF1?d+zSZ z(a`qxn?%}ki1zloY4Q|G@6tQyXG4Deg!k~g_i$oXxd3_ZQav8QPh4)hH`UWyZyFmp zF2wPXu{Uj<Rw4V`?z(eviKXCm5P*{bY5-^iILwFZ3IW!DkXF<zCh--dW&}^p`i9bL zC+{=TQHz4)>eaQ$mC8mgzq0bsJI|g~7uAWebb2^7I$HQD1zDm>8KSyzN#`)T>io)3 z`Q&}owY5q`4P>)w&Keoj$0nwyrzfvb+$Dot!~OF5DDeIFgK=dgAWDMnLO0<T-G;Hj zWm|_nl+Td^f1V3XMP9G0)saDv!fbiJ+GuVxXRaWoyqi5oRMcE<`|P>%t6TTogu=M7 zeb>dc(+{}J-*OQSoV6N)=!_z87D9BXQ%lEJSC?k9kZ7PDwj_gk-`48+b7!}6Ikh6* zzH!gpCr_be7KFU`hy}$&U^KV9TC2g!F`x!Q!O_u$^2#c}OY}&h)2dJQBOA;SQePy% zJy9gdj~VJUjCxRpBc#2%Nb!{)olBj2;~URyZ>K7uBV;@gAq6T>(%aj({cL(}H1Ej` z4&-yfOHL_d`vt01#{UBwO5P(fcqPv$EGb+_SVg#tXdY7^&_FX(tSDW@G61W<LIndQ zl$2JRcw%cGx)Y=ptDS9Q#WQS5aMools>M1`Ji@2SC%wE+wxV)Y4lbh?2I0^$wLPVr zx8GL`lzQ*0(T5&Qn<Bk})Y0=eWL+KAoqna$E<|=(;b=L+f@E^krWPCUR?IWj8Z^Ps z8i?Vcp<zL5u>HZY>1hN$5;<>gkYd=z>TJln0Q4Ihn_9EZm@BH7fm9*_)6-+#9z)F6 zHq?92dSeV@O0RG*A58Bsyn$F1!g2QzV4G~WV5Rr<U?b1dPL`diXE@?irzX>>e13io z7|V3}+~QL3U;M4Ee<KunacFvG>83~Ay#4o7%d_LhV)0F5u3XNgOd$}cNu*P$w16Ue zXtZ2jPN(6BarO~YT}x$02;_-D?CJJtUrmN1<I5K=ZWS<e(mCsi$F`{tFqtr{FiyuX zk4lvQ2lvugn}+nUb&l61+Nt>8ecCWu?hZ%zQ<7rMN_KzKBGiQEL#1HMr<4LDGxA7z zTKOKx%QVJ4%9Gb(u+Hqs+7;M$CNzqM?qMDvq~#!KgIYzH%wj5ghgt|q5AZ;&4XLk7 zv@1EYx!MxkcXp8zr^#e%-Cq^2^dw72nXZH@Pu*7ha;MNU(ec^I&}4lsnkoKlbS@k) z1Ho||XT%U9>qleB=>i1WXf$0;4Sb$GD_<sGj8{J8e{Ppl?7cFO?!EU}+=EvJ@tQEb z@+;A~`b2ngmS6elxIRU4xQgYckch>zGugN{o%GHmV{rub>+_BhNq-h=!M7{#cM&K1 zfFb++B(nQ@0{RW8kTs~!)QU#hWO>-gVo8CX0>DSu)8^RDzYbjmZonL_<#8W8SlFr8 z-3-X|qSdQ2>Oas1-7o(4v_ZFORGxhH!|&35@Z^)99lHsx-`~D>?(OizA-x@o9@^X8 zW5%;@nyc-e`ax~>v(`;aq`obJ@V}gKUNC+QECF-vu-G67N#7SEf<^<eLtBDOke(0Z z1=IwqvZ~ncdFrXghH!Vc6+aXDs-FoJ6i%hbXoEg%G@g3uJ+{01vj5frPF5hQT%Yr1 zlAw%2#<W?#d>oX|U!XvV0qyF^Ak*i*X@o_fwqMS_q=(Xt%)RlE61e}7A||m}Mapvv zMf1Tsy3V7~iNb`Fesg4eY}Uf!MGKfs<p}j;p{!!SbN>XqS`{d6k^L=Ff|b0cHRv~@ zg~)eS1+0WLX}!bRfoD~vs&B^H4v=v%O|Ql;4o`P)kY<xrkhxr<>HpC3e;BwT?5eKC z@D!&V+tjPm!x!VvlNytCq@$zBrvHQgc;EuBGaXd{Z%;W<DL)-W%0h(>inXpvOU_sP zvDE)DvDU$g(fi!kUIdXsmefpu4iqxL0TR|W;enhMtxktPTishXZlGwiW@Ei*DNkWk ztRrhNf@rP6>c|Hg3&<E1yoa+P@7Ei=gWv!=Bo;}nj!~UkU0J1wvjj-VvGTekNjT3E zewwAunSp>tN#{nBX%qNmGe2SxzZ+bv)b5E;N)$1a9m*r(2$+kZWBP{xRH&RoMp8?t zE0f*NLMXiw@BRdKOBcST>;G&jGjv7Q-w=kZ{f2OI$1r%A%}u=ho?u-4VDg37Xm*U) zB2oBP#>j}exOA@D1;2nrl64R)e-ZWvx#`@j98iV93M{8I;u8;kEMYC|S~qtsH4hmT zEUwWzf|oGIGuuUeVUsxhC_*6(d>DM^k-2i|EvNk%agWZGOR{7e<E;&@<`P!u_bJzu zA5lK9w3Xje{!;lSI+;VG5Pk)nqale1c0E-CGiam>mA|CwM#plm;UtMXbZZ?<_8b{j z$QXk#n&@#NaCnqlF%CG5HJ!fB6j0ti!$PfR(_oSaVP^0iJd!1?fx8;LyZo<~_xVag zG<M%hHDN^~!=Z2(>hU3+^cth1Md-5;U3f7%Je(#0#M3i4mp3;9H$HOVV%e$IvhgHf zH$p_cz2O~r`@8*D>14yZ;_ZL<j(6Po8T;-KyE<ZG2gBjea3sn_&!iCyG@Z}u+04iY zYJ@6@axPDrl(e{T@xwO)o12$w6=&{+DAg#LL<nTLx4i>zKjptlC!h7Mc>8mAyyH*q zc*nlC(At1CmIOiYt`y^<iq!$ghyq2oVtZ~FihhcqpRFM%@3vY%Fy0c-ztD19hOi7{ zrE(887k>A`iecPSSuuha5=Qhw#!yA=LNRk8y71$bpQt<x%^-vZ8xCoc&C$hX@ZrVL zceHJrUQIMX&LcNlwA8`yRG^7NQVhdGc<wOuqYWdx;p|X@5q^HgNX0zV+7bl~q5w)u z-kDg+n3<<A6|Vue(negLSq~crng^Jo_lXo;<j}a$Y@%EwAGZ+gk?6YuC(uBNq(Q4i zXkYpPIpcDF3CKN)1Aw*EM6MtzGBY5MuE4Ra07Om2mA_`aSTC;BHv=Z-OrsL1NZFKT z^&A#mirh-^Tq}PG)HR~bhE>(7RK!NwanhS=rLrB4L_(0=5q)+joBq-GIW=(U(hDzK zx)e~)#r05r`@Qeo&WCjIr5U7|4}=oIP;?}V@Im-VtJ#t0$nX&1*YIdHk;=XjSbyr- z^>rcE*PnfAJrGG-`r@K)r6aQLG$vZ4F@x_H0%H=;z7$bf=ybaS2fx;?FmLX*T;2lB zN-}y0D2G!ND=!PC0=xyA^Qh{`FN-X<EKU$n+CoJm)T`1COLwd_D9STD&1!H1q)<ZC z5N;@2+}$LHEzf!Dr9i+4MWXpYARmo{j1Q5+R^NSV{t@_Y!SC#e|2-7WrjqG!D49+t zL*aBXl?{i)o22_z-<@k!Rg-FXIFpI1YCMw}4y(zln&x-t`j-~q`ete*mdp;vlF3+V zBpDk?VGJ-|<*WNSXcB?(pb<cQ+V@W*ydt1as3<%sk@rQ$H=}!`n;Kl4B5?02Nnfu9 zW?p|Z$mqV>fYaAY{`v<3AL`eh+TzX9+spI)`tg0u5DB6k`Yj+^WOZ*VsOnXJD`;Bx ztM6(_U$9lQ#Yn2(7HEu!PnR?g&FV?zJX;ly)+&|rwG~J^w9pByOpq`*@yXpxVBd$M zv`yXDTs2eow=sDVX(%W0-}DZ4yn|Q0gWj1Vv{HFj8--_nEt!Vm6aP)`06C20nM>Y5 z?+nI<q-zf5#fprUnU&V|N*O={7skE^vW`jN!@ox=_y)K+d2SE>-Gj{clD2lclP-dN zKW@Dbe-8(5{9SG8KmdGM1R#+!y1k#{^~+NXVBZg1_v7Egp=;e=uTJ%#@O}V1qSbg$ z9cYt^a+b5Qp?Z{-*54=u;qO&jHUL~v4s8jkPLjN1z0|pZ7!K+dHvI+}FBA*$Sai(a z3>Ob;g|C;9D!j@YF@Fuw9=hkTaob@Weip?-VSKRmKX+)|FCj^Ixyl<_MX+9+VLG`C zDhZ^2cAbER(xI#Zx0G$fxR!hwNM!`W1x~(sqL-K;Xp;z66;c3W5jp-div%E?%c68^ zZF6CA(uBU(m^5FQuT~3%OlI7S+m;<OH_x934bO<>)pI|c8ydEuyc=Chgl0lR#&B>Z zlz6jfnv;_Yn`?`K;0*0|Gnqo6TAg26Fk|$Dl~OXfMkmf8|0x6+ipb8f+3iXymRg3^ zY<U?66&H)c_*#k;OQ^StjCCb3hVWtmFcft{6d+#KzB4N2_(X;`EbAo@LHP;3c(9fW z#WctoZjxQeFggRDXlbU^8HAb-NO?)xQ{p)Q_vbw{nl1XXY+AtRs6`w|-zVQI?|sm? zy+ip9^beuI{AEVO<-rrs@A=D!B8PJ*>q!LN05T308KvY_hhrqL=wk+upxrV26&m~` zD@S#5jCW@(!^mbPan2C}zSG6x++49pC@b&ikF><r6ev?Qk+_sRtQAmqXLd1d7qlo^ zq6y_&<$%~uhL$`v2})W`CNF^%*xy#vw>!!eTJ@-*fNJv+j0X0e$db7XZ34!!P6$Z% zlgi;ok#Bc}z_{$21-A+s06fe|l<9DfbI+rd20t0p@A#v(aStq!hO)|nW~_;uNvLIM zv`s9iV*r}Odv7>UL&)KPfkE*^kkkmOG!ue5e+^%k>pWw0X^d<`Ckqad5PWy6F?FxZ zyG<~fij22Pj>{!9n2Kl?2m~$cBkR}nDB24~^Fh^cE-zTQM^M)@+Zf{e>a=v)qgf9( z42uSN@w5%^x}n-i?ZY6!ick!f--dz>R#ij-fG^3(AkE22MjGQC8%=sWtzV16F}Up* zcn{PwU?ZEhFm9#Ox9}XIXC3AdN0eFE`e8oH!Y>mKV1LUk%0^Hs1okOQxu<*n8*rel zm669U(kNZkA}jN@u<ZGjh}ONe;n!>;?5R(^ds}hz9sG$_?h`kg___Is+-=2w$AFU5 zaBRo!^<fKg&J>W%ck}w=mAEER)~gztfyx~sMs&Ykm!qW+yF#oS+jONFBVUtsXvj+Z zNq}I@m{Vh16*1BMKZ<``?EdqCDjgV1O;4P=f<L!rX$fx@pU7d94m3fhKi&IBG_q}U zjoUXC`1d@p9!nfGfoe(-*WBL0{5qnZ`#b4nxPm@nQ1=)Q&r$yzT&aOVq84wrZcqo^ zu-?9}3Ily4%iLxg3T0SY1OEt_3MKZK>HYy+c?+ad0cAihV0EMrF#IuGncIeJios;p z7tTb+$B|EXJn}u>!I}5Iom6su)oS;p*u+FO6O-FFx#P-d-7HZy5I6>U`<t!7@IA(O zI5?Ugm)jPPu)a*#h81WI;(;_2%h3W^55FV>;TH&bR`qWI2P2e=Cr->3i?b(AT<jm| z343&W^byk%h2p8LbLX~B6$@hE_}aChh&5Cl+WbyV805*L?z^QF?Y&R(5Ikxt0jYNe zvJawj|AqY{{UqLOml6MB;C;Swbgw>9!JDnIrEB}%T?UCEE2GEQP#+O<!+cBx5KU-g zfe4}nz5mMokv>WfUOeLES2w4rd_(fpJvsb!)EhBP5N_!3dY__K2akAl_v(ipr+0@V z`|EvlfA@W652?2M?jyQ;@YMtLMw=rh5@`_KcBV1rK`I(`W)NX!C0$9srTa%-n;-ge zf0OSSXLoup+WXMgy5sEd*ZN1<-uE6gw|el@L+Yzvp#)!tzE@nkrkg;I4zw}#@8NCC z$RJ{953TGS-g(u1<-j|sUk|UR43-2hs6%OpJC}~A=#g{ji28CQsH6J!PUCrCChh6l zqv!|8!C)c}B_DU3!vinITIqi`(Jt1$A5J#~tTKlZ&O6esu74&CzPos2U*o0ZaDT{n zM&$RyNVT|jOV{x?P)~Z-QDYgL`k~|ah<9NO>r5E^ZHjqwRDZJgb3}jMaV^@j6b;n# zPIDHDY$UKce9qo!4Zb?K1n+(K5%q=`se;u!VjYz9;_x-tBN%(z`tb3)g?B<=Ib!_Y z>78BgrF-Vh|FE&^4k&*e|3|&+$^rA_4r@9`9Xn!L-f4Xk*Zd3Io;Ia<b5vil+w&29 z>5kpQ2M{{b&p=WeOPe$yEfnZ2h-u^vaTC(dhE>~$-(DtXU8%Vch(ZVtJi>)7&Ccev zX+p0Zn;1t#o9i&a`=V|e*Uj14bd=y`WQ1Y&wAn<laNPN8|7~tNcx6F599<R|fp{(* zQ4TEk*YS6F0lvy9Re1h-?*$(64(}xp>)uGVM-<{^FLbSL9bS;8FT$-{A6|EPDC!Aw z*Q_dLo^Sie&KWr<>hj@56UssNyRxPOS<}O7D-wADAjC-(8`zFAZmuH)WOwi<=$|e3 z7UZ$szbgZ>J%wV2vn{er2sVz5%|lT-eNhMyGLS%j4r`H&OC%bIQz+VSNALdH44`?_ zQ&6&RuhyofMfYzq86Z9I|H1K#7su(p3rLe?b*;|w{QS(!{QR=KQ-14R@@D8u<;~+4 zySt<+l=Pi-o19l(qWj22mNFVp4#rwS6at0LhOU>h&_+>IqwgONW?MSaS^~V;HW8)# zg=|+L4>>$9Ksw>x^C<Qb*}m8VZ$UIT%w{B8$QCrXAdvXT_B3Ey86Eap!SU}m46?yG z*|M&0WPeH*3PLph+sUQiOiIg)%#Y6p3z_k>nwdoslou={66<t3!ni*bUJ1p9H8G(N zg_grOQpYru1$rUTfqvS<vk;U;qfME55SmwjS%ifYMQw6{wyEoEI&v`<tPAqKOM#I% zIufM=Dd48AVslTo=o{pyi-&b@VcJm}$T2<%oj5$u8bv~Jk!GB5Tm)XMNZbSolG2ze zH7|_oB`YEkDwcTMW0pAGdtA%~o!b9gJ2M=aEG#S(imF<qeKZU|It(5H2X`WI%_vkV z1w#W))bx&H(ZkNK_rJUUxt-_+V!kb1y0o;g5C_5mFQ6AaGn||u-R+F^#1oc0qR^Q8 z&vklV8F)}%Z_)<UJ_B9si@a`-DA+SbGu4(RNisN6bFDWB5Db_t+JzNauugjINSIL0 zTD}gu0wiXn^8|h!U4idNG%2jL9C-+n4>oh_;WLjcEC{3z%f#b;-^qA9gQQ|&Vd0T8 z58suDrBb<EDiurUiDWJ}J)O%X6Z#KJpU9b1JZ0lQ0S#Fj|9m#-o}7+>BrHd=*}#0c zJT*B~Ec=}#%f+F|sd9N9uznP@`&bgDo@gwd%qNljl>&ASC-d)T#aldt&`<aes48iA zrM^%N1l`l|*f55&5~ewcAxip$1!y(zfoDAQ+lR|x1E^bS+?qx*n`heL0gRyvjR;KW z)bbMV$<0lqLqn=?1i)~yxRrxh{H83eY^~Uk(+?#^r&v?n0=rqXB4I;E-Dlv1nofT* z96<!K=)w%n=!SKuj6k~bp8C{n82Q<zho(7zO<RQW=)0+~Ag^-~p2CMbyvMn{47Aq_ z$JM@Hc}Ce)KIpX=`%cj8WA#@AR(>~p2}LzoTUG&l<>86AUcNTkW^l7N|D{oYm?1xu z88$%z(>7}BWKk!u0Kg)Ydlnuf!tf6fd7K`f`~RtX6EH`v`#!K<RRLAF3uoa*0cae3 zqX&&f_jLDk4Tt0mIpnZ;3`J5A1s$X*iIkd>Y*CUAM2c<7vZL9Ein*q}f#geyVtcfa zV|o*LVaxGy*WTUH=k>Q<JDaqVY^=|A?D?G7v9l|1fB*MTKw<jeA!omDaa27N>U{72 z{`Ucv1J#H(zhN+cED_B5$&3{XeS`G;y!ZB<{uK{@OD~7C+8NpKM3iQM;$Pm6(3?V2 ziFgdTJ*Ne2H{^?UveHiG>SiOAdODmkLg}1Q4e^XY!H1^Zx_@HdKcUa*Ookb}puq%# zE25zwJqk9%7UPCf((v9d^=R&&45uB@zcdas9s(4PK<Z4+DGtqV23(zje$M(}7G8(5 z(0uL90PPKKgLE#yZIR<iB2GS|Ubc^iU9w>~b6sT0Jf;5{rU+A~Ov7-`;9nW=3@M;N zzS-nId&2B(G#Wl%GmT`!mabE~(a?1ZKhsU0?>!&+$jZu>@cqb%6Z9vbXZB_RZkplo z@^;qiF|@oE%z3>(X*(}a?&<S1;pKbJY489J3Q6TC(>;VjFC}`q1!)}xh2wG4RTfMH z*+cIQ7)Idjmvg5M^@)%8Vdl^Hk+I2Q+y6`q;4#BU_}Mdw+l|5Bs0I7-ZQz^CE|4za z3l7`h2D%8hA(AJ2u?XNzcgP)nlkXLdaiY_Qw%y%qMpNhZu3kO2mx?wwyVqFmo~NF= z2N`^jT!zxq+_=#3m#yXHvgKdDz3Ie_KjoAIV_^3_5G_Xc8coKUjXg9!FuJj|x*@|t zzeOjY6WxXW&QeTgb}`BBa*mxuq0=+Yj$?Nki8i)831m99C7gl=@yH_d@D}QR{5USp z;<qca_$_xV{SKTspnq`+_Il|U8Xd%Q3tB?7_aZV5e^C0e^s@A;(*NW@F=)xUs1YE_ zj+1LQnG<M93Nn&_0McS9YLL^wSDk8-#3W9<2nkk@YjO=cKygmLh=n9(at#JPO8-U7 z59SB-tCSO-gng_|*gVN4VMdfB5(KWQ0`$PK5(H8_sT2FB-VP7ZITdI>0gzAY0dLXk z(=FYHbwD?<4PItGwPvQ-1&<&kU5^|LJA5f$7w>a8NLq)3vZu&?|GW-=_q?WRnx%O? zT0vJb!C*!K+VFU>34auHPt<2;&)<d+yYt!q(3Vwmf8SK)_JIS;uQ&iXre_(mo<(K~ z)o=M#EfY$FifT3zjHK0+VIX5Wnpw4o&1s$Qf_xR(x|tCa_pfEy<GxMJyU=w%1$-G7 zaARg9092?cavV_?NRmoFjC|hE!r&Ge!n%yOtZ3L8Fj7}qYmBY6uAIN5!riqAzXYaU z$~gDzo<yDrE=<8glj;?duRVrX*hMOh7Wpuf#RMZuOfi=rI0_L+gnSYOxB$BVN;r@} zwg!X<>7>E+4sv^}e`wVatf_~y;7a^{e|_J-bLA)#k_<+O+xTZQOz?y?{ukrYd?Fho z8@5%CFAxbP;0qcGMvYK=KN$mRIa26!W7R_p#poAjxZW`*{E~&2<BvvjYg4+NY~O-Y zpyv|cFD3v@feyvwVLBloi9E5o)M)^GNS*Lp)RGEUOA&9-O>zv=0BeylHP)vDHAnBR zy&R5Nk?5Ifl>k1PFU-#u@-Z~M+RFta;wfsTx$qTF#3(G7rdBLg&Yrz=wCCa<^J_bX z(N@4fW<hXLqFQPSO-=g&wgUOX@S6yRwU!MC9Toy?P5&*pv;vMEncq(4kx(ATozY69 z+ixF_E_*}daEB`rl6>QHoiB|O(cyK=y2b~>joVkG3p5hwND3(CBCnuVLhJ?d0Csb$ zbAZ}VNAtLi7#QeD;L1V6DV@aWADF?pIWUv88rVsvHJmo5t*J;coEi$JtslJQ9Mc1D zY5fubrVt<;{~>}wk#)ufWqTab!Y57}lQG{qmYvW~fHk0NJmyRpp3~XXN#Ps9@}wr{ z0M4g{Z}`^Zhj}6#4BR<InB-1Ua(#w@{ka*b>nDKdU1G&Rur<z>6X9hz?YEx$Qnvdp zTF0`rA2^kNa>L(}bZ&|Xj^i!5nu8tqbf;;K#+&35zc;U?GYbnD)XVT$rHze}<@?h& z$1Hv%96=Dj9FIrBNhGh7GnwQspZ3sGzM_gJz8zYU$EEK8+zH=gnmF{Bgz!P?DZ7KS zf_8&TO+bcJ*WOtX>Ql(>S_N9f)aC30oq+QYC=r8Q@#_{26G{aa=GL1$y~Dt0>aR)< z?Cli_<KKnC-rfV(`~B<GL9<=fLd{!;P=C=OdNZ|W%cUNO2YpLrCb6Z(OCX>8b!l;l zjc)E+2iK^(W;^iO0TLKG=W`L!DXa(y^ShiLqx|snr9|)~2vO%GKnq0P42PE1oczD1 zOgiqy3eHOKS7IrK1A$<?DiFG@)w;57nm!-C20+k2qn&D6k+YRqdNaB)JK6fPldT-w z^j`wvyX2?LYn%QwmaRgg34=uwX*GrqpFf{Favkfza;|cAYlb4(Cj#5004@Opi%VdM zOJKRiQ*AawiDDuVc_@e!($jvWYSFgzgoFPC7!orosBxY0N)fa{pn)Qehyi^Savnmq z&xX*>X&?)`@Vw(0HJ}X<46u92?!N-PtsDHP9kF6sCOg;2QMxATRO;dNkA?O@Q};uO zw~JM1Uo!(&n@A?uY!q5}p7i+Hoab!k&YyqyR)U=?KWI^;D$C5Aob~-SC_jD2EBni4 z@F67bD8hKolaj7sRB#DCLe6MSWCI(t<1YB;_N5<@eq6dP{hEYHMHAQyMUwbvYtU8# z94V<Z7<}{`p)Kk}5+BSug}4*rM{iOVG14%jzw0!aX;+Af2-*X42o*9hiQe&Y9qkQh zRr#sL#G1~c(P5+?<=F&9LKkfBtV6}Z&FmDe33VTNuyJ9<9UM-0wau)})><_l3n>aq z2bf0=Gk-W~?d;q$?$$CGX+4bcN{E{CLIJnLgMb3*bbTSTbuJn6=~o{^bbdB->Gnc_ zdAxeyJ<mS-o&cg_VzEbiKb%Y@fM_`x`rdQrcUMCJO;MmXybw&pvx$h|izG5-<bDAA z=$V}|Y?w;bQL@J4VU1-ujofH>A$o+ZF39;z(XQ9WP=)BWEYb)Ug8`^l6(lff0_tTn zJs~@x1r6O7W$yqV8_|4Bk&Q?qmd(ZzvA9<?mHUjaW{#&+%(uL4L=(w)!lMTK{|JHk z9_VK^=y4+f)Bh`YipkuY)q(v@>T0L1g{N~B$8!v?p{sSfAHF$t?Tl*6n)C<yX5SqU ze*IYP08<IIlN~)#74>;VZrVN2#k&y6_8_p)N2HGf(<cz|w~ARMR~sY=X!s$#WF7qO zL2CA@S%bJ+P0|;Y-LW7CcnC~riF{2BXJZ@FZ#EOsF-#avh**6&?Ah?JKv0Y1^`$dU z-pMvRQO%9MMw_T_&a8ZX6R%59fLRtyYcO%qZz$E=EY~em;Kf!tJv5A;+}+jvzDN}j z%IB5b)48G>gAJ}-Gi=l?*=*v4MXS~0YlAO`?k=Ah4CC;S`ge-oGt&1U-`EQdem|DS z5<zfd@r#@IppDy75lz@RBan^baSUYBs;;k9wmh9JwSC;bjkW5Q3dJ4xw0d=|0<9hp z6=e{o6(O|aL3T}p2GFm1JSvhnQ8St2iRcmTsvwOJ!gzsj=!Kv}_ZBsm^lJ}Cv)O1i zKR=((-Yr(N;Y7~%H*|kM(-GS!%U;COpmvEj0GfuVMqJ;kC@{ex$33#ph)rG(-{hei zh#>dM<y0zBsUVuTl1L#%kgKm35LI&p`9;CiaR)%+^5OC-+MGF=5>`PFYDaiksC{nX zZiVXX3>n2JKAZiiru7YD3{!xkVKf}Lc=1U$^gOU<7e-&0Wo-wuKR@Kp`0{JXXe1O4 zhOPKJ*cgl~{oUu!%Wg<#OG}r2!3}Wk_U{Gbp*b1hS(=BzonPm^{T67XhAjRiNV^n$ zL;1}lJnA|nme#6kS`|>@(8L;&B_)yo7qi_ZVn$umoeKD1aZ&di;H1%?)ebzexwA!b zyk?^^>pz~lgrwY;=GyDKyX)<_(PNMIS-JF?fAJaPjyvD^&O7cj{%3emdsF^=Zox42 zjfGs^kDsY3B^w(|KK9l{MXkOYLNc$OfifD_yQ`{laqDLrjmLL)WO--z@p<O=ds8Uf zhUg9Ge}XA5ERGbtf%y+unA$`rSIAw`TVYQoOy=<Sf(f9<;Yzt_B|6a?P^c0)=6`yL zId~oTiURd<0PnlHRwXGOt``863g>Lum+ySS4H}{?pH(SK8D$>hYb)?&ccm{f2{{5H zM*Er=ac9eQBVDV;^1)a<xmYkhABu#7ddwF$b14%Hn<?9~;KN0Z-W{RvKb%~SE?fRv z`SibZS0<aGBet8)?xV~^uoO1K5iP?0(yx26-cU3S_6=2!-F+_XrT3uMKXw|vixc}p z68yxN2atRHraj0Ku=sIJ6me4om0<kHnu-DIBE#BLNil7GJBGba74>)P#jpW~31(t- z%g+<>96Q;vcl8wA_?KhVYD~}R;e0-f)$A|y_f(cW2OjwMq<<s*2?RX^;MPRqN=KQO z05{9uLZ%{?1`2N;bxl(l@3DfL&jwB%>Kf?FS{*7RWF%Un81)u-=~dVqIpPGCfJ*_e z0nUR|&D_0!dt9W%g=p^ZScf$a#Vb-YJhC;DosrJUwXJ({L~fCaYOTewDVS>zJfcgu z0=H+7w19UPUw&>x36e%`Tj6>+j+rppTf$p`402knO9u#000^)@54+K4NY`XJmQKgF z!gU>dIE#TNZ7wY~z)8zdnMKOJMrbQxrm<bugNmZ-%*&8T!p|5ePg32ml(3GZm{3fk zg1C;g?hl1fC?*n(A!P~+sNkeEee^}}#fa6F6&4IL%@<azjwda9nK+jh>8-#PYd)W% z!Yd&ZhG&GV`fwtzT<mdu?@+9+<`Qu|5I~r@X_g`$Ph|9m{zwV386+<~p2$U>X)L)h z%JfMpdOfn~JPAVm_3?v;8uZ|JSXn9JCUxACk0Gyw2VXg;SQ{$tQ}ZKTxgU>?B+?3l zABOuz6?$T?{GH?8QDhWz)nwB{eZ%N{y67AQ(uwFC_=2D^&bV`Y%mb`$-R}>DwO}w1 z@EehUCxT}ydQfJ^4@pl8hx}033;f*&{qiF7!1qg^mwpZwAY>EZw!H?}A`{HXL|wzd zn;^x6S1aNQ1zc;KbwXww`U7tfUrWGTO%Uspe2xFd^Jbeh;L-)&l>;E;aCo}|5Ua#X zA(JDL^;a~anY1GAY9pSqme=zv8cBB8zna_VUT}{RnOmx@7L-<RjJJZ4>)kIHH*5># zbUBn9!b0*-rwrF$P8lw?+HRDBOXokCNNt8k-`g%?uwD8l2CGTSHZX*zvRiHrEW!d_ zT~S&_&*EC{zF~ZDhWnb*+l*8}oY@v+i2F{%{S*EA*qDH+jCqa>0Hznz0K7k6VdfKp zcWe*Gqx6=TE<b3dB9TlakvGGCGVPZ4PP^rI%&?hHgfrnt>O@rCx2#_Y2I7!MGvPq~ zlKUAS3g!dh3`wfD_*|?(Z*!mY5Y<OH*`5Hl;8+8!LaK_f?+RDrKut0BU7@sGr#cht z9B+tyTX4pFdxg-&)IH^EukB>;#BoMhwiq~>R$V2Di@$E+12!N<z7yH<K6jdJ1M>{@ zf#$4GS)oJBt}xYdE}WD#AW`t<f!>QV3|zaaLAC^q6NWhOtz$L5s7yn2iq1%uI~;#> zBgq8PN!F185BNnIsfflrB~=bJgN7P5aPi8J{xZU<5tt9jh?r+ugi=w_UzcFZ3s)*( zth8uUdlB3ka<;m&@5;W=;n7Xl?^x4{O((TdDb+}MBR<2^(3lKsR*v5s{>s6`C4=$t zKyBkq8EPtJ(O>U_@+PJzF|0tk{9gwL=hK}0zqAICvW{%QUKl&Kyt)dB;lb0!4RQoI z7t^S4nRUjRLe_T~90ycznAjR=3TQlNTu$uv8-cN-UkMael*r`bRdKu-I-u|`FK=%z zsfEJ)LLu)tw%ZKSH3<hlc=8FBSqN2*-=8Wg*!&rwMfj*wmjB%REpSUZq&ua@q<5YE z{I9LWpk&dVMH#XL>W#<*#f>`e7e{_Nxij#v4yTX19m|={mLXXjhsH01LC`#U&gVh) z)kFbPz4$+p5z?@a?;6n??mhv1r#`YR>({^q__a_hq@|Gcy9i=jkV%+w<Mt&;Q@6o8 z_f%X*o(_U%Bj%n@LnOE4tU2*%4X|l~Ndw#vvZsB^F64hanty8wIe9V}WamkROw+PV zGh}(^QhHX)uX_F8?e%+C^IBF<)?BKG(H~7I!HGEk`%`}1=hOWu$4!*w<xnXY3(OmG zQO3uZ55$6{(5Hl^LC^%ii{QU4@F?W(coBW_KFB-BDKDtN7^OK}I6O#B@OSJY<0^@X z<1PXVjqXDSajz@t!8a!!y&=y>D4UNZCO!w=1jziC^Mi~Z=dJro0yf2RMl3zuBa&dY z0e`+nF*X%sB)Ei`{3N`Hj!H)0E;wt*B@76Y==S5BBZ<|dK_c;n4nU<NZaJ9z_G%)G zjtCRH_IaKUj_ca;){MGR3!v<A+SFIpJIlJ6M#bd7Upuag&U!VP&7=~FjI1qU{c<Xk ziA7~4k;-JFv>yE@l%1cq6T!gy+4}>*gguXJj_?0Fg_4`oEEW8**xcG$Cm!#tt<A+y zG4iOV<h}VoFc8dT3wdzkv~J>ezL3oY{Q<H5zt&M{Z?jk^)@oR6R##i(I5E*1Zvz{= z9lZ<7J>V9s_AUgq4wt~uh7GkaPIn7Th=?<?Q;~Ft&cvJ01GG#>%pja204vQ|b^`x~ z*5UaikZE7pM#;biau^U-PW90iVHa#P&RgkJ2>1_fL@hWy0egi~D2th{W&Civb@RX1 z1uQ#|eG5#ZV%I)mf|~)Yi7dqBq@9L-xz!rpySrm;AgSb1AdGWE8nZ0OEx2Gfuw?mJ zvX~6c!K2tc0D}|3_c<zB@l<+qGwo}|O7X^0!rDv&rMPfy0sblH;jJY6_|adYuQ;@# zd+1$9Eu>uq>B0&!l?H}fyesb^Y@`E^M*>qEfu0+4)VCtpX&qGxKNR&+S%2%I`vJ!7 z@=B`@n&PeHh_ukEiA?p7{KWDfPg!g?zGd5nk*j%$81WUm7B0`qAzUW8xP?kJuuJQ@ zCx@i|v>d??#qSTAV)^&oX!nn-oCmv$CHiX$hgHt4JWg>Vz`wA$k<b8taOihufK7B@ zSJ?F$YZVv($*RY5b0RlCWo6)f3ws9vDqxxzmlHaXNf*x|!Ja=HOBe~OFau@+<bFS$ zN0PooNL9k&1Wj<c`upn*71^NXG8whe{`B#kXS0e|izO0Kn7<;vP`Wh(SYlj0o(#!g zuS_$lst)Q{F2et-gz94~5ih0K-*xxhEPPQu>mB&QeNy_0bWF7in0aO`G?ZHdeZdi> z;K2oDCwE#+=xV6DC_5EFD$VXLI(0nNX%o7(yCt`|@s#%DT}zszRuYAP+gtMM-FXdF z!^i0kowa>ya`w?aD>ODX_VzY58U^T9r?v532m}JYC>Y53LLrLqkU$vuzsqJSya9s) zGQg+P$N>*q12=KN*D%aY9)r{VWCspQ?yLoh5zC?7Hhg}+&uH5hT$TDB4)}n%$<NU+ zfXICTUS>ELGPYDGPxA0zgX3D>D?^zi!`K2HN(gttf1dI$23hbWq&qP&C*CG~CwP+2 zNdt^B#)RjE;F{?TfnT}c4b6y1Ihz2|z`%(qQ$drofHYP#T9_SRVLhbTCd>@6b$T}N zFti{21DU|t1CAlbxW$~HH<7iRB5T1w)PO!eXhfm;x_y2*7>_1Mz)IK;J$@mWq};x# zm?8(n^t!l}yxmksHAU<n>fR2u5}m-uUSL7kilaflqD)SA;pdLJ(tLc%BD!@b@5m{N zKS(!0FFNP#^AFbMJIj8$g?w^_$=y)0K(`i><!ar*m5NeG-jPzihKtfcbVvMAg1#$^ zw=|jVN1XA(@=+I@FSwNsG-riOM&l{sx}N6qm4@>5#C0i?P%U>57Ya86@wtPy$ZY}R zjjeoM(ui~J{q+TPwLt0wL7fC}_4)5<=oa?aKid0mAfW4}GpQUg4*mrs*UbcOVV~!Y z_UVjVy9B@23l5iloE`R-9^k0#jo46+ac_Hc3S=(v<V2C=muJ1Q=z$)c0gEZ!%OE;d zSh!B{9z}k4qGL$)golA~1S)p=O@oZctJh)Nl1|c;{8%PHxYRHRgZh7?&LgRa8u{zj zCNSX(VOVYzV5c^jX=^JPB8&)&UdRY#+9F1Zm{#(5c7~rMRw2)iW!K3ZkuXP=kuQok zQslKD63z#2{H(;@AI}be^G}fu3e<}ZGT}c3PL_@(!o}wT$76INXDj=Hs@~pMwGkp* zj5HclQ7Gbx-KKecZe~-oAHQ9X#o~Uy#}i$P&2|5CDoSWSno1cc^cXc#Ptn4?5k~PQ zT&5b0UA+whCv1c334dMnT9u>xnY?NFJ!*_DkY9nbUzqYv%i%DB8^bas+}@{!d!vI> zsJ}9(^vZod@!aG+#W^4W8qVAhCSU4_26Y8>0@}A2>QF%yq=K@zk<S5kt{yMOA2T_^ zvlj887-)w-2ZnGZoN~91nI#`N1xUOSgG~5+c;+y#rt%i(B|i^1so<$P^u(AG-fEN& zJx1U0W+WIQA%lL?<MRk?^pw*T1P?eE(Bp;<4?ObViq|f{M;>S3WmJTjZM<xhHE739 z^>;)m_ts*T<!ZGY%PzJqZo$h@X2Rn!(`aO@W~z;9H*%%AwRLgdfh7lwj=<FDFCeXq z-S_fqXy4+#$Nt@^PLV-7T3#*@8&X;>M<H{SD_dK4((PCRiY>aCJGZuwp6o?8v~du0 z!z2B98A8-+Is3h~10^)^v#`7<U>So%vzde9m|5jgB#0ZNP*O-vTtYnE29KskJvZTC zi9C$A>~bRV>lsr#WE(7v5KRR(EjTkgn}gfhBQt*=tB|v&T8+;lpcLWAehY{p%RW2( zgPxIM<3)U89WgAI9O{LKTyN~6#E^rOVE$5^Ag2Z-WL{a6N_!ybABRtZT29yL2qzH9 zuyn^|L$?fpvRZw3aty70ZXtJN*7ul*xINx!K~`N}8kUDGv;=~>d0-(T0?86C9wlXX z9>jRzd5EWpAV1zNbc!F4J`4}3ACNvHy(s;J^rzBTCc#82)2%{Edn1wPNHvh;60S&d zLq4(GXPZH10C5*f?%GY|C*kJ}(V1tFuW@f$s#i)tgJ~^R8{Ham#UZ_m1}B&fb*j)` zlFBYwNhaVTianvk5SB)o@Yt^o+jON-sW!U!i+ef{%$@11aU#P7PvIoZY|&+oSNPaP zVZum(+zlO4I%TIu`*QzVeRd6^GiAX=Z;O{`?t^G(fu27@-yd{5#V7HJqnELpW%Uq* z8qp)6fKO8x7cr0y7$qO$h)E4V1<zzC-m!$c745-18YE7{AE_*%>A=e_qv9d%5WqXu zyPq6bKN=n$_HVsge&@KKh2TLb89WFk{EiFyrOB<69>F$n=z$S|g5QEO8ZR9I4>3j4 z&8$yF+z$-aNM(#0g=Z<FvX%IPoYS8)hb+JxGJ_yfE!CdB)#sn4hCt#G)Y_m?G@T7y zAP%riJeA6=OGrgXomx8*L~_)}Q7(C^)y>V@-6Z_JbGs$)S5o;|&RFsI)4r%L6Uorh z$YPm|@Ff%oqp!>o$O&)=i^<Pl*yvcO0_++bHa~y6_aFIY`C_l`&**dwRKpryX?zW6 zw=leNg%9bN$C{!eYz6w6;3E+a@C2%!O#2fQbx&EPiaWv`9q4J=xk%aaIvCEz#u0-F z&vK`blB=C`=86&VD#^J{%CG3p8$RRdz%vK4kNz5g0KW<y3*4rXC{0o*<}^6<Xr&iZ zQS(g68+|0*8b?&fdSELQ-<|i#O;`ghwW(}w=4Z!ohC3x`Xu^m*iE09&Kp^7}poU{a z)$_Xg@76Z;Wnb(q$g7KdY*U-t3iy&u%F%kP1t9@`VH^TRjKetg9DY2CV<zt6Z>?)i z0!-a7p#Co_K40vX=<|qarZW_9{v~`r^78N6Ru2WG+=q#F+N}Fl+Cjvg=YohU9mk&g zKdK^ij`R9rv(>Zg-*v-=1>M6d(*MTlj&8W#09q^qJqq?oAa<H*Py#zhwa$?$6mq1B zI|G*hE~?Nj9EIbUYK8o}VA5@GDT0!3bk@#*L{#hCou6QhVscO?X^f~}^PF3l@sqQj za!#c>5uD&dDSScUBUOP96ulGhiE6E(UMKgIq<iLsU>!w3IT;`=Bd7rUd1-gL<1rne zq^O;?#Fm%tim|4~&S^~+yK8BAW*Vc$^P9%j*5HjE46j=U)msKnib2Y)3#upJ3F;cD zqExcd>OqhMk0-6c`G*Cx07_@zPg0)YUsUvi1GgtVd=QSX`D(baz1;{`^96hFK{pco zuVL6$OF-6eF2)<xh6$x-U_D3b5<eWN80ZS~VofL=|H9my(^VNcO$_5rA3OR_`;NM9 zAGIFkG^ZJ$9E$2SVz?UETBzGhT#xPw_a%E&BMyz6A!!`{S)e6L;9i_eC!cX}AnKY3 z6&is+!h}pk7!abi=Ej4F#pZ#vjdcp)NhP~fCyFarIgn!>Xhc;&e7JRx8`3G=8Y*Ow z>;Pv890iRW;GP@dxyLxoDZ%#17Q&_Oh1bH^!PJQCE#;U|&yG1fF#;%?WrSi}Vn;A- z%zqQO%MrbR!-N(`P!{}Cn(-wGzMp%Vc#Ux)6vc`0ZXs(r#ZZ~~QXuT;ro(|!-b}U3 zdM??nB;DhGkO~KdlwUQFipuCskS8uVWwEjK+Dz_~S&x+8v7L}|*ldo-1-sC7pW>eb zqm|3tBv`~-HncH_$NKObFX#>od-50-9JgFQ3{;LeCI!;TDHNDJp(xYtuzvG6KOHBw z)&^`g0G(^lbzPO-1M4S`<RBRz5F*@d2s**yg57~K(G8h3<T2TU|52lRw6-WWZVC<X z*fd?ku_*#_U|S^l0xH|+bm`1=6^(Q#)Re7caxNP4Wf)}$<hlPcdOSLZf}bu{W%P%f z9FddK=wQ-iczSj?=>lvX4Qt!mwQwl4I_j^cLg53jsS*0N#45su-PP4O#NUo9(7|0M z6E`&P-0EuA4SEjsLJGK{`vUGuuWwNvu&s0~u7T4ww0JBXbS~3!E<7uTl1^?Sr8#;O z>TXBBqQKfecKf<DWfArgqe1!vDCSQ{C3AX`j`HPo=9IHy>z8dv>&GV#zvE=DuD}gs zW$-%1v%KB~*~Rx|U{}8bQ5L<^W)&2TL{{sXSJaX1ZUAG!rw?hG8q^uwCxkozOK=B9 zAS0h)q(lNd33tuo=hjP&R1qN)h0@w$5DqKBLV0yD><=2D2Gk1w+y^sx1d<C(?Qvh$ zs~a}Rrfq!KJ*Fpi$WJ$uFb@S|dEJ-wY4Knz>+=R1(3bpJs1%J+iZCS-&W2*|D5-{0 zQVjKigY=v=P>;)wOY!ZSubn%r<5DOIqltTpHIACd$uoQ0eUM*YU+%E&WjIbP!0x3k zZT}ZY#B?xqrz*0(ySJxE3tRV3h(??G8Bx~%^T=cM7^<&Kcwt~Iya{SFVQvJSqsV{! zhWQFvRRA(*V;=%2;2_K%?23cp@ZF_=G@4I@<*<pPB;*zYc_m9Rm*hz;#QNvTP`6fV zXHh=u+-?~b>uP>s{!EOeV=R#h2Ik?_{OU}|{{gGc%~i1<EqkDR4jjDf$gbDiT~TzO zTC`V7#ZbmtGBW=FCEDjU%>;sr&ask3QXF6E^T|XaIWLx@-vxP_kh()hQl6=jF|N-d zfd*8eFS>}>{zu`5NmPKOG*V@fN<>BtKi*^Lks0*w?iX@tIVNC_95Q6mpWL$Mg=D+r zxys$#AgHAuO++(RP+MN#abw;w`*B@#j>B>g5_a17=a2{V*p_wEMr2QaPmk&bgkfX2 zv%c&%vd9x-8R18v-FA@>(Kg)J+;WdVpAMS+>|1u<vZHinx`KntiG~KCp~{O|h)F6= zig+g!ldZz@k)n+Ycz%K(z~5K_jGa*Erz0H>O33XwWc_}hWJ4Rbvrqn<#By4P78?#K zrB&llmaxMC{uIS#9EOyN&JZ3EdcQvIBP_*X&z0iHa3spebO@xQ<qnIoMzY<X7Ka%e zBI9nKF3dhOtpW4D5AGe^8)7S?e@_2Q&J8Wj5Vb*;fz2gy)`6ajRT0WW4?z{`M6G(7 zIW)N_aUrpzv=CGs`bIn5s{LlO-;5rr1*Kfh<;rD+MZ$Ad->OE!eP<T1VfrAQe&p;w zIXrwN=CRr6i)ZJXp-^-FY^GGoG!3IkYs-OWNs^_vBOhpq4I~Ry<WSF^hyteX_)Rd& zZ;E3COmwgu<fSG4=l?ucOLzhqcrESh?qq^YP6Z>En|Y5~vNkuj&#s-x|Mu2KCzDF0 zHl4NJyc`LpWERZe5FD5ZcoMbznYFXqo10e2qvpT1iQO}ujV)*G;CdVVNcD!P&Wa_~ z(3_O+v__MpjAB11fP*ktWQWC)l(M3QY^XSnN=>4$4wBH?y&jW#z440m4-ajde?~p$ zCHT8T=uQWyvv>z6i|{>vTzVIv0}z3eBhxM|aS;=kj|Ox671tI@VYC54&R1Ya0;y^z zj?EOpJ6_OUP>?zc%t%?Xt#1tnmd#(7nEdVffo6|?oHZL*Bk1l}Z#2NNZ}r^A*fT$< zJ}13;d}$LLIJ)mF_*p6L(GbxuvQX2|0~|T>+LhyOX^Eq)K8h687pN|#<0!%^)w4ZE zPH@(2*ngj_T=gKc!8|3crZp7~z1O%oqKP}f9xlA<<T$1pLKSe@s9;Q)Zqa@1C@tbN zh2pcV?j!~70CTW!(ZX5sY`8;&7x(+4Lrh(3cHI+ssU3Xq^T11nl!RUd>T9JNZ@>nC zA+LJqCVG}-CwzxzfA+`GhjJh3hNWKLim_pS^xqB!04@M0?^A-=0w_Y&q<9vJt6GOo zL1!H(pi`sTTxL=RXwDl?^`A1J7qa?2dvG`y)MR$R<U3k7-*@??4#!i|^C6;~B1v(& zh9}uhmK(B!vBWdk>{pTPxAW5F_uXtA9!l<e0K&yFHQK-3K*$5aY3Q)gA&&Z)I<DEP z|5F@$69?M+2M7B$9X^H&dIle6-Q*1AMh&L{$OD)G-p+Y&bqBJ<nGSn4f6bf+s!iuk z%Bx_jI&IhSgMQyRlrX5u`>>De2Z2A&BHB@!VLJeUFe4JSA`m4|rQjrCa-bzP09_I6 z0=r@#=&oodAUS>zOcb)PTF?@B+Qks;P_lG~F<&WH0>4gE@b+JS9s4lbokYl@{Ol7s zA)8ykdBp4R_3g&TL3#D-vV?x9BOiyvxF(FA0xB+O@xZ34j+z6x@HW~VGBZbHl7zTA zlM4jYP5eOWD|(YUjqR74b&!%w)$7@argBL16<$=KV2UR)t8;T<y^)VTms&QT%g-%U z*9yxtbqxd7#bO1ywCl}sCK1>Cvbq>%(O51O-SBv;2>-D$zn2SZ)up-obLMjDxoEzj zhv(*2D@B+p;eLQ;QX~bo0)j1iCU_J44L(&I&x!{`C!mkMjYk}~gLc22=S3FsMzh&~ zy8$gH^I;$r39nI^2+St}P4XV$<}chhB6Co#zS9QAfpt-<c7Q2tc$l5l2`+77f^~9^ zvcENC!|Q;l>!1NW>*ceMX9?gei(_B-Qn5|TIs~0Vx4Y()39f4ekyR4I1%ORB=}LCT z)DxRHs+-B(B@|?iae@CLlbdXfFgd_IUb{{!utt#er|KBs_d_?1$KArvbfee1fz|ci zaM*YMJHtr|UH74k>hq9TDCX^c!~hT<1xpc7Py<S8iagT9%=QAqQa4gBiX>)0R1il% zTS-sc7Q7Y@$S=ELq{FR;<M2gc$L2CJ(#2d#+fi@iEKFxb1+NRsWoxxrEcg}6=sDEP zrta=PliS@`O<x)edZdr*k-Clb+!;u+DNzI)rOYNRHZYb8z2sGSsRCKVOxJ^9hd$ag z%>A9rOD&B1=sKN`EBefIn!=-Lc?~7C%?zro^5WX#mgut~xBUj;ebR=W1h%+1N0#UX z0xNPA<raGCH%u3>*7)$h2(NHK4o;ihO4Zr1!n*~XTZLmd`HRzOwg??}gt>wGy#+^K zaO_*^kOJTjNiS;0<5?hyr9@(BfGi_HMC78gIA-O)MuVqR)y!B{##GgG94<WZc>0t6 z-&B%G#Kt1N7g4}<bWOsiQ8{j4X`J-nfX?5;d4Z?2dR-g!pxp&CY4H;i@PjEuefR-R zi<5_fi9|4T&8U=j%f(_=fgXCkYvmSVK@a8L5co&}J|Y}D&a3Z%fxBFzoc!Ai3mIwk z@kMoNkY^h?^|=Tj3Y4=+KK}$@6LgVNM}QuvBT+~cF-o^ydFA=%ThBlL$}4PW5Afy- z><$`ti0cj{91E64%tB6EF;;Z+bZ?stoRhR(!CV%+itC<v34u8AKm|s%09?0e(*r;z zqT9!zN00TO@IX|V94phoB;*itbIZX;uFE-b&+&bQN(|Ez3H)=2Q5=l>8Ho+zbY*^d z@F$%rA;ZpaIAjva7T8!*dqB4_q(vXBo89lzGl+igW6ZX3mZ^Z~pa8G{luj0aO$dRu zPBaw!FK54wHG#>o{AhFS<G65uqu#fv(&Xi}Gcw~-laArBiX?OnENeiD%Av#Y-f&Vt z05e~wgXrKJjx2+b0PepVl#l%BKLjol;_e>#NpRHxsSn)WMw0$L?(6KohyVpTg37-G zX4*+ntAh>!7}cCZ(N?G@s8bFWH1FH;hh`QIAh&*_zGF6Gr&v0pX=y|CT!*11t!bI` z>OZ({-@h6~GXwkA0ka~yp21GhgI656^b_Y}in{VPe@KzTw|;$da5D%6kAAf?!Jvw? zRPYfFsA@3S`tWT}+rQC#MW-Jgum9e=6+g<&V;}wQds%fN)CyUKU?M10Ii-MPrL7`t z1GRt2vLiSp5jV5P*dIlou&jq3jikfx^nW^+&PG2D4MOw6(vl3{oO{92+u!dud@qE* z8Z~0Mm&>uZytH)TU6ys*hqKbuMo(CFoc9)J5vX+I7|$qfl^3coM@!9ZQAmM|WD%rF z<Ae*`>;w@*>%oVs1OtK?HR(h>b3YnILf1;M7{$wJ?FXP)M?@-*k&Oi$A~I2`Pcjf5 z?>tp46k^e6tWc;<Tdi2o$T~5%StH0zTim$hsO&c<qd|Dac=ZOm$*x1olZGcP>aKYB z<85@?n%RYw9ciSMJ<3f%@9Mvn<!5E~7+YMp>(Zllel_}Al_%d%-%ovY<`4ET!+!Et z?|k&qT?>osvD}lD-+DiNN1uCa<{yD42)7eVGzi;7poD>V(1j3>3Ug2$tjdeRi4a&~ zQGPxje#F~rLDSgtJ`&FBb4w1LUqX?9VP+5r4qB}j-ZJ`r_VKs8&}t2WfkDP0+7gF9 zUS}pNS-2V@AR%rL%27;Dr;BWh3NxWtI&jogHga0D>;v|JC@}8O;t65tzm^4SNGtJ| zKh$r*E;4E`ZRJ%w1JR5jzeWyMfO=5T@GNjsgB;^PQRl#Ju|A5`jWHTXA)Sk(bAC40 zRj7{yEcbzzJHV#5LFWOUJnobfMvgz~wQWozsD2?4%aCAqfp1`kb#N<nB?A-#g+o&W zE}?U3rRknv`m|4&mL2zH=41P~L2Lf4s?*!{2mQfc|M|an$;d`S?1rP^Bh8-kNMjaL zpPz4N>49Y|U%W59h?8tA26Ls7?u-eY_a=hOHdF1@{8N{3-DB!b3*9)uNEH^nj&uRo z8L`>%##kB1z1omd0ftL*5*a@?Oaz+nO{MvcUc#@g1`G1Iuevy#cSV<?kr~PTEvLrx zW;>mJcK1nOpIBo1<NUE<y$wBfZS1TopZm$hVDaCJ?#UVNJNGR0#HAbQbhF96;*_3V zM3KOav(ei4c_ZQUogWAx+SV6F29ve#3)Rx9=$n-@55>yV0Z8nvs+fq5d@tddRf5%S zyNkI|2Gc<d^ET^>B}9)zQh{jQI>4K3RMwAe7{+esEd0eR+k1Cg34QYV&70N@Xp}75 z8X#o;Rmyue<}s*GGoW^hxPn$b=G;_>iLR}A0LqLMc+lsuXUpu`2UiTE<448&PR`c0 zmgLZfwO+H=ly&=Chn6MV)^N~=J;3VYk~cyY7zGS9?g7_!;8{G|s&o!M>%g7hZ_IKO zS`!3~N2huNu)JWkq8_R-56I;)er;2%Mf6|W{R0}sKI_{f$!0y|ng-!_nDfYiJ=(vN zmb>dptDa8(l33A(Yttr(3d%VRd+@>!ryS#bD*PuFv-i`w$MaqKQ>_8MPMfdsOxi@J zl!yM4WVZ+474|)VQo)X=OmeU#d;?Brf(StB1@RcK;D&uf6#@b@>usKFz>Y}DV3-Vv zY9`yTI4rU<3afV!<v{M%9tfr2)Lw)z0s>PtIvu0R$%08jDoLS_IHubJhcY;p8)t2~ zCBJVLv-J*MjZE<};$zEAeLvlVG-)-{`+BpC(AmqZiLoBC$BZIfNiG)QIccPeM%Ll` zvsvd-_+K<_r-z-jj>LPK<`>I&t-KmBjL2%awp~Ydhx0812?<;0kr$%A{l@?&%MD9; zse&AiJHQU4jcl7>^r@i7SmK;CqA*%Cs!2GRP4y5p;7RPrJGEP*!r5I-VuSqyT*5(l zeWziwL4UvXs^k_Qp%HY6exv<I(tUi`uy=6Hc2J$OCVtu2@7-`8(Q=>cu-EVP0aBRx z4sDD{b=WBG!jmCA3ewL(D}iWN;C!XSi&-Lan{${nIiNr!eiSa7m`a_t1|}2SE3#K{ z^G4&VXYcGj<B-p}=QgiDU0?9!e9OyNEYzRAH@lyOSh%0{Jv<sb>|^n7bhh^9^fBEX z{#T!QX+l>?o4pr~hHk$-6b<jKG&Y*~d~>52>h}@T@X`<c{RuUuXW=*;vc*uEL%x7b zP_fI%8bf~0Q@Tj>3d4d~;{HN|01b#kso^TuMxG=1sUss_2k=k1_XYbknM|xN7ageq zP>A`T3Wrl!B!;Cmf!hAWrR(}3w9bd{{A<0p=kGfJy6*reyH*ayCnAL%50*KklD7q1 zH~8*2eP3jDC*t?VkCg^b1P%sPuC4|M`*6n$!#T0QySyJ_$T_-#9++YS<lV*uP9;6u zfsT3t^ctW^23pW4hNy`$YdIuVUa_nddGuH3BNi(6m8{75yAX^tH;2H^yV#4Q<-uia z!!fEMy4Zrpvpq-Ih*5X4Ux>zH(L#R&%#85?Z-fOfC$#)oz!}68(&R@`W*D7ZhCZiE zKqgDJ-8cKG74t6k1lXRJ?lM<WeG{nGqAGvP9^lVq^Dg@?=ob4h+1+wp$|S|jGdLAI zWH~`0J*X`A#fg_wcaMGyCwlVk6rJG26BD2HAK16R6TuEZd=@NC{6yls9ox3pyKoNN z4o*X7{TeJU;84VkiMzyuqc*~r|FodTzQ{8fku~Wl>6x*;7z*1;bz@J36EqS|a|q?* zgFsFKN~m}t8hCipgRx{GQf-ZORb@AB0S5vG1e^!vC)f|9i9wnpY=gfMT5_KX<9I!~ zcWEoWWEe~Ft<}{{e==QY&bO#;&VMu#B*OxT{ms#b^SQOPZg*`hm!Gzn<VGuSumwj# z3yT&*T0AmY+@w=N9D(&?V*@HoQ0+`WtHcv@7o7mn0W%u)-gf45xQ#+SUszq;nzq~+ zt2a4kpIQT2e32G9Ed)=@dHfnI3?zernXi)+46KE&m@a{((WR*_lP@j>`~~aGnU#m` zg!{=okKB#reUIFW<pT@&t60Kctp7W-2mRc<2;Y~>+jnDm<?IzK@6Xd7bP_-cUJfoD zz>Zu7m3Rx`(lT@qL>R!@U@XhkT@U<jIcMcfay&!>>`)GxkDP*2H5~B>4K5TC{^4OK zkQgNkP}XWz%|HF)P-gVMTFg>@(z1R^{e!$Bn|R5N`<Gn8OGXZXOw{yv;Mgw9a~Rl2 zM1h|LGgH+ZX~??u<vLW1b9t-R1M@Z-M&Zh1^nujUnYp<-`H}I8vr9|JcMUav{u|M3 z4mvbNS-|kc<7zG*kJb{&2#51SAcO&W!pH6Dj_r=T<Rq?`B0SqBzJatnG^3E_jauWR z#$eD;WR}di$##!PuS%9}+c$2|_vQ^+_eclSqZVi<y>Qouxbbn*`2p$Q;&aY@FGW!A z1z5Vf;Ow6{^?sl}j#o{(M;Z^}b4Vty)@Tc8!Pt<*skupe0Mzh?`5xX_XpH@<FtA-3 zT{7(VZ+V#WC=_@@mT#O58@bZoyY_kD%YVXpwoMilRHCDSn+zi#R3#7l3{=-pil&qZ zGLW-5j3;>pn@4)0vce=;?j>TST)(I53w3nWK><ZpS)s7BgzCX!Nb7SbW(p6OZ$y%b zS~MQdsqr|b{sN6HhB!(vtw}xTCoMjvAy@&aR_rCgOGD=L5a<%R;<*c`3Cc0MMfh5Y z%(h+#Mx3kQ&bx>J0roe6_PGTCO!f1Q;sB9eDbXH%^XRtUC8lqSj8!nlwSr4J3nK?i z%SPV)0h#+-&cSKt*wHtSY`P&-BGDYoa6lo+u$EQf1j)b}z6et=XbNO(f@MEha52Wv z>d;`8HIPU?p}DUHx7b)ta)ePo=V3!tt5(}P`-l5G?P}F~_`t@7Ogr4WynF^!=Mqwr zFw26&1;-bhP8*!BybaeO&;d=RD<xnK0@|bt^WS98!xo-m7dvqcljrEo9L6H)Oo4Iz z<G*Bwq`hPXD1gGa61!usUf&Dla+OLh7a9$Z-0aP2)&%cD2kCh6lZ24fuS~zLX{)Q6 zAnE`9)@R}U1wHmqiUIeHwXt9hiKr)eCnZI<fnUU2Sp^XxMLv@(>s5)X^JPg@%azWn zQm0Z@Rn{Y37L%V?;{NU)NKm5zVzjp_<kmx6Yry5o@wL`A%nh1r9G8lVG$`~C<#yNB zc6O@Oot?Ec?mvw|0+ci95xkhRSFK_$0WDUmd$j%VkciUD^e4gp^to!#@j*r|i@HD4 z1P&ZEYt!rwfNEj8t7;8yYLa@)?jer|lGxzP@rW;zsaBybHR5zVzm-g|R}PTHGXfIV zL#oqouXoGe(}N8tSF63jf>lnoTFJ7tK=<gCJg*+I{~P@ghfR+pL()cae9NgIM@<B> zUbE{=Pm`b-Gj(+`VYzz+6?-PmVXAFzfO2A+1?W*diNwn4gAcB(CK4!2&~rG?n-1rB z;A}bMUN^rT2;AFA*;w8yzILj^TQuqvqw0iB^8i-oBoo1H;%PjBt?+wQHJ{i?W0@D< z^iG1e@cghxjQL6xT1K*?kesg&>|qVTo^;@Cn=Ce#Y+LZG0UH9k!QlQQTo#ygc*xHq zY%y|N{to%iz&DSzxKIzQ734LPxuDM*Y2Y~2#(1-fBo6%>cyBSB<l9`}aQeu6`Gy+q zL(o><_(xA}9s7}iTOgx$Yh4=fwa(fu!{XSL`yaIVPuCj9$h46@)YxL4@)qliKQeEK zB{rVYV03x@#-VGpD;B)PPd5GGZjIZst8$VR0+m_~6FmtxN81V_*5@Zl?KJ)l!bn@a zu&_z?%l|*WU>=M3Z)mSdtvC7<{Wp35IZ~;xM+~7#8A7Hj0#Dw-rG=?{oPtS!wA&gb z`(o`RavKp*A)-80b(fvw45UinI0B(eh&-&GKVQ|=NR(I+_`ljW9E+i|W|m`2bk^5Y z^%E%70vTSFKcT7y4n*eaZuif=_zKT@3ipjyzUZ{viYxvsSa5mT3yGr$%@pZ6U<g(4 zg~ZqGz}E{r8631V7&x$zRwNE0o|Z@fxXE)h>&vCoOFyr9p2*KFF3#njFq)0d^G|%a zl>D)p_1;g-Y~O&<AvF4j@jUB{{x}@z)aQaL!MS>;Jy#8k{`76^;dp-Zn=AyeZv1Bm z{0jZab(a$yJ(UeeCrn}h^kp1X3%LMVax~@{F_>+dPLPfpl-p72<HammV%>xDul=ph zzdeOGTA8K#J?OOXI_&iZaP7lP>05g#Ci{F9IIjtQu8(n7ApuCNjFVH2c0@rCWvo+9 zg5;tKwKuLtT}F)9)DSmz_?4mD5#}@sjI(GVY-<pgWuoq!vlx=Az);tfh>_x4rct)6 zG7^%2ZA}>w<UQxRVfWel@{R9{LD$+CPxKoHc!4#>8NnyvMMKVcQ}Hat@i8KxRpg!8 z<{%4;4FW?t&UpZ#86_Rl^;lZTAUjIz!9d_a*f;6SzfT*Yx*nySGO>Ms;Jz4YT)3|T zgMsKXilgHdnBcuP>9TR062k1n<%Ug&kg-%MMv3P{Kk4)n7K5g^<VPE}*x;Lo)dx|C z^viBwbR1oY3Q1!P+7bx`hP52TRpE=g3QZ1zb5)oP8^qFJsOr!k#WA39Qq{$ITr)Cc zaj(AwSQm0w{_PRop?eYtp!cHYkv|#?g@VC!Fc=O7W3o3IO(gt2Pa?DmUTyTsPaFBq z|9Ak2*gYOZBcQgue`A9R+}odJ&wO_DS@vjxAAys}McBhNEzFlCe*zh3=&yTLL!+O? zgZ`Vm@wO~`4uP6<Dg<--BavXY8$|F7#!>iD*nr6zU~&(93;8vb74m&Y)?e=4kH8Zo z<OiK22h<Lx@CG_UJoZdYMk#$Mf#A;H*ni%PR-$$kpGwsH5#QfwL0vL>Iic>XLs{%n zAhUh9c7+WS!B?gCyN`W8a;UT2)@Vj=+;X1+kKh`w9LDQ5(zn7#dYi>zi=b>ZRVwd` z+5~2|yb8rJJpe|GSW$>l+?{wFyu}re<KV4!7qCkOzkz{yVLE7d)_2sz=b7>u-xtmK z`SnP+Jvu9^iAyieJcZpTm&qxpTy9KT_XRft0jd#KunGYa;^FA)$iILr?~AY&$X^I1 z;27iTn0UNWsn;u&I9^Wcc^r?kn8Ey`hVf_~h2^Gj`o^DoTt<!j=Y$&;oTw1vKv52e zIHfXwBqbBq{r}~2Gi&<1)7H@^KRV|3y@4@5#R+0O=9t~D_pxtG?{nHZAG{O@G-<eZ zU&m-)o5IPoWd$yw;xP^P4%HBx+7iWBQ?$?D2$VxANp{F&BEuH^Z9q7j10Ybn8Nh}# zbRBhq@Hu8Klm7Dc&Sf52eG4>`Nx_>mLEZt)T;<8<Gey(A&d0qz9oA{<228$~y|j4E zXFhg#4d?Kdbz~mDk!L;ye+i8<W-u?^N%FL*z0PN5$0D(9r-ZP(=<jPj{<PDktzVp} zNIX8B#7JMtJ_cGe2TD&&uO<{5Kv5>R$!T&3Za%|6GU=X`_1byI@_N3uzH*O!CuLMv zUb+)R&8miX>T9xNB$L<bJK?HjRYUFdyY5<VhpHCQ58^Qnp<5V0ivgQZ7fz>?S%~Xc zd9De75Pz2?8|om^E3iCNL6sH1f29JIP@dsZu*6vQg)?Vrb6Lns<?LMT%$W;<f06r~ z=L2u$V-1GV4_LCF9(_2&-g4z7dj#dnf6qQS+KaP4-n~3}KFz*7=6kp<D+rsYgs~$H zuht-aFP{Dc_paxjf1dPwV)-09Asl!U|3B~m?M2IJV!mmM^f@#Zf5v_RTI?t^*4vUz zatc{pyTsPxR>0^0c{E6Yp2PwYi;Um9sLTTE7v`I@35MKu65$$fL0yBbVr^|jEWgxh zwKnO)7wi$6H}zI)bRAmMzdhLxduOm4_8Z_kUO_8w+2W`DMVyEtXSA`tl=y2AuS5RY z=YT<or*H7Uw`7~@x&YaAfbsZtvdwkiRWsh+pd0PdlhJMA3X?l*v3<G@ZQD!}m)~R0 zi=RVrBeWVlHQ5LE3o)SALtk<rV}0~w8rtgx@RXZ?vm>D+1oF^K0@|@ma!l4CZ9W-k zAQCvMBZ+a@YCf?)-|Z~+$^RO2Jl*fkFLwH?ERnytJKsc}!TDWh{XlV{Y)8`{kNeO2 z66edZY~!Q)<L48;^Q+ckF&(vWyMnin0Jr2<c(3#@?)OBn<4#tPV#r1)tPea%Amq~M ziR@LJTV8gdgFOLCnY37|rIN{1t+qIAtuHNQ@mgA1pSIG-+&zWeX={LE>kA8Yah7pw zG{|O_m)q^-<xF<kVo<+d!$-t^albZ#dh)Wk8<`dUmh>*j=sb5K$z{Y%5>C?45L^@H zCEkLYGU4sdafh=T{fCWh7~s0lrDKg1j)Mst&RS4RL$y9$G0QzvG-OXj{mCSXB9uxf zir}<bj_~HJAH%3&>^@F|=#Q6aNRhgQ1~~3t#b{&9hwcbDij@0OEK6808>1w|?zV4Y z^%>`I=q2*2Y=5!So#%E>0<wN*alYHnCm0F*fEU7v7I1~IHd26Tx!RE|SP5<TPcREs zJ*#hH-&g-LY+}&)OP|KRyhjT#kfLkIM2hmq@ZFE7+!`;IBATk(hE9asBpGtccUM)h zL?3P=d=;1oorvt_j0UG_a*cO83E}}Mo)dm7p>*hQF#u!GCxQ{a>Q!q6SRyS&EwiL5 zTj1A<`C@b2T93@>*22>ZNShZ~r$QN)tTyq#XeC)$RV*ZqF4R=-RT#o*8)PVeJiUK4 zTefVgoV~hFqeEMV{O^d?@cF}(SqY`b{2Eg%oT}g}hR3aFB<1lzo~Q1G!0Pj)B2g;# zVJR$J^o?5@3TVoPR?x$KUqg#<mkpb)v(|{KYhX#hSFEY=#v0uU`dgmpn#gJ<!8?!u z7b<B2PN7@iK^W_#goiE$gb&VkjVh9nWS|8f4WKZ{_~>LSVLz%dQqPTUGOH3EhAYgD zh1F;*W80`)poU{~AAWy0?Dx_GlUlpqm)y8SU}eO2;!<m=E)f!Zxq*OJO@>;CCJ{%! z6k8(@alN+IY9^Kw{}^B3t7@~|ZhQ>wN9*-ZwBQfey4Gsts<K=j@6$v+>spQWc&yQG zH^1HjpVk_P*h-GqFd*b(*@Pzq>0u}-6&{}A6`*mUv;w?$-2DOwYqYCy$7`7I8LqOP z$CD_=Vk0{iD<)7a8U3?{h;~na`ez5u2hac8o%Fi(C+Qt)o!L+lYW_^7w7p%*pllF+ zQcoe@j!!qJr{J2xU+61gN3cOF0$e)?itBjccgqu#NKGTd0%lm74YPNu>eElF>YZ7r z4f@3g(0uxVBDA$KNaP4#*8k1~Dx9FoN#Z+4fAE7Ql{+z?XJs4U!RPKkmZU?%d}LYT zr^Un_;$WLXwj3RSgg#T@QyBvnqnbiu&_LO%3|b+E_p1^RF<xx=>Uc|^g24~cH_`Rv ze{vK2%r(%z4d@vz@yrkJLhgs}lzz~mEd+sZepC_Pv&yQg>aLtDdH1}8KWS#y#_0x} zv;!urL{x3Z0|9~R8=!U)|E-PJ04=V+z@fLKxt~zbt}HKIX7c6BGP}IQlx|~1_1t&G z<GFI5M_sL}mo7d1^rcJii^ViF=zBo(k-mq72IxEbMXp@37$rO9TW&gy>(0*H$ApHQ z;DpvU9rJhENadNlq_I?rX(;oZPZ{ZV##dCP!-c}snYt3cu)KtuT)yx>;IsyPX~8dq z>Ivdzwk@mXwCOha9oC)Q-a3hFhNmNjocNJ3zdO}}Rxk!s*%>;}Y7%G@>Jv2E@Ivcw zCj@kGHHpY0=r`d20bZAahiKU!3@m&OZP#n&8dE<ET!Z`>_?h|naBdnoxO`16jkEMz zXCDpuC9UbnnItZVYY3T`;4*`md>b-}Jmo;raj_3wQsEL~BJ8AiGL#$}Cp30#0<B)d z)LH{9(i_2r-4?=BffqpTxd9&V2&POriE;TYe+)eiWgCrjU;Qd|zwRUb`8BUE+A5F! zbs5?Iqbn;r3v;Lsp{ql<%v6f0M5$QQ^<z01m^rzZDhHruGZdi27a?ezp_+$FeJIEd zP<&~tS_ObXl^OrO3gC%F3rKE;eiFW4d+4VUdg-$C9mt9N{nFo+epDJrUjh~GHue;= zTT;kJtJ;Vtt9nUELXQcLrDQ~b@fGu8ypIeaM0g>_fxg{;igYc+8i|f0eh3o}?=Jd{ zA2p32fpe5N&*XH@KIS08vf(lX<CQ}>vd79zs~HQ216m{#_Xi_)dweMt)U+T=jdu%k zf7|gvdM4!<ale&8M&+4PWy6+%8VuFS`~wWduL^}UJa82?Rw@+>s93-4n2x7b-|Nn% zednw#XA5f;E6Jjk()E;9Od{qb<Inl(fj~N}qE=h9_)IVsQ*vfFZ03}hdq3wW=6%LF z*XTd$dSd2ev{Sg0pRZJcUx9~>&zH;Oa&fOG>eCBF@PeN^azB%so*1tu_Y4?t^YcYc z`%cM|Mwu72uGZ+9aeTGo(=%O74O7GYeyX3c@a@|tO^46Xem7~q(IM?f_$LG&&|+Vc zVvy4)D+$p93AN-DD4iYlx=TLaa7qL_P_IH~3s*D<<3y-2Bf&-sFM{z3EVr|Tz4fgZ zpYWbP$Iik5v{Gp|iXXe@L$yqXg+7|dezSuV>aotKzi|g%8#kO@+;>J|(u?fVXYNUS z$Ndjx&K4W(N(H`AAM<^jp`=SD`B5YX6337F;(X50hI76Nl%VU0rsH`DPw9{V&(o7a z5<t(AizL}uw5kTNl+p!oCU;wfM>iLyIP>aVM2cbF!erWI>{Fq5qZE2;=dGXj8TE7Z zh*tilZCMBvqooB$M>`Vj!+{P#SS+FESA3tEdp=Q9f7JL<wO~<(U9gB`8MK<^atcR~ zs})wMa=F=)w8_1uF)mc|=^5l~{y1qMhzwJWU@W<y!#!%?c7?GJo+zy?xQ)^qTmg^( z?X4h<GRFsJOe9c7rUb{-B}TcmhOq=@-DL_M9YO<Dk2<niy&G1GAY(yaAQmeiLIa7I zR@l|61>o0U0EvPl{s6N-2(3@G+WEJLdJe(P1$P>spH(Yo&Q!3wt_743<~jq50>h~I z{KdASq*0?an$EznxEQ0ucWVD<tXP_Fq%){L63=9o_7C1#-{zP6;{KUZDS=?%7|QOf z7vYFlD6Ur%v6z}D#&gWtAK6U`jB$Ml)(y#K*O?93h_ZyWC7XM$2{1-yp_52nA#R+0 zAgsq_oq%uK3I8-)|7dLAZ9Evbe;mx%CX5sRnsL)-hWjXYd&c%MbMBdcTJB>wzi|^B z;<ed6n6bkoU5`z4g8D@~qI<X5e>B%I=FBDCm!G+@*LlnEK6hDTzWoj*ISeo80sHV@ zBr6-VABr>KDP|6lY6yH1R#Tcd$o7dGQ0M`XubyUAwaY`lzzPlVVFv}pP^wR-BIG%S zYPT`3=bT4Rn<aaVGMbgkYnOZ<vaD;Y2jP1F>AOE!7hbH=A^gy2%19PtaoV4bd&G8R z5OJ?nXwalMp(P+E1yhp?)Jl5>Op)6ZnNH5QQlr!T^4qil{O%MM*Q)Q_zsQ)QjG{H` zyYG$e6-ISeu8RG$tsm&Q)gsiDgj2sEznA@Ym|v8QNvbupE@U%Q6$bauDD5I*gCG$= z2w>+j(Ss|w@40g2dvdpV3*kp1;YV&fXS3GVpLrPX&|Teke)Jvh_~-*lB!9iIc>SsV zi|2lS;rA9nGev%o0jHN8=}utowziG3-$2;llS!R}FCxcypc*ZaJ-(|@99iwu#9^#+ z-ncvDEu|Vpz+;>@-j46xp@4if$(MY~XWpKCdy*|UL5CoGleA)kUR6u=_{;9wSW_~g zeXxYb=NAL)jpO^h@XiA!FPj<?=#Yy(SGw#msgF<pRji(c$@T-Q!hG8w9^yqmCR=#F zAA*(*Fsr$rn{zg(d!e7<Ue(jH34xHGW-JR1$9}DckiiF11+gJgoU$4L<^`odidLct zNURRM7=$`b4-}qIy4trb3sg<GCJ)65^v<#n>0VTrtrSOWU=tyGWNR~@%jGw>9w8!U zKb1~DH5#toe?PQUV_t~s0AkR@-a&OvaR-RT6;9tmYXsy%POqIR%|^^avJ`V=U$soY zt<m@r8Ej9tCy&|2tQLYw_gjZFeg_8*+@rWKqyk@fbd#rw6F;1EilhFmzu6<{v>XhB za)*O53Kw3YqiknRaM8d=7q~8(VmXd(6+gst+u%cb;6t{!_xZ>0+?>Ut$J-$L3O$*i z%tFBlO%eH5Fw{gq-l(>S$t2&|2G}y9=A<JL-7*f}fvt^~aBvjBR42w!3^%YVexgHh z0%kit$>&;gvzekr(m-frU5~7j_j2#JTqC`ya(LRZ-AR%VCxwIQa;&^Qn{8X95$uUE z>d`L4X=0RV>sU?lz@0p40#~w){w+#1V0rR?<r)>JG!d1|;hS_eNV$iJ2ULnoVrCmc zH;-|4;`L{==v{6_!8CxP++qNK-+Sl4)g>yU-=X$<eO52@Goj&dYFeAN5RD8@&!R}r zkpDe%)%oRGJ<Z$i@rOV~+M!T;bYp69p0@VECBn2x&!kCS=n8~iuaFyd;1BZvo{Thj zJeh$8c;LA>!LcVyaC7SouNGpB8nQ$-x~4Lgnq51~U~|TMdboWOobVp|^O~7bf+%oZ znlvJ)5GB(W1rcmN8~P9N{uI@~o-<RjHfijKWi3MA(F<xJQ`lUt-p2B5z_Qs|uM|fO z%WQV;9n`qeGayaz#h;@K>>ikAo4v(?a1P#nZhzA7vC#by?21K_h0caD<v;gnUl(-e z>wJteu!&JW@S<UaB=E*~Cc7QHiJOBv6wMUOD#9VKmO+{($DuaD-w4Bj!i$QYM6HMi zCO;F|{6F$@)x4>gafmPRjdbfaHK=;ol?)?yy@g`hYGiY&-D)7_tNyN5&#q?>KM~yv zKC}h5kewE^K8sfE0B#3Alg*|rC6+1_%)2)BP3(JHI_~xUH^l|+QlCM((@fp&wcb@n z+*qS!tGR5$N?!_GwYFPOA}ztqWNQuzFBk8kLt>LiCxo<v$tW0<b_Y3LI#mf|o(MNI zkV6YEf>aQ3n=5Z5qSc2S-v{9%m`9&EAVG>~vTPw@pL!&YlO=7(`T*Sz-Ka%~jXQHQ z$x)jP2K)G<#FG?^uJw8Zr$poW>`Pq6%7S9IxXqHH=Y^7RtPFINg)sYZr6I-#5)JNy zV>Oaxx=Fero_XqyL^jc)uWUH2Z+#uH6Zpu$PqaRydjc+osbqRjti_GQKOSm^Ec!N` z#)nBkI-s2g13GZ}ghP4?AY?p;kQG0ReoA(EKtK8Ncev>TIT5>5ahFFc0-?0KkO<ei zW=90+@jHk1lqf2BsKFLHZEPa}vj)8?QL|)~d<&^y5E3$Twvzig5y71{$f^Qij=JQG zxxeTM*H)3_E#fg+A)luCLM;?Cs(RJcTG+EV^(SPvK}g(LhH0dwsP?@p$kE)Am3?b$ zF3G3Tk;pI-NvHA!>;vPAwXeu6?6q>Qttu^q6)o?yH1BO(M@|Y;U1z`Y_*Ninn?@$! z`z|j+e04eePEAp?cZSg{Dc<k$1u}+dhk{#=a~DW%5m{1=6s#?2*@z&av%w5uH#rZB zMLG?8#rd#afGq}p;O~ebr(sn|8R`;Ulb?Wi_Nl!f04{TmY$#+k784tjn)ePm)J(SF z&52aIFo=T(#IkE%8#qkcgj7RD-2a+U-M99u#$(}gr4q9DPg8BQ9QL3^ljnDv!(r39 zeEF7p;E_+K-2*whVB9(3#&XQN69>-+y2F=aMxG@}gMY$}A}k#AgMTrfCr!-tlW)3( z1Kc~0kGp2uTn2g-2^v8kx5;}6U<D4#=}OLH5vT#P5F<iO-mf$n$EpUgg*G(CwsW!` zjj^m(`|bIxz>*xlK{ZM`S00Gv=-nxhM_+>I?yyb}`8R%>xP!gc7goMdVGg74tbtU4 zBJ>Do#_@eN3<~CQ6!{{#N1?dnjM`?SsegvE85NwYwdXK6G_O6d!yO_A4aM=!@jP;u zogUyiWqMSwx@AaMHKB~AE%a<~u^eZZq#VR>p@uEA8a<K#&tR_dx9QP-n*9iLXB0<; z!0lp4PmTUUOC}2<OgeL}6}I};(9JGhzu>A{OFjhe2l*T4d&|~}t2rtF2UP6wcv)ri z**-)D!KR8Oo{{7XfxC1bt<0GllENTokS8TMAW4Ja03Y@&QU#HF=;{ZsU`V1t+t=J1 z-E*%EP1L8QU&P#lh({eGilP!E@UYs6XAtKmXmS$xKxvO<TchO$<viVDR6quA)Rcka zbs||IWfr}mW5iC#KFklH1J>72$C#?O;EjM0>;$AV-gyuGu$F>NU;Is>WQemkBmUh| z%vLhRnY|mtex=RwTp=&BS`FE|mwdrMpcM!N(eiE9YD~@-=E`Q8Sx;&jQo>Q4X<iG3 zTAHTgXHk=7?cLbu_n}q_^jfkUKmiugaH0H)AK9rw#RI>pY9*xY@CSUTu!5H&<2=|& zQGGtL<soo3ovY2A+nI01%@mjdnPt*xlxZm7hZ%3q@0^>f<<f}F{C~`d#;?O**Ay?0 zW@IzPVj-BwWYXVPL9UxdCWPvhlo$_Ta(KxqDv{-y^D8S&{|iu1=ky99^owyHl~~5h zONC?b^7x{8LF2fO1uQs7h0-WTCDuO}-L%=YgV7j{#{UOE5`kFDrYA`@BJSF49E=Wo zy&>Bl9mw!Uw|YHGz}}H#;Mk)jC&z%qj*q#)kAXiH;I$8YM4Gu(_~e}DHl$}INJhe$ z{W$lID4&opP7|2G1VR;B2s07Z0%!{41;qmgR00`-A>0VJvXGe>+n~|~J?Dv|cV)^s zL)u?vPkmRWEp9j>L(e^7E1akAx)VtHoD*C672POvFMoLV)7sF@psokZKL{jQDw<M@ z$v|(^YqjKk=swv=4mU%(ip~>yKJQ#>62AJpb5R>M>+xl1UB<Nnx*jy23nYtbF&@ID z4DL%qIE4Gua2hIa@_ych7Ue-`YZ5RvHAL6U3Y_RG^0}+l#cbkE+9{gA&Ko-**NiYi z&A6Y#fBc8<|Jcs`duQ5(B4fn@YEX!FKN^b%DF<XsM$vC1fEP9tJp%8Ka7s~)aPnnG zb3gi~TX}eRX6dn~KG>4oXA|u^Rm|c9i$}qzC!<BEkCAzz0E<3m9%f4_?iu~LV;1-; zw>DAYK1PQ!=}?HHSm(CzcS;|Tei*RMX(9m(0S=J_z{Pk42R4$zxuOKvtkt0~Z!Ts4 zX_3rDZ%ThzU^Nmp$sNYz=M#S>kzJ%+7Hxh7j-#kwlgDjj(%bjQk7)1he0>g91=}`y z20mYj$mft~JqlD4eaE>yIRZ*k*nSHe{h=nGE2saOJdLzW`L?(9P^nfz>%N17`^p*3 z$<KXs3$rF9nw!W!X<6STvkTxQdX{xZC|pV*G|LxO)c2Bn7!GNkus^OK(_hTzFQt+h zzws`jO{l-_Pbx_DKn;jRY2?lG3zBD6_K(|0w3+PTf^Jc?$64tDB=`F<7U1VN2Qtn- zN&-8WCC+10|8dTR7YZO&OYUqdTuA~2q3ah<>Lg1ei6<x#^w#Q4pB5C>z~2YFUyb2$ zs{@eQ;fO1c##$r7UJe&x5RJ#(gX!X&mu2;bL&rAW=ln(%cHgt`VxyQ;uSPjV!BHjK z3Dh%#S}RJtB*_V#D$KI<z`}Gxk0>S`ww#&^f(<K0Fs!K@k}t`tqhEkOCU6b=<u{cJ z;w`!2e!tv6ez1Gi@z{R_R<m^p$yd|q+R;Q1(ZY#|ATX{Z6N+(Ng2s#R&g013`y57= z0zHK8Ld+Vz#9W&o8G&rLE06|B2?7&*8{s^VbpIe3YVyx`H$rKUmXL0NvM@lWgS@`e zAF}j9F_%rUWWcL<GWkX%l1(K8ffvp#AiL~zTawMo9|CEI7s2#vJ3kJof$72?40yqe z1&%J+FaX4#M17n_KI2imfn+M1E50B%Va0T9WDDnB=(~@$-9OyzL-B(gSmMrYOzwx{ zGeJk^xL3~;(g8Ap{Sf>MBuq-Dhm#rrinuKPMqdhM3rrzAy^f9syoO0cb-lTcscjNZ zOsEkSqdL{cff5o@yVFE5HE?A#zSvGmWS~pT-|hy)<mrzNo7ZKp9;t3L*V+6sFJc!# zsZ0<}1u?FXNa8zIe(eQ$-rZf$5TU=&u_<>KCeg9$+_8szGw>BXWlx*qz7yLYbb8NO zv&WF{LXUX;&CcDQh&`E1fpd)byhb*c4+iloV)#~`e3Agf1vAhLHD!V%0M7)F2&w{~ z6*mF5LuxpHLTe5+)QGzWc4ov07jhmRGTN_5W%8zpBe{EPOR0!)(6(56E!k?fOi=_E zj1VS(NnfGe!w6%z3G!)8d@&zzf&t0|#DBCmOq>CjhY$><fUj>sH>AkHAk_fGOICG% z)R!w7p$eGQgl{uYE;kIgKp3%@;nzb((<%oxeTjH8nKa>9GhdqbM~#Np8$^7v*X!4* ziY<FdMow3hiUl97`ixA|uc>;{N2fZZld8H$^?Fs0uF{DP>69MTESKkgO8+VPL3vH& zlo2GRoccxZFgAFYATl$O7Y%8#=*jtmHZ+9IsT}k3R6h}=3cpl5-yRb>7NrXu3dIb_ z1Y^ij+yT1n9J={}XF|5uyC3j2@|M*~_|k<72`>sC-WD+Y4<|HDE9FT~*Yc<1fvn%q zlQ1i6vl>dswAeK_%hHl9PvD9jYu&pLGB-EP`OR`Clt`o=Cyimt_o_6Xi+QVYoApN0 zus_7J5&b*l{0RAKiTo<dcs`zY8oYND{8k;j1xA^S^<%{uC?Qv%DMUH?urA_+gMs^r zpnbL{pKFJQA~OnU#zxm??wAuUQXmq}Mr^bUA3}J_pMjp>cJ6ylx%r)75Z=G2#|!=u z>g7iF6y>=PpuI?mgL@|&(Q&rG-o%^a^(qhwiir5?t?vB1@!i2x;D<B*{=U86x@k=F z*iKuP!z@nRMw|_B)Dq2oXA2wN^ihJF(wXlLq=KJTJ*~RGg;V!$j{4Jtw$m24_gl_j zJ6oJnPOgfvg9OE8m>#e&dDC>!W6)6XoMxSNxj-dPHK>*q<ZX!(`G>0Y#2j8zi=YhM zI79ew#<Yj*51371ipR$0{VOxDi-<-<sv%yD^(>0ZVECSA+C^)06S_O;K?;^^91|32 znZX^zF(Ob7;c{a*90Cr9k_EdUabZ_MvB~eg1bYclRuBb@A{3V$q5~<S92m!mH(C6| zXagK8MjQ<G|I6E(M>lfccY^gR9EBT&vjFfwfglc&&1Qih2(sC1R;#5Jb(*?cK4Hs} zTaj%sK4sY+my=N}zt|BIJ7YQ7tl@Dy(d^8NIZ2%LIPnCr=54&096jr|v(6uxU|zCW zO)}&3Ox`AbnKgPp-`}qaC^SKKTXF&tRlhn=^*g`!A&NsD0xyK#`>p!s#oIUa&RmIs zKkAe=FJ8nEE)0g<-y5lyMx{e%P}sgROhY4}-o?#QhaQe^2hXQN`}z9j?ZaOV4k!63 z=+5I1D1gV-gE97jb57{!b?~k<?v#&+yyQeaAPBZaL7}CKaip>AaC!7-c${G(%UurJ z`sju(o<tl8);^G>Fqxe}-l?|MQd${s(wISjT%aAr3&6LE60>7yTHUS%`jeSf-^BF6 z*Vbf4qXY<|(FeWWQ}oJHk>Nzq?UFs0ub@qbSo=#@`w#J)0bE`!7$G7CYEZmGrc`c~ zswB84**&+K^7^pOZBZK8c-9h}kz8xz1^_Nhmvw0BTeJW`7H}3*_y&SH80s-M)H?CN zT;PXfRrHZ}g`RoO7+kq~GrfGPQLU!K=ibD{{*h?WSUGcRYkjJqr>j*1@+&9m^{B)S zpVzZl@6}xHDk-d<rw`2Ji^ZMpi@Ds3mve_ITe<)xLM~q~RHwG(fkg@ezdzvn*eQ}| zmgmkC>d^9ZM^Iu^Lca-|ZDHM{DNa<1ysx+bm~)Rp=!=}j6gH?_>YEVj?(<C#OV#9x znyz!o+#hsI6VJr7fd3cCYIUqY;v%V=(0TYHyoTPyADx3vs|^SD)64VAe*fI5TW;Ci zJ-40HLg6K(3|%SveAA)X&?~3l={~oy*)l5?SzcPcc-!4~pI?i`iUq@1i)U544VW~* zuL-olt(8H8GEJ^75qcJ#CKq*4pDSMm5>zKVriP3t1(-Vx`0Wt4gP);(Bt3=DMab-l zXCu@*`2z3+=2H{*)U*-;<Ux8)4}fxrTFX1Ky>GBcBnksmXMg0xmD<d7_&<cFXKDus zYyf-QT%@QkGig~bMsm6i8N^GuTq%=|;V~&*in3wx`jeMn8D1{Kns;9}oAsJj!+*VL zVo)5KMB;6>^Hc30`3_Z?((wT15v;7B^JvXtLzsH0W$aa!w$Cjt$ZXNKx1Vv!>|Jo9 zG7LzFextQ#R2G@Muy}5J$#-C6obsEvCk1YD!;BhuE8%m`dyn4E)tuQac@;w6HU(cJ zpbG;gs!|y_WaDJu#ru>P?4s;nlILnW45}=;l{4MsN>=;Htr}RCsc9plo!4ec<#2dj zpFuHWOd|<Uy|xv+WpVMA;61T5;3kS25uCxkJ`)Uv!@=OpdW@w~Gr@d9#U6ebUHZwn zwY9m~(&^GdD71jx?A+SgIeHD|ll)mFm%d9Ymlx?L^xO9=Ft)IhhGvMA$aukGxvYWo zb9hTya|D0Mt53)dfP0B5k`Zf>>|v0a4a8oiq9iCU1}>3kV0>rkSbbg0X&Aouy9~U2 zuP4MT?kz#nL;Vo0(z=10EX$;1TiuQhVFLZ5N>~F9zgqx}dK;|)Mgj{SDuYZ%L3M&X zg4uf&kdSh{QQR21jHwQGOYlw5LU5%Jpd)ckplK0-mRq{ux1c0&Co`^)wGjmWrY@xa z`ryhHTR5Sb;?mv~=h~I4!&9tx<hH@pE6!!-2ct8iXI$ZM4jT(LbX*Tj4hkF*fwO=Z z27gW2GSM%>g3Q!Gj_4v<tL;XBKJxHBA~@s0Q{b;wNwAU+0cUF<cT-Ga>fq`%Ne05S zI{m}L4iUBJZ78<;OqXnWi_4kG`e}yCjU`_V21=aeQ9NJ-5V*0K@(^c0>rZiH!&sQ& z46_3DK)t@PQO7QD{+hY_SNd1<XB^}%5`O^a4=D=3yYm}l^;#}(41Nno5|HSDLlzj$ z4~K*Y>M39Q+iN|E;P*SFpWyIR80aHyJ;6iz!wM5ye{GW%WUbmT$n3DKk<pI0i-0^` z0V78{!2Pwx8nA4&fj=A>LdimpgCa)Uf{fBtLKFNg#OZN!2Y&70q=$Jt!SsThgwT{C zl_>cHwvp4P)?=w88shU5GjLGydgF*sQqLx3Fol8Cf+v|yCsRn$5txIdBoaYho|RMU zfrJ{GO%#<_JW$Wvkt-)*vEh+}8LV2S;wc_D+C|xi0*R>Kr$i%u9K~~m*-9pw&Cjf* zl0lEp?}HK}bQW<@WS`F~`+~tZ?DzeMALLU4;fR)lneQT4|7b2Z%hof=AoHRD+q7f; z@c#s@OaQgwKkx>!aX)>~{Vtv=0}Q%k^D>~);1$i03S@3_i(_Pp@Fw6RtfsLVHIn9% zbP5s<IA2g4f5d@yW)Vn|hIeJ<wvF6ZHrb)7g0M4^@yK)OrKJsZhskfKGVez-K3{v` z;YAbX94|U@d!%{ls6@5&OnuM~zR7?Zv{wezgml?(V|!%P!!G*f${sB|XXJLj<ER$U z7J@5%Spt0+;Qn6-M*(V6kP}!qC74-a0r{w;gQVzT)sgpEZeZk`Ek*dDW0>ceJsu>< z67~)ODR%7-*?(jI3eTqO93^<&Hbr!ERwEvb<{p#*p!H!$1P%bbgQ<jCE71MY4p&I+ zLYM>m0WQ&0gjIbri`&^N?Ai4@!Ne<?=dnALm1k2kkq6J3pNdER(RwhCZvT||r}2n5 z_n32LS^R=Mn|;>%HvEXaAV0gJtSm2A@@nX=^$!nzrLi7rnV(9gzp?$0KaeSZ%4{Xm z;@qD)XT%TWXR{xs-w>oh4iX1nkbTN2!02<Zr4m_t--A9SM_5X#=*y5bP&uOjstB${ z85XDyc$<%$aqb~8nYiejX`^$*8IMC6dLZ#_Nrfi}mON1a>TzbtFmCB3X99fBxwPk; z(Va8HSgFHMsl#7AZ<@eM9dP!n*D3fi=c5-NIG^zqIv1mZ|KU8ybPAW8C%$;(Ox-zC zckUUU8NQVPF9Pyg_FV1Bz>MID3Q~>y?77q%s|ltpB#eP^hK8V^2?h&|_K8-y66-A% zVA$`!Rhd<Ow3U4(8-tkJcW0&Y?+En)&5b4d?S5RDEiS1)6N~+K2*6qIn)JHY8MtYp zQ7+-3zHJkwio9DT9*P_Wf(eSf1m>-#NG3CZ(Ry&U>*CeeVgb=1ou*SHGLc5l^1|{E zE#^_Oe6PYn6OtK>*PwUPc9ue<(;rz%j!F}4CV5?ZGJ00}F=+HZi@L6ZLlgWxmUI@g zS6j8SB-Kci$j#tMK3r?BLkIx42-=+lZ5$)P@Ei~VC%J_Ps1pjIuu4mS&f+J{buM^p z;YRQ*q^d<wTijp7E$g67fwi2KG+ZU@Q_b_?SkjYi&O@wR35Pf1sZ@L#s=aJUhwv8% z%X1|JVe@1?;n0T1kEmBjNTf!{pdRtJ5L#<0mY@S&PAa}aFw~BOJvnbIor=%REtAes z_DmtM)JzOfgM-0}JXP2Zdb2<JvV+n`%>O@&ht1XZWxc_(g(*)3HUn`Mn+b(I)3OI~ z;9{spJdG%8FqMsLgo0B(B?-qW*!Cx4Q)(<4N{8uy>Xt;LDn;H1hEVA^i<eLjv?E^7 zOPVJToS}nF(ARUdT6s0=Ne&#MVn~hHv=b!DWZ!x#Sxu+72p_mVPWeiJvuytWE}|>f zSW_b+19Sqp2MDe}qtrdnX<}6H4`O2lp$;*a+>C=;ZvZegC046F@F2i<ek;OM7Fko* z_<k$Tq*@-_=7SH^aIuz}Q*hZoJuR#9^t2yk#C3n=`R7&jGU)zLxf}vZa2YXr4k(u& zeY>9s$bnBDAdv7UQTRmnn$#U$Dij{TxjWNU`SC#Dak-kl6Ne8J3Z`C-rXnjVkyNy* zW4#f-E!J)mS|x734muRLJkg?tG&4jg8I79ol~RaMsu|@*%RX+wG*3)pfwk5UZ=e0a zPl-kSQ^DdB(NLDu2ig2=F`wb3aO8<%P@W1piud3YxDz&l1@Xr3f&_tmP9jR~P@?4b z{ca;}F2+>HGC++jk{h^y7aT?!z(HrQ1`#s>J`0@T9oshBC1mO4jPKYMexhyIx|QIP z{<#a8pUGUv%<Fm#v4HhR7UuXtoM4x+3Bq1K8_^L!G^XqGnSAz@>~Ah*2LCq0lBoQV zj|CVG=>yRl0!C2I9;%~lrw-;k0p|*mLV=y4ZiOuX+1u3|ah1cTv?zjmi%G(i{7G|@ z>6_-0!rJ>u^M3RHxI-{0Vr%w#0L47JJc1UG5i8K5ow{B^odk~~wmr+j6p$Eg0LQxU z)0ZkFjzUHsB)!vQsjDNePG9eKyZd02_Pc@><gk9s-#XQXav0oHxdoOBY5^3Rl#jVg z;SaDV%1FC-)Zdy(U~ll>H(ei_-sJBX^S4gXqv*-}dBnT%0vo;>59t6^1Do)z%_zAC z2P=fX(B?1k4vMc`mEMZ1ff57PSO(dJs2u<UfS>@p!aRmZGa4Vx=6ldAoS=w6Ew0xi z#*-LL3Udm+ljON2QUikLbe=<}hrAOrlm%5khY*{>3uey=`Q+?PD-(^8yiSZLm15Bh zgm$K}mqheL+hQdgP7dh^W*}gyid-RFHBV1IpkNHD^GIG8{M70qqBUxDRnLhDkki$= zmQekRz22%n7Ed{=D;1CV*BxR-%wgVFDNrF4=fIxByieBJ%{J_VAYA1#lNmT#6OAtd zn1FL^jNBwi3EC=y%;qvH3R2V}$91ma1SEw#fee7@o>7JvSMro|y1Jn7-ZBmk4Qih` z-W_|;wHSMoI?oC?6c-zssKUlYSK|p)^c2KFx?$M;bbVi}_Ik(l-0G;GI6pq@r&A~O z(r{*w5D)7fJjcX_QX`!)?DMtUJFWrFZK4TMkE8;CJvUdM@liXzK2FEqpf2vtq?$PR zmeyNVI!~BpEQbyv-vHTwnWTKloEjpnH-YaaRwLA78m3sAJan)lJ6T$3*Vl43qRh-F zky&{KN-8I<4$A@2#PwW2Pbh(alF$P=9pZ?$+I=~eYbR8#A|j1yh>-jSilwPFm^~6M z(p7bB3ie@v!9H&fhwHp=$p)5eG7x(JVa?MbI|+>{^3o&LE+7fS4+KmQwo56aB^*2u z(@8KEAf%k>KqzAm^e|NrjE~La+unB09GK?0`*}7PogF}?iDYxmP}jZQJ<Bl(LPZZQ zUk3D-bbhxR#%U5oL<M$CQ4Qq=+&B0dm8phg-iLnW`ZTIHU>ATZz$+<s2_<2@Djgbm z%Q8$j;y8c{EIB2qQ6IR+gh=n62iO5Bms9P*M{Ie>UoCW;Q^V)!Zap`!E*&0T8k-XY zgNfF^NeB%5&HHi5i_UD{5T3?MhEXcjcg>gL_s3r{ck5VdHv=v|-)?{8OTFHgJ~CEU zf`J%q$TWb$Zvp};=)Em3HZ|yMw27<SSyl0|N>Z(lTkP%y_IXjsb{o~?^qg4pdB`6m z5S6H<@Npk^a7)+&+aIZ4Mx}@Dq7l98A=VqIenzFio^|Dl<zCa&Cn8$*F?}))@0@o} z><nim(Eg4`s2-2paa=bz3qioVOPKwz^SBP~omj7NxOZZ`oI%>XM0L8fdt9B|LqqcK zju;cjdVA6wWe=+$L9I~yK|Z1oPslW|4%?n8KpuE|(&GbUaMq%RnW|$6>5;S^z2Ky} zyeC<$lyrIT553upZocrB+HAMmeZTtnElnql<(9FpUt#fBwRZbs=N5D=>;F%>{_>A< zn1D$_a_0z-$yCD}fv_3t9j;GU?<C~sl02Nbu3*X%_;-AtL6#fX<_@3*9N#mm1A$nt zgLQw2{|j2K2ilVCl3h8v01nAIoyU6TW+%3#4WN&s@B<?SASJfEFSu%yxZ-i|572}_ z8IUo726MIv&}d~qS3!R^37CNoJH}QRS_s6E*hA1(+Up=7kDTCyrOCGwW7-@Z^E=mr zL}H9C9%5pOa+<1-ap=N}xd#34>o5)+qKvN;5RJATcnF>;VGUN<jqf{fd^w!`P{QK? zaCYcia`s1W>5_X%*SXFM2M$2*4hsi2br;%AvcsN?6$D@R45V5`U{A`a*983EmTsZ= z<g5hcJc#QiC~BzaiQWcJhizq8YEvmiql#=-a6P4~oZYBUi4Q!9eqhMcF*{IsSdi3W z?xOF-r^k=6#fL;t_&~HbAUtg1cYL5b&X!5IOgu%0|BLY>zFEv`Zex(5;Q+h5!d9CG zCsTx~5b47SMeuc9f`vC>jP<s}mX~keSZAw{?WdBhb+&~xLd-nxD-^1frUx34jzfJj zUBCCtnaq>yEuP2N(}niN?HPoSgqH>R|G*$3D{iDY<(rUO3ac9|rsl|n;0Yj#kT?l( z?C?y71ZG3oDa$z(80C5zofD$6UFVje@N$%0YIq9uk|iB<Xdh!f2b&%V9J;Njqi%sM zkLVpv2_u#y^%q5vAl?Zf2t>SdEbJ0`A`G2I^gc2dMi3z~QS8Aqa0*@_z!iNJF-%VB z$e5>-SCop31wA!@xO6<?Uou8_n%oyImL$9}z*V{tLyzADR2y$_ShXqL3-1ZgBdCX{ zBnB7Cb1Dld-pGi97#LD15sAn11)%<|5;UgZ12G@yG&Kphzs0q|^o%k)H0Lu}a(-Sz zuH9HHlTK*!xs+y-dfYx6k8853hNeS_)L_qCXkK9Jb&NZ$v_0J%vN1@~g@8BF*_nD} zW+s-2mr0n$!s>cF>QCu<CNeWqLvTobNdxH{@STCBU{de*x?TC7C+5q`w78+I1=C3D zS%UV$ncLy9Rk{Tjg-pL(uAiy-2vrC@JU}uGu5pBQifxTbo>k)fY;`S}zXAYTkfC?1 zYZBhfKTNj^UDGX=U?3s0&u&~g+;i4kkFQs(KPI_l9emC^@FW6gLNRi0K`jCBIX)x6 zpW+}CGK~_3p`{&bR@ElZVMh<|nph1T)9N5t-ED&oyQ`c|AJ!(AeE~U>mdNa&Zsy?N zVxys8V&$rp<%5y)`lw{O!-EUHS~jsRMBR~!>x7z@j<xhr$P!b|OsX_9M=u|hOw~e0 zLUm%jk7*^r7tZsz>U+nD^*y1d1zzX)8WPeiau=Ui`^jC-u{7UIY{0~hzhZDyOdH3} zaMbT-d6wSe=gbK`Pw*T(2rYhqD=clS^qU`t9lg=e^ZWUayDd#8HfqwS+)KuIv$OAZ zo1b#|T+be(6m*beOJn=_5?hDl!bmS%g7bbk0q=3!n5LqEIU%9;4(nQG2WY_Tvffu? z-)DNSX96kaZ(q25!My#`4@5qV>X|g%d#Aqo7Ub9F?hyy}<;Vk{rg`Gl;gFONkt1M! ztI(!`Z?kJz_-8$QyQHImc8N(m!_0)=R>;SLJ9<!3s+Q2|jDBGapJo3R@VkqdO18g{ zF~AAmLl4l%8x`qh5t>Yf1B)ynyePA<WbwtGb$dN3+8?xm@Oz&>D*+oUJPGnWhHis* zBmf{pq(q1oA@zgk7#e{VbOt=)mn>c+ORv;*-NbsYzk(N<a4>k_Gg(c`e&&Ht5O3k{ z?e=h;?lI9GJ&FrjHml**D9+Ny=}Ws!320g+-XE^!z!<IscO8J>3`GT|4sy55>J0i< z_AH%-Oy>`!4RZPPbW<mt=5_Cw<s1t2bQ@t&sna-l-6Hvnpv8$i+lCWtT*d+(d)-TQ zWa`!K(CaUOO^_uk*wM63(CQ3dYl`cD;ypCClg)O})Sj!adGsS1XUt3raSp)7N&6Oc zbPG2Qx||Zj64N`ZM=Hdg#UHPCIo&4ap50#|-e1&~3I@$)2r}e)iS!9RF2KbT>8a*{ z+U<9EA6cdf2k)+l89`6hsgp#{*=tJzyv|E=pxRGCrh@oaprDACAvyqmgx+m_TWgaN zh;lI#rOE>Va}u_uv`EGR`hd(oCr2dwc^(xN#>gK=Wyr1+!-szz1Bv}{tju#fS}M$t zE4tn_ajU8KO#BKZjI)5>RR3kv`#$8lx8s0Q2p9SyNe=i?vg{|J8?}b07h#15(`3$f zILCBV8*(R3%WcINH<}xkg_vZU!s5Y027_Z5_pWJLFo>@Tu&JWZ%+~eznK@X*aMgva zusF<;qjo~gX32<6O=K^-59p!>RpBnWX*WdaWHv%MY>k;(9aMDvp|I9_`26{)Bk$55 zC{4|s+1wRx5pR5+5-7^Cm`q=uK+%0b7dv6R3Vn-LVT)H`+koxf)Kop1o`vS}!Ld9x zX<(IiO8*GZ5A+_*3a%iaj)Hy{2AM<R2%TIOssgTG5FJc0Fa#}3-aw#*XJnuklI0-Q znh5a0DP`(gdbj}xxVD?*qM>VAl_aN=`yf(4{w^ddJv|LCYQ$R&!rl4P0d{I>7ldCW zFgv@jT#Uwx8L#M$;tYJ`Rk$Pipd>Ys^H?Vb`b<naO*EoSuJNaUB8LU*EGMsZ?#eeS z_mrR@=z>bIbpOuI%*-N^o%84}(>|8UW<}2{VG8l4|0_RCiT#S23m9|xd@#&C{bLob zAYs2fPVkN9Fs;Eg36kU+u0I8R(crQMhaM%jwh?v8yK3?>d|y8vRO$O?6yjR6iCWzo z73spU3-Y&3U(rk7r`-guKHes1-E3ac&+RYEup4T@Zs>OCrJq8?N}55aBP@I%6-Ns5 zRmj6Zc4V<5sMDsIMCv6>5SSSe_X%4AxRc-p+*VU4eicGCA^7O^tww;d>-)iW`D}j4 zm^xd%BllA|%ECYioU{*48M!;EXOn*a*-+^0o5b}`Bf@)5qwBe6?CW&Z@BfkU9_o%C zzDUm05FcHh^voN*^OSfWz4_zro^+RAgki7nCjo&03B#I1u_`~vXG?WO20o+pL1F$V zAj}$HOE&PP)rLQh=tb(!X13XIdX=tXy<r^#FhZ0E8$^_`z_}JHlg_|H$JX5PfXh$< z5Ch1hht4Owi<-9RO(wv+XDBDH3)G2nt1!K=FkMI#3W*<~jW}#+kr3izi!Jal3x^X^ zVV^G%j+nQ|k#Is$!kQWhBgJ*mWGk?dfa`Pwyq*RdM6Vmj+2w3{ZZ4h0hxYHr;zo{a zvGvIePn9*qB2CDiRNC*S!vq~7X6f7<xwfERbC|D}(XShbruud1_oV+om}JREq!H!( zBdp!p^0p{a2DYr-0NihYgQoQthlqqA7C}PTRTI^;9YWl}6`4kadY*^!8wC!T!5#Fi za3674zsL<3)p)ji$mO~u1FBLASy7-94Uh_;Od5!x&b=n+UG!8ueFrH60DK9d$#r-m zBG-KYp^qqeS=pygpW0IVo<PL6m8|E|iAXT(OTYjRHrw$`(dR3-*Du_6?p!gEyh8`u zXNI+DxooU#T-?|!C#Mz*(NKsY^RhIUZdE@&cy}Qi3c|K~+n?}-BK}w^MAAk2sq?Qw zu8U8QaS4Uv1WkM0U-rXgFDpOj(}Q|Ij|4qSg=xgb4x|HFKd;qnr8*N2RCsuRrNxW< zK57XX6wpJcTNUyJz0^)l%_LI@kdd#HavJnsL47ys56)C8vs5!b)r{1}(1ixI;O$P3 z6=#1)!I4PJL*wor!YPVTe!uiy>C@6bb0WVGSfXyG?k4a<!z&<j%^7Vz48qkM)=Oj- zijekgLVaAOODm0{7TTf}KsFMKW3j@dN<5dIzuK-43y-U-LvaedYYpl_*qR<aNmk<0 zaRd{S7IS%J+LuVq&L$JSX(gXqRLN~7t}sAtIa-gX-WZIL^>|_`qaQ#NAM>i=g{bT; z`j`^u(R3g<NyM*7fN)+}c2wxJmxIy%(Nnl@vJhELr4liuoS^L4p%@a#%UwuzvIza; z2L?j?PbTYfW(xIyFQtOnqe35!IYg&$1vbkF)*bgF?i27Sp=sqlfW)BU7!1%ps9>P4 zKZCnyd<AZ`u&za9-?!7MCRId(hca#e$T{T&lC^I!qI)4!!4`isI+SI-lBJVmH%%f@ z6lq3~yJcH}s*&GCOR+|$>Asr01=BN3dYxN;V@+I>2B27?)5sN>a|21=;5U;oM36&H zZ`yv-8;K^9K5rzJNc#RvnE^S0ki{enOGcCVypAAw!50v29Zx1>G+JviB5AIkaf8Hs z?jh$f^sp2?+Lug5qj<qtSf%B(T$r@N!9p;i_yfUYGCk_64#zFGz&qg`;1T1n$Xlgl zz{!j%O>hVDpz+jFqUB&62JFKx!g3GYfu*ns`#X(yAax{PLv-^Ie2q}G@X?<4LuAN9 zZl;6L2Qs<zt+&3}-K6@wn*8;rr{<?#LWYr|41am;{zA17jV0fn_vLfT%elNiA1><6 zrd|yF-Z)}rKZXW2D4ZwGvt;OO+<R$bLw1isM4S3Z?e1hN`QBW$I?aF>)U&CzR45dE zDIJJVkS2hs7^XkwTkKcdNO?HNhzH3dCiiEgzdDhALoX3O!o$+oDbxjrQu7co41GKL zuf0jQT-g09Wg?LgpL=w^#ql#uOaN7mwbyA9I<pV`ef_cK<G-<=)gaNn{SI+{lVrl; z-SDp>(I%d7!t<Qx6P*b{U=$8#RI1f#!C*Z{LF57fD%Wa&$Ta=x!QiLofeAdCHa)EZ zDJK#smJY$G8!=lVKA(&PL@@h@!GBm$e7<NLGZ*1pGTBthi+g8hb9pa*TdmFloK4T1 zM*K(|PBA>oBlA41ul`X~uVYEy#|j0%zYwOlbY3VnP%ij=l<g;sGP1HFhYZ6Cl|AW{ zrp2OgaYqCjBm{z=gP-|5@L>pmL<)sNSdRe(?(%W3Hx|nmG8r!jlhWMOlvmE@7Z>%C zC->m+NywzY9|en6_p`jg8$8Q{`iN&y#juz;t|M3o{c%d@l)$lbM<~~k0tFSVR7?nR zDXneGk_o2UwD?x<6IVnCy{~h*85byEBR)Dp9XnXx0(in%`@JUKi-=B@vPN3jiZ3HW zW;56^na=cXzi(W<3b!>5ulrDe2zgfwnna0POM4O!wbe+Rt>9Z0BC{^!09<w=WNt`? zBq2t!WtqJm9wjLx@3Nnjg~U)qj)B(|*B_;9lxx$tA{>QqsvTM>B3cDU%dUIKCJv+^ z$<Ew+iEEk!+!5O`hDdi`>Ev?V>;6Rpu8nB|Ecb8vZkY2uE}`s@pC9-E2=+|qzTv5X z-kK&mjtclEGTCm_vKsl|#}W8i&@CRNt+m=dTk$FwZ5nCu1xeq(^X=7eX0!HiqxRIB z_UE7d)aRZad?mWJw)@3KCj58IPlJ!dN}w!8Um9;K_rKK7SgGhBF#FZwZ_0nrxYoUR z>XbbAZwad#eB=?K*+QCn=KkVYRDHtHVw|$l9H=np(<-AG2sDd7!XfK54^o;4)T|&M z3gwI00aOIQOhd*4j@=H11Y)Prc;t~r1Mvm_DtNaCSq|93!nwv>0k3lB()O9f`8RLQ z&$H0mvU`0Vix4pc`|=b%ve+^`RgmSCShA2vdhVY}E1qeXg6sGB5{X<ST!HXZ&=n@; zX%3vNu(mE`Xr4GrhibjrrT{*gn;|8&kzi2;PIU-NIuEF;IUXRw3|j~)F}VVP*{Ni` z-XaGfa;;4zL;1mX`tB(*F;uWR)Db|Z_C*$2nL%(x{GOiUt<FMF?Vea8b;_u;M<l+% zHyA62|8&}YH@7pt>6SOOV}l!LFy5hY2IQ#%@}T?BAvf3Zi3*|r1SJINB1&V5h#U98 z!9=~p>?~;}Cg~+Cz_kE${uG(&LFq|?tR+Aw_=%)EC1sAdXbwt;^Pz3$G~(O^C#yX6 z51KxjDK|ea^c;i0VX&VI)MW|bQg$1wx81w8Cd+GU_pUCaW(L3T9rpzJ4m-r%dk|54 zYf>BCQ>BM2pAzfn@@cT<wd$EO01e2b_PnAXBM&~bWp!kB8_knZ$vtBT2KVIgK6>M8 z>?PRK5|J*LGwQ(M8k#tVUUe^RjG8nmO`cXa+h2qJq@KTb((H0z4E0?E7A5PjsG)dG zm>>|nqy6m^xpcyb1~wXyML;6YO^d*+AZ|HP>g2M`r4~@rgZ^eF*<tj^#^Qf|0cKa< ze;J$K_|`h2*0fDvYI*R@gH~k)hwE`VK730JF#+jzq^!a(2fz3<OtIK+V)N5&#Hv|u znz7g$=ic*zzqEqGR<UCK$p`MN`fYuM1=vXbw@Zj2DeB8BP0PRzhD=2)6!N)rQWG2; zAQbo#0jTBq`K&fe?_HcKAVlQBw+#B|2gdxo8sO0#GTC{Rsy82=E1kBODYDsNC;+Fp zz7F$_>Tp&%f5SRJbpcZc@;!oz2F6(EUIOG;z3_U%#qtR?yJRqBGsXg^B8HCTl1NT% z5~pmQSla+r5#_+~7L-^9@|t97ekuvR1N`i`oG%7z{!@T1w+fn#qi%|cQG&7)j%de2 z3{o#?BtsHPE)S`Qq<(i}z6|_W9()xFGs~DX9pm6BAt)#9gvz<hUbm*6UOu;s`1DYL zSypGX97ZLYGP;2cw9(GoH8FQZ{V@VWao&9GC*r}Isr?ujyP1l+!4(u|4lOb*m9XAG zs*=G4DbfMd@dd$5Uz~6HPy{7vk{uR(dbAnzdOfC7X>=Z^s82?)aE43yFTq3OA5)%H zaM(iR$`OTNu!(pOx+=^-+X9tH1lSdDJEBbOda9y{5O?D$fmY?n8BX;=dc+lb+#uaC zq-`rr<h^aPt6r~m;ldl-%=g(<q&Qq{+;!-X{&3SU;HGfs#x8cm0h`OV{XE1`chW4& zg)dyjKa(D8wZ?eyeB<I>ja9kpun}oUhJHVn`+bOo(pTNo%7Od!`|g9mM7-2DJ7(wD zae$itA8;IeH?n;B`xpmijF#)D<XF!9eGJ4zbO&kJF>B%T|Da=V!dehObKIKe?_)$J zt_)RB+eC8z1FnuM4wX;lME3X){B~@r$;0JQjE`+}Mg&O9N4P}>7`$%pJKiD<z?A2T z&MbLag1gz0c?4*(M`Pvrjlq?^s^Y)P|2q`VR%M+@5QOj)$v_3Bf;PQ3kjPB!-12Gl zcPv;r@c-UurjJT}!c!)svpU*JFuw;CKGE?};3-&YBp{;@#zYe9bSZA0N!C5Q)ah9k zr!Sn}5S0UK8lDTO)g+SusDO~#0TvlVOjOWhZV$$Em@oAE2qS|%ZJ0$Rm=Ky~A0e}` z#d&NjD!c2&<siNih&kA<z>uMtfSEnQslaxG{{ZrnKI}XCc-nx<sE(^mG-l*c56c!@ z?xI2HDZY2`G@1rHtw}n3YNXWAe4mSSA;cwRYfY&DJIz7bUBQ`}@_&BWvE2XV60_J( z{%q#Jr#!O99(@NQOot9KEI()6Vco%2Kjzr)f8y=9@ATjgG6$h>EOOgl&E6MdzJtu0 z*`stL#(`)y(WhkV1o6EOX1*m48N1YIgXT)IWWaW@%M&n|)EsumV<O?_Hg8I8q1Z2Z zNc?vpN#Jhwcn+9zBIaQ2*(%j&!`bqiXSSG0RMY!qDG(s^bTF*O-lVzdqC)nFZepDh zBNU2!Qxw9fKbnf8lA93m^S*GmW$WbDcz!UZ=-Aenqxy_W6Pcb#?Hb%X_w1f~Vaz>> zw2ie#Iv1GRmXr)^`9OHhuoBc~MC*`g773;ylmrDfl2J<Ro5hut;vCud!S1bRGLt9+ z6QshP4k0B}S=^>y0&QNzGB(LV7euT{G>QoRU?5B<zX$hHy;f|VH4lrZHKM#3D#Qg* zO{$;xl9C;=?-pqWA&*BzVK97BMde#>9ay(!;_9N`zmU%@)bsiJY*ydW3$gUzjfoV5 z#D1pt8IdwaYJchS<w~UzU~GC?eAQ(cNiYVlJV#joe%!JSj%khUp8!s-hfKp_Wl&x> z@=rJe&gfy-V@N52DS#57E|E(Nrhv5JLCIhb2xG%?8v_FVp_!rVLSQPuT5#-0_Fi<_ z104{zkm6ATIN(@e8c+2{Ih96dYga9Zh%qiYvtZDLf1?9SFoSh)s>A<H;w1FL1ldwy zlM5tBp^c3e{3M;Y{w!?b4KlYhREs|Q2$t9Fbh`U+eO2*Lq@Po%NMH8W>mJA-7rg#8 zbk+@zC|>eUU=~2`i*Pnj{v#PPpd@B0+Ah*Af=whQ9O(wgX_zBKj^L`)2b7{2T>yTP zI*l*{<`L)6A<<-*Pn=Ch77MrR3#UnPl-0o5sw?GO7@0Vxr?Cm=ru}nBOXHt*pPN6e zip-`zz`c8J+1N1J3p;oXk1nsAP>r#$vX|X{9s&mwyxXSv2<y`&4|Sp+X&InamxnkB zTsnGho9E<&HjyS4%{}y7tC>P~VK&;SJ0bhVuZkWTF9;gQ^@@kpS#Pt;c2AvI$TRBE zY5zkGHv8Fx?`YqmQ49Ycn3NMby;vYm*114EZ9nlA2k*UirhIId3_kn6A#U;s<K_h# z^bT=B0=@Hy^mg=58ayFcByfmG>RCQp97&^aGXtenL*imkBba#GtN|*7&$Q!t59(+; z6AU8=G~}r=h(-uW3yEXog)o+s#SKe)PtC(LMDzOeFk2d-i&5!3BF7?rtQMZxM#i(w z@OcEAr`PCl^w_m&^Gc`FvGjcHb;!u>-RMn1sX8LqB95&VnLZ1n#4&s?`sIz%<FB!2 zPT&a8nT{vL585?9KdCiff&c<<x<>|wqfQ-_%n801w1z}~P)vi@GEYwE4Gz<|7Mo0L zMe3j*O1Esy&ttY!Dj4Qb>9uy#SFd{>fAaXcqPWZt{=oeODunYeC(<W3*DoE6r5^r` zNvQvZlf=9NWBkdq%!s$qfb&J9*fzIS6V_@-;!0xJww(fs&>0ytD@>y7Sf<-X!ldL| zpV-&5eMoyZ%}of3B|7Dn6w#0VXg{0X$Hg<>*7a|n!M(IriMD?k&-(`Suq%*dOB%P9 zq6mAit0O25<9lFGu!RKn32@6EO8Q#P2u)bIt99_K1=azLuz<&RV2DpAdgkbi4xUOf z&23y<&MrP?KDLNE$R>a6kbT3l$RGzBi|QtHS{CZI2s!J9#3OUs^=mc|%>!;!C)O|} zDhhh=cq-M>_E496Uk~4vM{V{racr3;s2y<zweOkc)d^Ez8}~0~3y-OV>|+HyW-n`> zFzrLpqye?ax^m1^0Ph6;ihUpOVTxi%x4ES|C~0Dg9HAo)N$!no%|#KTn20)HUq1M{ z?jCDhr_p9@)a=a5@WiH}rlId0GjniR%o>_P)bH2NO>WxQqUmUx+$mgRP~+*McTgQH zHb5H<ir$-<cE{CYd<LT)$`HR2pDp~0L_7qDdijcICYIy`R|AY31mS^gy9!p0R8a5L zja|^7rt|6Z!r*hmfzx$9a?ro-B1z?-Crh}a!~gl_cbo~r=f<e7z9Gi0BKk_iNw&4) z@B!iCbq`UZL?dykTZYZjacg;eM5t45ZiLZif+nH$oB#*$q=a}973YPtj`4m{;esj= zMs&g$xlvQ*cpYhuRmYCjhDRCaH?)T<5Ox$7&JK*)D)BQgUTSO3DP}Jqv7}602^JfT zBAIy>8?!lt=t8oHWF`l@p|NtxKJDB}`%W*NQBxGXE2U=A%;JZzCB{KVf7!kEUe=%U zdR31{_2Q#?Ocn{j$`LA^Py}Yhlgp-aH|<&FPgpPzXVEC^dV=gv_)!e8Qc<?ohKaR$ z8;`<QMs#AkBarcfl*GJiHwjp~Pc%loG6uBD354f#enoqGK#cMlv;giwL5$gk`^*}* zi81)FxrT=6ebe1lqRcyriguTcfjU);h|}GCG^oc$W8*$b!2*n>GTN+jKa8z=*Q77F z`%IL1mr+r4-WPt{Jxo8&q(Mpyk<<A<=ui=?3fsBniME=BPLr_2{m6RwPU%D73@H~Z z41xp)OiK^aKUiv41z5#29%Jm_)<DLj0J>yM>b{Lan-70eIrcX912lkw(Qmjpp8aU8 ztLx3LV~zi7Q@7Yy<`2uw_Ze<yOT&F-?6$#`WA7Vd>)4_D5n~T$J@a1!TYS9<G^Ovk zA7{A_#vU+soBOUY-gWG*u{InY`x{P^^g)w!A@?mn$0}6-TX=vFu;#=@0^5KL0ija5 z?pW3b5`@qAs#@L!d<MO-L)|pLku4Az<erh^$Cz7wNrAlSL!53GbL&a?AV6QrNimxx z+a@u=Iu<Ub4JHpwf#Jbenmyl^yaSdGp{HOc3l1299Bv9=mq-}loReWFRwPel=SA!p zLjyZ(CV1{ot?PE9ICLMd=iUArgSW*xv1J7tWtlb`k;TZ={uH)l5B8q&@OVRE_uvKE z@HMQL`+)nEAIN>n{p61Opzf|g=YeSSfym=X=xyxoA^?46M`=9#a6{P<XBwGY=JCky z(7Qg68@+<Y9LUsSWG|PXF;4+&@+jqy-id;bGEwuK)J;MBkg<Nb4g4(QJNO`0ltWVf zxtqTH^F^XfML=_B{|KhLL#VomR*>R^Lv`4_^)dhAupe3>ze_d;ng<j)#s8~8`~zTs zU=n2VMj@<V3{QdQG=wv3V>YbSnlMnzP;6CllhsI6Bq3y;`snr|T;Uf^ZGWiBJm+P3 zgCDX-oD!Y=k7GBo&gi}>YoFS7UA@Egz(l;~z7ZAXa8cs4Go++~hKJ+uunT8A+)i@a zOB6I?kJxnYm)tAjOC$%hIIdv7WRtc(?nWJ^PJa*&3eb+e^WnWO%OB<R2gRTi84ko` zCKp>lDY_R4oWS7yyDgYj(2~uH$nFkRjm`6r5(_jF)(1)HWTer0)FhE)>h;;>E3BxK zaR=XaJG%KOM)vh70D&346KB3*-%USc-*8>{{(LG43lFj7LQZ-pZoBGw$JOCOJ37q| z!IwyY3nU+3fdAZibT~$uuUJe6jV1-JHD=2ZRX?1YxwsJm+%{$mC!cASFsXxi+yQy2 z^H0w$=+VVBai!D2y>?Mhvtz8N>0Hz4c^$wp(%)F9FU{vO((RB{y@TLbt*ud&d2GZI z)mQX6f`ALF)P^8U9I77(4SxjgMp%-M2m(SN<Oo(liw7QqQx-<FRj=MVcdwCyRjnMV z=CC(#Jh(Rm>3XfzszJ&ga+iDVp}4|-M-Lcuun|9Jd&A=J@<D#ClrO;0JYRx8r>ktb zC&qh*@2?IkWz+8L_c2#9WDNx`5rk&tMo$cgg|k;4!EbTXBOB^4_6|(3!r=FHxT-p< zg&0{N6!TY|6Id_cDuGV*j<aB{N&FNBXNZ{`dY#rO)q$uN2?R8)0KO>7H0^;mJT@!C zCl1`?xp2q5iip~1^Wg$$VnM3T%epyS%}IyB`I0H9<xjf1XE4_HcGcbWye19V9$F;S zqIbB5tLJ{&QT&~PGy#T}ndUeHBx|KHhDg>p>LwIEj=q^WhQ3+n=J5B3k4;D=^ega) zV5iY>fZ+)!QYa)Yr=V$Ox0r6uf+G=T^zy9Lm8GsDUS&Of@VCi|WBgJ<SRmb^@CSWI zTG}VrAOm;wn2xnp0Q3{oCw~Fn#NWZ?QjKz>oZ_q^RmHW+%2+J{om?a(AXNmA%mwxX zCijqo2Sym~n0yQOXha`<lR8_hl7gjLoK@dspfWh0Ab%qG#lXP`Hqi)yCGeT36EtYh zo52!21?mF{z7b7=6DzdBM_(vmsejzx5s%%stRBlQSPNN^xDmzyFk9naRAt<XoRstU zfV?zc%tunGNIn~h<qEM_!TB17Q=)w?7Rl}s4XUFbVechNz`={WzFa0^Al?;q7xa6! znW?Z?B-dKvozhAPsYam|11+YY71ZGpjVBUmXEL)|GL(Y<M=BLcYO|RPQft#_1_#L? zUIg>TL66e4F^SGj!{#rXir|w9!*Xz%o&xu-<fUA$S+8ddBU7(8(YKC_ifj}pqJ%D0 zFw=OHJB+voK#?FM>_Nc~R!F<;gUUMrom~q_R|ZyBXVP<KwxU<EW;i_Xaf^%2pvTM( z^_yiOr;0TAA7*y`L#q0r`K%d<JPw#ngKnai1pMgBL@QU&Q#88voD(7lh(etCWfz5L zv|RF06-bjSHaen*?9xo`I1`>1cH!a%gX5R>_ALI-x~6H-9i5Id?M2Bloe$B?SOdT} zT}ec)Xdvq&VsLU!3_4;ODZ4U!AlqPixxDsBr4V?vfiWC2hl7hH%;a1O5%hzr<_Pq# zu+Tcca-`xfj->OW(zqIAylwI+*tfFUuG21aaJ4oeD${k^4`o8zDO1I(Y5noWIv6!a z>2Z_I4@|1N&~@CX*_}~;jY@d!p$fx@Js2fT8t={zxy3-up#N-!$yRK<mZneEXS}Me zI7W*xsb9|V*o)+cK%Pn*N|j*}E(#o6wYc2fhxJib!1y$Id^6vP={5wzTMv-Oj4p!u zIct|av$tpL?Ooa1W6wC^Ysc<F@9VUh8GLNi9K833i`p_rpONu`V}?N{8PW*ueGS~v zZCKy;fu_V92iyf8wBAPh5c3A~Iyv2!#16Jr5Whf<4BS#(fejYjOuAB(8G)nqHY}$J zHaJ^6=b5-ak<ZT*$~vEHrphEFN2Rh}o|?_)RRxZp%GBcG+S=mclmhqZ%gBB-c%`1q zb_^}wG4dMwT2$9^sd`rb9DaJBst5E%@pF2%p2}%@G_q2dnkuYB-u!dV#*#nxbII7V zk13u<AN44Y*?8zYv!EY&KU!$x76l?sYAPQyK7530HbIv)#4y5blg{va2m-Hj3*c1_ z{KPR(Spy1UuI8aLYy6HhKgOI8zZH8)<}LzUi06Q3A=jfLrd}sibxZ3Iw@@6WxtNs; z@3>rVwHWl199HaM>qd{-<089{IiUSxLXNk`@xtJ}uSKZp^*Z!+53~{4E^>byFz|3M z0$++aVP#LrQ*PazW>UtJZ6yA$WFzanoAoMFgWgny_0pf(-~Uv)XL8(!JYCnW{kD7# z&)Sd>YBptCwg61P)PReJz|X|JAmT|NOHu>GieOx~1-9JBZ|55_WZ+yehc6@|*C_8b znSYReg+L9352&rzzC05;71Xk!Q=wVRI*)94yq=6+Rb{`&km1H%t-_}pXZ^BT)iWNS z$MDFiqOx0WNlmBL=%xS?hbV#5fv7(*9jU0HGE5QjNqw#ukK$~?7oHAJC!$m8yo$I$ z0rt@OY&yHTip?#dWJ>ep>KQHMRX1|}T-{3nIJ|WfH&ky(%TOtm4FB3ntQMQ!!M%HO zIFQ!j*;*>7X2RacG7Kq-zWEIN+2=G>YsA7+X*C!tCiSEmNF}kP$qUrx6Dc#Qpk;`r zxI=n_GxNy<liXZDI3&2rg^cdYAR(G99+Q!m__@@vc5iJA5;ugfr8p9^W)t|#9&`=> zdvp^PlNe>b!@)%K^CGMb9)<ja(%^0&g-e+AUdfls3k&6PK44k0)HnIZ61&N$`*kpX z&?yP;Mi>t{sr?TVO_vZZ23V40+yNt7vc;k=PYqFX3jFL%Q7%O6q0OT46bZJ=TaP;H zygWIe;yBF$(^|_4I8A@0Z}N{Nc9WZZ9mOKS`s}!Izn7r;57zP%j1yc`%Z-|Tcs#js za*HR<78kK{{2WKd<R4l~Cs8Y}s>zedlvmLO#}O$a{wi1vZeyK<Jd6Bms>HiGy^%O+ zqPM|RH?cBc!z^a=gn8V>Z0?c~_|b*g(FZ!xbLlqhF;R~w{HmN<kVFKw!cI*<9AVu7 zNgzJ6v-m(E*(;ErIoaZaS8-2=x#<wXbez>T(KeM=y05MjzlpS=;$w;3h%y>8Qsw;# zd+Jeto|Y~k!tdKgtw=z|X$K4EainXc6tLxRwuqAp)P#;3!a0aMH4qMHIuQk6m&nzS zC<~$vIDdDf@B3;X<Spo8`@8{vG5lfojFTx#b)xP#duM!x?KJzr<|(rBw|6kir^n!g zp+k3#C^gs^By!N5XYhiAnMCk}#**?7l|eZzBYNQ`<c>r?A%g6TH;oW-#0OrFNjSMX zLL$CehDakcw1G6N5WbUBDe%RDW~fO1)qK{$7##<AviMt;ayjo?cIW304(8`~DRHWr zoJBr$d9&TF4rib}ir<<4T6&?r@~y(T?F;J0hI(Q9Tmk$H>VMrBl3dQl0HgIF(hk-5 z*l^jeGblL7An)<@!`eJDPCOYY4|hj>sPDT*jk`?@>x)Tu#iSm`C<u8FI-W*ke2`o? z+?_Lttfe9KaazzGHDLno8dH#Jl#)YK`<@FE);8o+wR*h<MwzyO!wsgxIhB_B=h-{@ zs5L$o-<pTZxonmq!q9f#vJmgt!8=ZVOaXhE(s}Sn<c<6R>0{FK(ofU8ftSRMi4GA! zL3p*2Pa|k_`+#C=kB*R&gqzcdDA~faMwBxx_Z5muN~=%k9Wpg>hzU5ERKc8qp}KnP z#!`ukI(7rU?OnKT8^|m)5mt_V$P=-M!~M}C!5lfS?+i;6d)YaAH3tLR%Q-ujipcYl z!?fVzAYr{?M3{!?ywG4MH3hn@8d9D}n;$v#!4IDL$R^)^@OL&@Z+Jv!f9HcAlq5yU zV$J*ohkFzUcnLFZ8=gs$t+UA>zc2iuNiP6OAAJfsn-Y*gUrIm?VIjp1M!=*UmD@g$ z;4(;amNSe`XL^~y%KRS0(DN&S-anc8y{Uia#DizU=<kDW!hl{8U-mJvPZ*F~<#PCc zKJ~7Sn1!8prBHauv2h-To@cLjew}cBOf<2O?@`}~>;bFX+ndiNOeb!bFSNSQRSi?C zamIbDb#^1sIy*mFXS(Q1d?DeVneGT%zD}=K`e^ct$<H|r`<7EhcnI*|eISXgJutqO z={$rIWL!0j=bbx;jj?$x$l!XCmwcxxil?38v7kJVKeB&6`1au2KmEmN^~-Ey(0kxB z>|LK3eC9KSH>uNXW?)jgJ(3C-uH*L+_*&e86$n5KbOQ(nu&tE2LJ>{oV9zmWT4EJ) zLC9dCVvBJ4APdO)36hM~p<7?Dq=t5p>p28MH-!CeNPU>yMaTv2Ii2aVrfI+>U`&If zM?3jiA^LTwA3D1J^=P4%??k)Mie1^?H>NWCyS`6bRBtcWdw!JHdj%fmB$b#@b7Uo= z0ds2KthHdp0$WG4V8Y$5JMFu=?$#_Mg14vEQb^Uueb-_r-yT#SU{6lE3AYSyxW0u5 zoRyN_y{GGY^nJIS!ii24<jP3JiGHBFdZHhC;tsT%<mElqN4x95wUiwc$~#+%KxyL% zGZDh2(2_$T1nl&E>n#uzxL9NVbSeQqcfg90mX*Jj70x+0OsYTQrPBmx<Wgnuciyl0 z{FR{cGf;|WGBZLjlquZ_g@AomzzRpjX>D#vyK-kJe5cR%hqBia@@j!wV~~}b67VV_ zjuK=hRSZ=)bJTyDH--yF{BZ$K5K<Gw5F}_I{xl-|dU`GwdV*PxBQBfnHfO&?p8K2J zg}<m9ky8Pr4po?eAOKib5bRS>a1!>9nbm)dN7hRwrZ9rg!DM1e!5f4XnW88Z1OOkQ zQ$3IV9`VVrwM$XuL8(z!3rP;?QpBI9-BilZ__nuXY^dBszuRLZOe$ZKl&C+0u$|f* zX*Oh1VW4HC`hZxcw+qDb3T;e$ce_;j&JRIo)KlXSuQ}=wk??|KMFVU2`LC~0Xhi+o z2OR5SWfL`7<2D6QG(nY8fvy(Wxp?{or0Lq0%Lo++Zo~;I3zS1%u$(2}@mw6g4A3*s zun;x#{?Jp*d@A&Q*pKvNa48+YAOb_Q0m<y1NN|Men`WPQa~(UHH{dJrf9TfJJ97go zk=J=dg+b>AcnFyXkSdi@ge6F5!o9Y7mQ{G#eA;|H)N7UnPb^D^0;p?QAH&I~OX8G8 zA7`!iF!zGcGD=V`fiVKS&G<4Uf@pSJ_zbhqAOvMcTTLA{$iN%ju1^01LoK0bLxsI| zA6t+FWFYT3i+P;!(X8EJ2tE(FJLR)jYb%wT(Z_(CxHnT@Xlc+JC6meTvdf?jSJ=Bp zx`R<^T$W+&9j>3Ap7E%AgFlZ(zcl#UmGj}S9-1TyI3mL!J9dm9`Xs|=iG*I}x<bAZ z+e*p<Ib%(;W12t}%<aia2M71RF9e7I=n;PJ{RjJ3az^gJcnMK<UJ+vTfwTvVL;*km zE8q>cKlsi|hx><YA2;Hk(){rL>&XNQRIY*hIQkFLM-o7?k_h5Yc@VJJ#d6=Ih>T<$ zYM;O@8qH?_!XF|uu;9@ei3|=S5yU&`vff$b^-OaUP+>!xM()b9CM|=59|kCZ&YqTy zZXG@tQV{T)%szzyEek542M=M0GWhmu1O}L^f*zxBcH*y4ra_wg)R{LGe}&c^{8uTq z%}s?}5n8gFinY>rX~k?@$LFM|Yim+XH69(rR%i2Qo};Kq1RA!ERC1z-s}DM#Nd4=p zIZ<bc7NIMT^yOXB-lQ6y5X(k!6jQDkJuLtZiee)2^W0PqXOoeL&VuzQQ}mz?WmGhp zu2*&aNNXlG9r9nq3CEO+2D}MxNI~f0*i;(9L7zu63AXk47(}o-DL18<Eee-p+p&5k zN*VfHt58@U{1Xbt^TPE)g|4w$-P$^X@Lst3wMjw*^sk^1EX-B1y1Gw#3>u_QNSrnk z(hp%+MQdJA2>dL<*n)P$Iam+UhSP3DvNaKonAmlI3X*t%C`Ab*ED!2Hfn!Kd&O;=k z|E~*}c=R6j)@hHd;lsn$@$hv;d}NrN<P#c#d%`$ho=0@xIMTJl@<hv)r?P`z*71QU z41K<D>1+%`cHM|@&>usd77S~0xypRi36!^d>J&oWu|#6#-zN%F1rI)pz!!)lI)%{0 zm2@Va0Bkk&4m`s3zWd2z@6_E_(C0)4_c7jG$T3f2tYO%K&<Kh~M6M<XF%e@2I-;Y5 zK|i)R_g=tF{k?OWG2@PVnrrz&A-~qV=MJMc-kkO6`Wa$HHmfu1y6J~!PQ~M?RBBbf zsgLyo>LlhM&4Uc6mlmjAnuBFv2S_D2%?shimd68Zi@g_Die&v&f=6=OL$C@8)HvmP z+h*myu5bC`38Jz<e1PQ2J%*vM@cpolaJ=tvQtA4Pf6?%nAW;6M69}e#TuZ2%gSXbc z_&L-3+_wTj10gm7EWq9Zf9zo3b*~EqyAECPW2k2Y-Zs$YYAJ0?Zl~Jil2(KDo1YBY zS6I31smn9po$(-b+Th<V1^y<GDHcnmVll;f<$;M&?UldqmN$oE$SaND(!$5A$DHTZ zsP(0$;(;Kr=BXiOFj-9R$S`$tWpCbLQkk7C;~jXDT=!he_|Qgt0_neb)=-JEB^p-+ z74N*${I8xk|9Jn4zMjm{Wx6ewgjXBZBJ5Jx0Csi-jKCgznLkVsp1>Q{fOWYlK8?Ae z!MKQ%4QnkQS5%9<7!*Ac>{FTpjnyV3WH=Ih)GB5c7%dUif3ED~&&Y~rU|Hko6lxHt zDT9@a+z7~9Ch*h_BvKG}ax*Lbyl$}?Tt5Zag^K&90z3Ys$HN=pPx^P1X&&M;7CE&Z ztQJ$rDUWCHYd9a6a-XO6dOXZutOQ%mlcocvFD0Jzk&+xQ+@D1pWpz6HCKlsmq&k_( zmSpzCk++DaUA(SZ&ck}{m!P`N`HLx^tG2CBwJ4tR&SWi@z#C_mONBywY0G_(#H4Vq zU5XJRRVY8RhYK1gU3X^7+xCIj-|`48E<hj>04VI&Zof_Mbt7S`bh`BBpCp1D%OV^c zd}s3c|7X)uE@`)D=XF!L*Hy;*9bL#buwth$OYW5}OYf52Lzx^>u!)7wb{o7V5tKIJ z#=&;$1dZ1k?m#x4>wnd19!p4*8EqTJz?4g)*4F-VC%hB>NhHfHlWCe0Ae4;N%tAIB z#V4CBj7q&&Va<K>N~M~P^>GvOS7_pPyEOPD<f*Oi;#;1>D|Xng(Dr9$W|q^{+NuMj zS8LVu@?hcvI<>jg+_LL_c$d`XYNNW0N^Ff@L+_iV<^V?Pz{wrJ857aW$<lwuFI2*Q zSVQk1R{$af*lKye!EN}ylR^yvkA(@D(8H1;rLSWK-slDWZkZNHc<&nn=H2tK&dZnq z{9#|8zZ>W6%Y4VW1V#3c<u>?~VLTO#=rASWpIaZ!E$0?<yTQmMUB46w?&4rM_wcQ- zfZGSW1jNJ~8NqUri`^wX&GGpW$r!1&8PavZwBD8&A;g5Qh#*1R-W4x`AD}hf(u^0a z^wi?s884he<ZWLWmaeY+8#6&=HHEm<VVDwl172*y>0~k4R03Py-V0ixXh%mLFEaKG zWh;vhvi^gM6%?0o$_(nAXvhlgv3<99hU#BbD{A6VSPPWP*gTrR;i6x!=XBGe`_W7@ z8Zzyt%uhdfVNVa#>j8c5!h_TE_Pfkb)WnTc0}I0BI{HQMUxefGko&$BtM^#zwVUmU zQHtnM>FUikdtx%_-fM2A-A)tq#SG#hpOe663hE6WV<0aGIHYZS0*a%?<IZT~WIY)V zAfT`a>u2UjcTzpGQAe<e4GQP#pQ}?GBP^#L+n>by<}P0d<G*X)&uTgQ8JUzyp^O@} zT+bZw*rSr!!QXJKoHpEgqc$8L8kj<**sfS7wxd6)!>IHpT6mj`FX~~$k2tY0dy{%W z*CJ=h`lB8}C<|v@I&C^ja>Z9YGA;)3#AZz%9xzwBeqwtj4o-i>Iy$lpF~=}sC%5GI z@zDeWd150bj*ZPtp4f_sqk_geu)rCMyKhwg6V?cYnc}8GTmmn`(w*3v<A%hbpnbGC zu}KpLX3zO4hyUYa^IF>GEFO^dz!e--v|mNrwvLA7n4kZ_Tlv&jU=KUQ2VjK{mUiC+ z-TZI3Y_J5+yz_wV<PS?~ZvZ_`+;S~_i5n(x^G8@{5J%f0ItdCOlC_XCBP1^5z|vyh zI3L+Q`{?%4V)*>|@Z!?;qi44x1Mksue*p6@{P*cPztQBsp&KWhGIhO2)StbR1g@5V zlgOfFo8pK-%Lt2ds+M0Nt5gkHp+Ixgz<#yL4I;fV9<<92=jxDosQhGgem{8OmbYD4 zUk6XDzZCzt671x156hfb=-#WJ?($SHWFm1?yWj8Z?8xBZ*4HoW>mO1K_7(HD@7VY_ zYnV5o<rizLFH68fe%Q+(i9|}#O6^)n<F?VDmdenbVt~+2j1|TLata1v#We}JhibdY z)b7^HYt1<~wZSMtVgGxn<if+*>?4;S-57H-#a!V13AuI;@0>wI4$Op9LTe|$U>~)0 z*z%B#Gi0DV{NlC;e61)^yojbmui6VlJbBot@U4Z_NisxyJ6x7X@<awZKv8c!{J^~w zc+%b>K%@y(D9E@2*zyAAxa*e1c!O56>jp)0rsh<nw#`zlT1#utIYj0rdz)GdTv;1F zro2);V*jZcR?dL)L$_4a@jt4_d~&KX^>MxHPyXUB4*vL$VwLG^CHd7POQzocW?%Bx zQ}25&B@h0)jPA1M-+7FY2a#2FDa*H3VhKv*CZsjmDAfEMW$z}jnP50+)M)mlH3s&$ z?KzU~LOUYjkywAA%e6vbs$8BbMOBrYS5!56Um3|IH4i2ObaCM_x7A_oLUA_t4!20d zbPG~Ude(>NL50E`e+)MF<xUmSsbDxvsy(>`mJt)%?;rdw62)i?d1OXmsZ95ihjK>h zhYaL0W$;$KCphQimRxNyt=Wd49%;Xo3=}1k8`*U~{n9*4eRk&=_tO}YyzoY_@l#+8 z2mgitVE%pXr`U8I(XTORP*J~14MzA7zHmUcTD&QPPC59WVLsJ;tI}v(j6^>;qIE{4 zF^$LIn^%o~_qJt3asK6rG|qTrEk4I(r;f`Mt!KQJ8lNX{kD-Y)?l$AjI6hv@{G>Ny z{)6oqRd4XkQ4>Zb^Lm=asT;D3-+av`8B5+o6(^cT-muEY*+Gu@ml$kU$Zo|w{_B({ z3+fvD6NOK>jW8gsQQD?>ph=?Z=_=$we23-hFSGykb2KGP$hM{{i$R&oSRFoI$X`9v zc{u!)%J32oN3xJ%A&b~Ngs&{>^J&>BcFRAaS+Z2E78lBMY-Z-vDMaBH*+#1K6=aQI z#TjVs2mMUCf<$gp-V}VA*&<0)Ay`es!EcicoW>?3GF3zPh}_t~YLrrle87<R2f1=B z3%Is}Et9&C@pegZ*ww#0_;R<~H?BNquMyI7m82)6Uj>9EcX;%S=!FJpwdA2z3z2Xs zyMeeyd!YzNAQZP3M0?BwqODEve>nOG0-NrK`~a>LdsnVBkYVyVO;|W$T)9zj8kV$O zC_Ex)joX1D@k7v{83zZ(?E%tbxK(HV!0pEW{o3N$Jo8$$ZbIkQ!MNwKHXf8dFa1ZX zk7Gqx5b1KuE$-M(aiJ*IokDA76Q0aYa3DIyTp*PP?1UgsCH*L;BWdx_Rrj7#l@yq$ z;SPy2c1W&75WY_Q)%cG_M-<%XNCX`iY3U;vH!3|ZJPk&k2QMWPvpye1C31z=iAP!E z%3BkEk#ohznGj!RV&o$)(j}v}0)KI%xo8JXN_pfI!Y8?BA~Pm|^VbO%2ixD_b&K$l zK<+byIC6#Pi759O2e+0Nel^0z!Xe${<U@meUhhA>$-75kn8w~E=vo1*D4q}Up)n3a zpc5HEDo5!^L=@%~44r7ufvv%Iw3z<CmjF&dzX9m#!=P<M{t(?lUT?i$icU{e)INc= zt5-p{h+xBXnQr4AZX<j^lHgl_&p3BOs<(<JP%EzxrxDu6`?`!IB(P^or{@M=MXmmG zG(wIlbx<Sb#HltW8+qMwrIJHUzljujv-A^qBTaHd9TSL*Xa%Z2Wmr481>A0FqMXVl z4LPO>hm)$qDTt$0|LM_s8kPE!=m@I!ov*sqlep_2r1}%t>YHrNalG_sPK5-|#%Rt8 zOzhJrw0)}rgEm2S;-D;0@-?YDz+9Ge8hg_mVP^fg!Iy!UyZp52tR36{f8(d6Uju&T zi(?h~DbA(SDxvJsO{|!k0Ix7pu>+7bM2cPdmHjZ((*d+L5YK8WY;q_w=P8_G0>B*y zzv9RR`0q>3m6q~aTA#nPbyjAT%7t{+>m3CfJ2`w@N}WQ&0ZKufNleX_w-?#d))3tb z2g;A}M8nr%?1}I=b2JhiYZG({Y=`BIjfXF`T1meXz0BDk8^z2E=fPP@+Z;F(WA!IH zpBN&04u!wa88lyeJTyMXFwuM9K6$KucwCfP3I!cN-1cTmXVNuEC#xSO^?J|{o1H<2 zbzv!H+k*^$I}PXyI(YPZAZ1J(%p}-$(BMOIa^wugaqJ%3$aeJB9%(cU%2H^MS`bEd zH$E|}B~NilF(&9Y9s0d<&~qOU`!3<bINd9uFQB1lb9WjT{@bD`NCActsagv>XGVc~ zeTGTKfw`~mn=r#afXMK`*r13UCKn!J2W!y%Tu$A)WLcN?R2<+vqR%b7CxCUWq0h)3 ziI5Q%1iFJdpL<7kEC{GNY`(J2Bt+|wXfYf3T$9!-^RSx48mDm(dPp75%R|R-D{{%- z58IKaB)ltiEY&3#6k21>;%;&y5g0(0YZxv;MPmgMTMN4pg#VyA;u0t@BF_oK!n}ky z8%z{(@@!t6q&Yklu2t8z7wWQHU)Wx&*1~6v%Le|>e#&j`%yQ2R`p+28_xt;fcaRE0 z4w0!>HTr#Kj1+{UlHMp589kU@z>39&is<kiw*hpQ<TLv)VjPOqER&1b_PAlLPtw5a zJjur*0bM^??GJqrd=x}LZfib@BOoKnkyslLoUuzV`TOqW)Kr?jvU)i^m7?$9M`*p6 z%raqX&t5vn<?#Q`-B>-g8>>a@yb!I$-iKvmS(pkouSIh%4y+41RSG}IvkpRfy~W^4 zC$yJh5Av5nq+#3O_fVk)PjI8rZn6DN4?K8>q?w(;6|-&{_%@^Zz|^Bn*6Zjd5|SW= z6@98KNRqQ4tM(i`K=UyHJC1408aU~dGd#a5B9ma6mwepZ8m7~=44z{!6|9~K`w`ad zGTnk<3$V;J3F%DxnDZ9ROsmuBNaESwfuGAun5ERe-~nqe<<MXyV()h-&JJ3cX#G}j zJNQg!JM_#GJATu*<2&zr17`dOimBOwg$=Xj!+2#etTU_VM+s6?OUF9|?LvJxjp$nI z1ce0b!K|gpEf{aXiW4A8xTiNa>LDRB*zqGNDL9zWp*~+g>eM?Z9xl=pSE|!9%sqFn zKr%$)Fn5*;5O0~e&#Ftav&!uxuR%=KrS<h@vs7Z}4VQub{*ay=^9%G{8`yS9r(vJp zhK(&WREY9K^>56`V34o^HSP@GhC@6$vn=9w!)b=v3ua1#0Rmkh<C$6u5xPkH0HJ}N zGhTmo+XoA+xyW++^j>>wqjmP|`Gxz=v3Oq1F67n4UEj*eZAR{WfV%IL)zZq~dmns6 zXIDtlOkdWOx6VAOuw5d7_vrJ8`VRJpUR^~_%(s%T!MIYdd#VfXjCA%K4?;25U*>U( zGth-2f4h+62#()@LZlybyL&U%WwocFqkebm;-#%ES>D>ZMEkG6>!wH{0gEW?CK9_> zFSgzd&GyqZ=G;R2N9i`hxkt<urw+n8{Fr+9g!&=Vw)gPqB6UROnCc9^#q+@cs7$U$ zz|7_F-|6y%!6xMX_~+}xYs*?x`OoA5)`wDq<yoe!@$B7grB*7#9!*GhY49@*{B5%1 zH@LPb(;deZxR{-8@x0o9UuH9KqyKg8m050XZnQSN{6E^-47E0ct<3=cS6Z8X{_ksT z;@`u!xDy5Z<B}*3&)}rHEc4s2#iD>lrqSA@vi*-Er|3S7lMVjI3v`Q&L+3z%ini8n zDaUd*hl`!1dpdV-=2$vaI=9HKSo(^#v`tf<RjXS${xQUEt6GIOT46=MI>J|@66-yx zUE0pR?cC|b*6CVxD*h;*RN*E&+ozU7h?zV2V@y6hI!gk+lRw8kLJlpR+BPbvvSm#| z<wIBtxDUxr6TWRG)^P@LohejH6}El=OBBilws{np7%&yyZh$l}Y4F1@pw%Q51$?m; zQd@wwYL%IFX8s_V`=ZxlTBg_Y#a!~Byj3KbmW~evQ7-=7!%xpLKYPQ|5Bu5dZ<}WO zp7hGRH`UAed=EeD^W}Oe@BB*op29*ppUW;SWpnxTV*YgYXK&riW&g#`!h3Y{*8P5; z<01edi&?-JoYsYZYbn8#h<lKgJVB_Nf!IYhsy?(xgvOk&NmuB@x3Yw15H5qo4$w2j z@r0uWk5<_x$h*b5@z4kE16tJY`#>lTMD?RjJn^Htj^{-_Yj!&3XCo%Wrt~}>UtmZ> zyW^IVMvCgkoj<M%S5B098Lsr$(wEGfNG&N5oo@De&lvQv4C9LPzY8y5{F9?7F^Se8 zhgNjg9&ONS-EDtNaVia9ogE1pYjB;=u|OLK$^>{4;0Tl=Oi$abQi6OLp%;aFO@cZA znbMd-gY35>LL#1}8`;WI?(*fFmCISs)7eFH&~FAKIlW^t-7fS^PM%w|HOE}%*q(Xm zl4(FhPP^}28vOB6K+j!bW!lwEqVqY&VD{WN7X7RYX?uzlP)6*tRUX+AIF*7=QaDjy z9_T=!SjPzRnSq`sREmBk&;UzKU|onFh1$9dm|R6W(L7vapfPpx$&B`fH!SXFGLJq~ z)(2N)X#kRl=uX4nL@g(6?K5LUDyXM@T`&JgCVlU{MkkrP=OIiunsQzK!+rjcef}iz zj6FB~f#!jFB$++YKvBr-i(Dsl0d}izLT=Kh;TQc;={f1s($8T|@#;HH%Olq(isp%_ zEL@-{gDz0b(B~N>zjGiW3D{oJW#L94jznNY`wGL%ErEx+*$zA;QbKqrKLhxQe|?{` zP66RKb5&fUyIju9dnA7o{>m=5WtTHE4~KWtgD`rU%3Z7BUELj>8<lS0mrdj^rNW{y zztPYEo**uf#ePddJdqvNARBKU=LX>mh~i+NJ9rG^ZOqRGpKF|;U4h*reJMUKBTkev zqu@s|g}M1-95Wfy)24dcKmXhXUp-k$8VbmefPv9j@LhOrb{-mA2r;vBpI?XuwRuDm zGQt6EHK*oQwP3`+aU~awE_{A23t1;L#q+agpM69Lw5kA?%SvdYxTEVk#f^}%j1$#X zKzZa@<fYFS7Au8<Ut5f-3-v@P*^0*Nt5sN#2Mo}N^?0<EEG6m-YIITa7YdcdLSAMw z&Kjk@xF5RjFG#;A{d4J;NpDo)rtjn3LR$G2v8=#4KTuadrLfj)tToD7n~Y0%zd4o% zfN%oN@ve7!{0dtl*H-lRHh?2IU%sggOHA7G%_`H1E`uAwXHUJ5%yk<<Z)_$o9nd{; zWEnlY9FaXbj%Q-tV53{4Af5;=rcb^9Ddv&C42uOAGz>pDy#53M?mgQ4fp*rboZ61X zVy4Htps(uqKdo!iF+J|dEh?dfwOBm12{OB?>2ra=oUT;?xi)cfZ6TyA=Db<0SfK&V zKe5l4{5J8@32z)$!E}gSykFo%T{c+<egHy-NGaWmtkix1RP6F{t*X87{oV^KR?Xs5 z{qA>%@Yn*p8bxn0NJGss<ev+?ny{xd4B)9_xqyLhxEw-(D**UN@HQUA1*ky<bMZ{_ zUEybUjXGph^y%`gKKtv_)4x8u$=<zrb!W$zy_fY4_RX)re|H!8I(oRL<NS9GR$g8n z{IS6*kDK+6I=ng6F~aqrZcG+rU|}&=kj>I?$Eo=K6(;?{g|5|uz^vyEbpiiR>o1?8 zFjc_7(zQPVto|i%+YR(sZMaUsq6xB}n|Gx&U>3o?5}JXghiE9UM_)>$&y?mEn=75s zmmnZSLd&kUl>3#hA9J3)7!S{#*}VPs%`<Zw`K6`SO070^kXgxg2Ybg|!59hoGvx-M zcq}wFWDSL7h+4p*A1fe}z{(-dNSH(^S{d1gNZmoTUSSMo>2O-jG-Ne6JzY9odZ(hC zR$~9yfZ#y}z46Hl=caBc+|^oO_syLyscK+x@Qv_(_$Mx~AIHoOL_R#7%4BL~SgQ`c zXPW;;z4xxvi(k0((MV`&y7cpdj}r6G7&O$9?e9zeS~I}wZBV7Vpj$)~P4}27S}TrP z0mi~#1~sLyZUCyF-zfJX5aUSbrPVU+v1t4rt);Xxa1tdCa<aI$`10hIN2-2TINYlL zOEVN%v`p4pjD*a8SqC|L-7SOv*NwFw(X`JYh&lqLVyc3xoSL4dENZm<>%{W3@A7^! zu_c@4<tMfh$^FZh5w@PadF-y~<-}jR$(+Go>$~;(u3lf-H_iQh5;aObSO4UtD&iY- zFpd}?Of+Bz%qr5f4i8}O2GC#=H9ib7ObtO{^66-oxcQ-d4#9>fFe6Ama;v6^P%e#| zq#ur1j6LtREg$TjoMFJ7i@?O3!T0+;w C$9+(DziQ+7lma9{dptsE2eACnMYjBi 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�lUz-dVvwjfcH`qwU3aNmb9w^=mFq|oLi*s zTV2dx<KV3WyEn?=+Co%21}LF>{r27~VxBoL&-@ODiuleZxq4L?a<QLbIYe6{5l!dC zP3F+w-5T^AHh##Dh#~4v*!~$3YS+<GvRgRa!@~<~7k9tk2C5)!fTP0@hpi9(`V8`+ z57VG&gV*5FMqZAquUm2j@|75^cf)UG^F@Up!BJ+Nk3f5&G}Af0A|C{bT|@LXqzoBY z0ewX(5%d}|*_8+<01MRHps8YZ^t7v;`z8XOK!GX2t1ZJg`^unvc5Yr`GmT*9rbQ5t zGDYhI)}!&P6nJ<})i9;z=gw};Hm-CABhOgEnead4ykQ75Z|J2YvUId6)EtWRlgU(b zWQ{wLsW5+`aW!Dk<7+jUs2}?pk&Q{d_zZAa-d}VV)l@F$FSzxTir*I0)U9B?UMnEG z&8!|Qfah1$@@OqnDwq5|=z#h}j3)U4B?)jrK2VrO>NC2)wzdp6vKDG#s;QDo$1mdK zhQAqTsLG{MM!+j@Gr>#-6u*Nv2i+d3LwKY#@uBE(O6`IA5Y`4oPM0jLiIfy&nZ;S- z>ya9u$$+o~R|T&WopHP+RHg>J`hmn~L-0J}G+jR!?e7BFS$lQXA984h#kmc*50s5} zGmh;Lw2-|GJxPi(h=3&l3sa-?F)H2*-f#F_V8G<iAN?+};`z3!^?LDFzxb<pk0-X} zM;5)x;1{p$UfX4F;HZBq=JDkJ`4@h*Sg%*Ne8KrtWpF@89d_JA`7gwLLIN?$GAPQ_ zfpJ32D!xrrRwut8^ykn$h;JgPg@G@SyZA$HgYjp$Dl+Gr+_R?(qK__h5Jk{2l*igY zu{2W@NjYvqTs&Sp*D0C-?8ut|v5hCiK$je9N=LNA))?%V3O0~O2X3aJYJg5hN2685 znvUC~1RBAh1~1g$L=Z89Vk|hU`FS)i`eT>^m2q~7;D>ks`)?HSs&o>Zn+#p3-Yu1y z{TDP3oCrXK=Q!=_1ASy$u%AYndn5y;2qCmb=mc>UFrkkm%s3_1bz-r}c;O{%bt%C~ zS2Et}o2+Xhh^c>YFhCeg-!ywYeh(cq=>Yc#!jlD7AmaTHhm1?{E7RcHN{;lqhB+`y zqemS)C=@QP$4;G!ZCpab4Z}34%r!H<@2<N%%?ndg7n+`7ZW@Sh6dOfVIaY+9!C10r z;t5TdKaS{bWv*9|i||k;R-Ei)&@kXf0(le&^jQ?yB&VprGlTB4|Hv-=q~Up-#JK5! zfD!aT0>-DIbdmi;F-CZ`%VR^J9VDndq_f?F_i_TDp$CHo<wL~Kj6xmIWe&X75a$rS zC(9)Fc>z~S=!GxHTTC!_oQ6YgvRpoRpebBGkT|IVj;T&8?Re8PNnc4On^GndR%;Z) zNeIFm^t}y)<}~`&vTKq*Sc(iZQIr;j1y?OAgjvj0lDZJABYyaL1Hu+x8Ey^d8i(aP z-ryu;_-A0z{s<`O9p55(tm+uDQXHv6hHO`h<EmsZ5jA=72TMs!DGXZ2&ry%v=MH^g zAMCDuqc@U(v3JnB?IF{C<n~=@*l%ZF*AHEP+arg-%E58$u+Ph|uu|;VY0Ca_=RSwA z1;##FNLV!K>pt4WMDvbx`W?E@n_tbZUfWsSSzX0S{yMD<cI|I*VBffX|L6wH0`xu9 zpZ30?`NHkW{Jj?-kw4&g3U3ULDahp8(74eOjv~SyJJb&XgL2~r7pah+M{OgQ7%9$d zj_^p@15_}!u@j*e2pDtEVNPKFD<O|Rsz?1Y)>459PF-o9)YNb$Q=+LuIN+B&sZv~z zmr|ZwPF6>&AFx~DS<k-J^{YXrGY}3VF=tTqn>0g3?F`iUj?(OfZ;qy$FCM+8cv8r2 zowu)#aLYFEWfu67YHTg=OmoBhn-+Ny!s8MbLE%;~1Q5OgAlYW5r#Xy_xNJ5|QOJIY z5Jf(v<Z=_y31sU=0`c-fUaO`xHu%J<v1*vKcpcx>Nxpffq=gUA>qiQ3+QQAU*}xop z)RAK@TO0fV$Qu9C@0h!A3?G#HVVk(PJI@Hz_ZXYUTgz~)IJyG>bLf=z9cIInOk|bF ztUT4TZ~VZNZR_@vpm8P`mMkhQg@b2~Z6Dn;niHTrpo<wq7Muf@1BW0nt{m*u;W{tc z&exksT8AR)=-9To+|3u261$HTG@ozo^5y3)Zf(^cN){`v*7icZo>iGURjJH?DG$cg z!RKyIYM3MJlOJp@GXu%?HfAz`1&pwPTpDZPU^xL#{75?F`ODi9Ae!?+59h%9jcMe! z7*)gugA_v4<%H3qmqR*vhw(!`)OSD?buvm>pH;Ck+;OzM7H<9)?S*H|k$HC~DARyr zcdpUm4MMjDt=%4`^xp9AR&6^$65gF>2+@otN({G2O+)-K6bSHU=Pnvx4okP%d5136 zb{abk6uZH)r@&RP!57RiUjG)aVqG%6K!L5_#z!r|rxyMncYZ6t#PN3lLv?&-8&cfS zmrmZ{1-;{j^>4X)hxZ%58{$?(&!B$LXiXc^{VwJLNi+-4_^iQ)_;K*splLwimJc8_ z%P={D%Ei|>PH!$c3E$I{CtSXy#yRmPsCx%Uo-(b5it$vA&@-~0)p-)v-|_*eFCg|P zpGf$iV21xmQhAzi{OcoZfAvn-eivz4?~NA1L_turA^235r*s{>iQa`PULd6wpjw2B zOmOh`?*REr90sUwO2GU>y#>IOUbsmM!fIB2UFr$vosnN-tv)HA6qH^r6lW%Kxlk-g zUEqmErj5=Wke<#aCfb~qPm`5Cp3r%5n3&@7&Ps#c?a`f(!zj;L5uCJ%w-9D8&caZb z6#XypI5CmP45~EFGecM)S&`8GP;wMp54b%tdeGkC31c83ct}EpQqr6090l>XCi8i3 zGV1Zv^-?OMucFY);1?-;BoQsl(f9`ZNOhJeBvT%joARpfRAxF1R>5Ho;%xG84&vqI zi3!<9p;XZ*IHD<UB&y^>tX5t91iWTEMY!-`bX_V{rinpTp~UMu2X`XyVxH3&=fTfh z;(iU#U%=Lm@fAHH;G1M7Xs8b7CU%RC5S_#c;ILl_D#!!_?<n3&mg)I0^N5bTRr=x_ ze9eP;`dIejvorKQZkH#OEMzc6`~hwrOQqWr(F70h$4h@Z>5ao-bt3LMn%lUu!!zCI z(36p{>Y`zCyL_zbfpgNq9nu~T=_>VQ8JL7>g@aq-(sWY=h7d*x=x0a=39DV5o3)_5 zL$(O6s^0{%<jPRF4Gn9(P2)go3-IHz*6Rj?nGvo$WNZusJP&-`2>W*sW-#a>%6Av8 zTnxGdvxm<YL!m;-lg)b6;?twG&`aaJtQYb6=I4FhNFo?;-52OgudvQuW9NH3{(yq| zbc7;|_hz%ML_QqOCy;t^yf$99bR7=7cN$uA_yPk|hNfj}^3cqnnHE1LNkY9|69)ls z+zx8_B3i#>N4#N|TlVZ`G=mOLp*9xfE2jLz%dM3uZjT%~O$lkqZqXyUE${-371f!) z3wVKdF~FXzKX$-}(NTtIEeHX}7Vxcue+1reSdoi6iwmQ0s>vMBt1q8F|FZi0^Pz?w zOOhg=l={h7aWV9KDi9!iM+iEAP~XPnB%-yoNw7(yHTDDiV!Fv0b;d*2(mgyg>Y4Mu z-kcug=5|guuWRbm^!)tvl&X!_taqdFpn9Tb?C(ZeZUQkH1_=KIl)}<au7enf7C2kj zxXE|a{=$R`Y%ex^!Tor=T&~s1qIBDE?a%6&H0Dh@66OA>khk($8i7x?*P_0`Eq=XT zDp6^^QmH;(JH;~TIuL;0O`;mz0v_rZtT8QWb4wpL&cnn+1A?~l5<Rq@LPD%IU%??7 zA%Z|c;Izav*>LhbVq4H}fwgt1h(F{;hY~*T2?SHla0GE%sNyHFXef`=*s7%BPm=O! z6tWr|?A^GrM{Qi!m11#nvRG7fo)ZW7KcAnSotv-1Sw{)SqVagv6~mu%+KIoCuB2VA z>U?dY3P&tfBq?{`*rPX<W-ADpLW!};tVDO-1DvvvT?&~>Vcn;6qNoZ`Z<nCeqnQp% zdk^+@XdSzxG~~QJn$U-2`Vi<HMH%yqYAeEefcKzGB1s_T6hb2S7VPfrmD_FCYZ1<$ z`kMd^>Tgc_#VR`W$R6YDM!Qn0O{~nFI;j*(nY428-ZHIko!&mT+B&|~K7W>1&>eYw z=$7M#ZaHp@_COV=M8g^2;|CQjCx@N7Ga#38!L6v8le3|4DH2rWQZ{sSdo`IU=OW0l zp&RE)+xUlvjcGl`ddkRg#M)u$MhHh(a?-crfkDu?8^%xxFQRNA?)Prb+VnIDOzm4Y zHACCe@VTL(NVbNo4Y%iN;kE&7W1}&~V+PttRRn(oc3>1fcSA>vRE9;i#zYP{BH?Rr zK~(KK7TefFxCZjR!*OKD&EZ6vJ!0A{HY&?NZe=d>@`;2!wMF}$Wv&};2xSmGhOQ>> zRfDYH2%2N@IEyREL?Vg8;c*mP5UYuV2ie%*2|zId#l^*<_$_Ej#Hr9<EU6WaZN-s5 zjm48{!8(7j*lXOp*?7+71{;k?7a#JUAr2-KwpPPox9d3*Ids43!k^-FD&p5*K|h!z zc-{FatmM|~hIO`6p}yw464#fLNBj&~hw-Ynqjcn`CaHDdBn5vdYvr~y?xA28dNF)| z%+iDJSu3|Ea*jY3+Hiao%bjGDESb}|ub{oZ1&h%faqt)(w3chV3F+}cc5|mD;k0kj zFrGD`RX?V-bP%nzoP{`z)ginbtNm-*6_huxtgm^$%e%gI<;wcH*YvKfUqPK)tKRQ; z?U2^i!uLeO60kEt|H2^*o=wDj&j5pg{YJDtGXDq<7~$&x(=yYI&6(+d6V|J)4g@hh zvk7kuhha<_4SX?EDzwkwXH^C?k6`=ee>9=Sa&HVeU>;4%<Tg4>82r&Q@Y`#19q$p! z$>S}W$z#?MfQUeolH<?Ze*kTbw6^|WdwwDJ-V+xG{R*m&MWeBNzA|33^ExB1HP*j) z;=Q?r`SyeBYjA~L_yhN!^^tCt@?{lJifXiWsPoMcG9&s)cJLnfoelISr=K)eMIDu) zFhdh~363XR#3NT4u>&(&s3?(weTGT8QJ<tTq4%Y=;?&f_`8KgLzOAiCOT~e15WkFw z82DXh!J~&FT&(#L`|)UViTk>FieRkkCIY<O53g^ac*;k33_j7pNJR4xi|=w7G~Wb| z=0NQiFYI44f{!7Ube;HNzQU!oW2_262hxTsjRt+Mp$srw+IDsZZ^8v)Ny}Ie482<> zlP5Wib;YU3*E~#>qwTh*rX#Wi@QFm(Ph!{5zC`%e!|V0bfOoGDd~$y~ClTjL5+9!R z8+j|?5YOOz8wJdQTGjwa=yde5oR^Rv4rfC}!u_NWn<XO7kQ$HyT=565TUb4-ZoTNO z>mcxY_l8{~jXbD^XWHivfv}xM+P8)d0@>@qKB?n}9dM=qyQ=^CGc}qF9lM&mqnm+$ z4l+2?0#yunS9knAqm2|85`1p^63x3HBp8xjRygMJpi5<lE)wJtRd}-U+%pT#q?NY> zT>v!}IkuYiW(MNBVgJUAa!>1C|D6BcR%gyT=arjYw^DT)xrC8e-SHhxYS#&zQfBj? zDCDBq!Y2wJP@`%h?)1d&IWNn2)tyz$>wi@(ycQk72<LZ7u=g#Z#T-%zy#XaaB+auS zO@<YNpt;!!p!yq+02k6#y>D6yVv~xuFtFqUkm6Nxg3$JKX6l23U(V;xEr&NZ!^`LJ zu%Sv?LqcjD@r&elp$!}i=Uq1p@50$~`RoEhNAN*kc6nb?<*N!jiYWf@F0|4P3vM!; zSIJYa1W<sM_{cVVi=fZ6U!kG`PP1$8W!48PcmSBu4FgedIxNYft*&nBJ>7mb243$S z?sV8v4FD8A<Zd@yg#dUcH^X()bPRDb?{l&l52NJ}j7aEYXvIL^ql_osgSuQq1`#d+ z5J5+TIt@v=eS<PQiC|a1j@o?Y#mVOH8!VC3{e(jF6|XPgm$cpMllb6iz%kJX9YN%0 zI$eRA!t0YpC7t#vaZ&>S0b&>iUF|jcaNKdg@!f>OaD11A@gOm9D5YizUWGz|0k-H} z{Da8Y&!86?9lgVa1Z~XNSzCt)YOtB<^E(eeymNkf1{>w_`q~b)&#(kJjv#x6$SWdp zeDItw91oe|0uuuy?jY_)+v4_p>H*rc<VsrS_otO%$`GEigtmDi8A4m4KhTR5&sXB} z1T%x)kNSZUT_Aew@D7<WU(gwx2;hw8`MA)teC-v}zQI;rNTA`%5t6|ZFR-&p%t_}_ zTb(iG(MS77cl^fB6(%f!eWLJlLT(Y`6+)Cq1-2$+xB>P7zrx`Pr2f|W5Zhk&hKpWd z1tFwRsnDR%n36~IP`%Q05Dq_}UU}=Ft4tv8fi7n!$P>m|x9uGq^i3U(A&A*F$TCUx zeq?@yqa06`M7J_9PuyB18m(w<9e?BX(OQo(M6(E{7cb{RH)`mZSC~n{4nz21oKF(b z8bb{$y$E+z5brOlA0a2bkT76CKrJ|_wZSUZjym6#`d;ro#bLB+m8EK-pddvaWXrv5 zWofDMZuSO{+jR(@9S9jDZ}hG0*R-n|KA&UzJQ4$QGaf6txEKmIy&}7BD0D#b016n= zW@>u|Q6`{(Ai|c3jMxRC?h-l#H|Z3h7!;~<4st_W!AA(!4XtKJUb#~GrEqw*THyMV zt!l1B!F|zid8%2j#~CsLmnIvvuo5X2QGz`R7K-LXIIP9>(xg`&{PC^2VbC8)iOM3K zDa}QcNG1@8vutK|yMPq=n$J^$5*CW5Xq2X_p3R^}MS{J3yiY_QxZl1B9J7x;_>ki# zfn)e<5#VuS4wywsuYgf%BC9nIcT93OcfJZOASGuQuhR}H|AgHf>2Uhm;_)tm)KXMB zWiA1Q<q_(%kXn2d5DzzBHh!W=%qW^7Id1LsHh41xfuqt0A$ZS)3aN=mG~$gcHX4ig ziSivT911lm<crm~!^yEoQcFhMwv(BrYeEdTrt8-%otK7?7DD8-Z3s5kP_%Rq_n&BI z@mMA53r+`p{IReO;D&B5?T9L9Shh`$13_fj8D4>W62mLJ{Mq6P7r({fD+YVk<E+Pz zVAuf|CjJusRipzv%wLkL(~wPI?@A<2oS^Ru7H9d@jT1loq<ZZK)F*$K{g618NPNO# zCD-2n{=^fnZg0Q(M8ZB_%8=8EW8`<{`bNsCOPI<cNi^?C*DlcC@=#$VbX`kryUv|! z+slh(5G`09HkeIE7kn@hwP?gbx$M`QK3@TvH(iQFvsNbziK@0kTz4b{TSS(^CZV4s ziuEO%&dxaFvIrRR-pxX%IRh2m;QuJ7s?X`P#+QEGXSx2|gS0H%UkWt9a3Ct3cp>WR z1UR9F;}rVfS;YN)6!Yfuj=t3&>LP?C(GTrK^bi-F=*_Fg<SO~t9<G$78Ap5{k2F4> z5Apb(<FU!d?^8eatopGSXRGh)RgSM#sx|fbGp|{3K<tcNs_WP{8i&MX`$osU(YIgI zwI4YY;k;)*VhvzT=#W{p{_^>6z9#g~Q`vuNKlRYF_Uz9()YwBCy8Q-+1o%U(IMhDO zJ9)$xryN3$vI!rHdxtQv*aXcNyct%xwi>@QKM2U(JQoL~DefhVuou-@aSInj_(wuR z03RD>kdnD=L2a9~>LzC+IkdjUwQbrB%8yDKw|%JKxGHWS2;*20CpyuZOI&kp!8^Er zB-!F0kVO}NFN1vv*kl40AXq|JeT2#(JIU}61`Z$Pn~^KzBTP&Vr<dUAhq4NLx?+^I z8ErS2+Er)NUnYI|<dYE{;x<AGo}7GHRZ+e(OE%u0`y)$%$g0IFx_+gYTu62ji4K0w zk{x1wB1KB&)Wo{_@(rPPL9;OoLmF;iPO7jIPz=e4m{{ZrF_u&q_IRtuO?6yCL(4`5 z?Yu|wrjkDC?&Hn<HLH;a(z(<^QooA){d#gCbx!ie<KCmqyeZn}a=3vrsC{vG<gGjQ z(L%x7fh#3o5J)qQ?1$j?EM}HsTAf3++$PE8{7};g7vvUH2N7gq#!jGDBpc)**?bjf z9z#JCnIv|s(?Uw}RW7FkQ={x$5$59-MRc|nk@n;J!)6#c%!j-oi+<iPjUq2ED|o0q z5-g>HE(%cYtKS(Z6?8Y?O+uHUyb??O`Jbm^$vknR^yGY!Z5e-FTejk8mur6xM`aRG zOTnh1G^r|Pm~DG*K|aR>_gj(A5y73T7UHg4&UHpA+5Lz}JF^Xr{aHZ#F|A?pwze|& zvC&*^zq8R~Jv-_dYZ1q5gD)H!oY<Ym=5USZ?ya<%AN+QD{;P`eRo?S7&paG2n1JIL zIQ=zP*`IX02ht6qf`z>iQZi;9VFzG7f#?9?E$T`2uz5}>8AZh{BoyaL(QjuKT;;`r zA9{#+S<wpvd-SS3<Y(M_<F(&LH^$y6h_hXO&&^G@mR+0u2}VzQ!yb3kyH(HrtM9O9 zh5Y0|zgqBj74UbAR99|m?1aqAC0wF6HDn<r#1Mz*XvZ#Ol#kj%fiYI_1%k^bJ4}#o z^<oG1o(sd6ZbuFVpQHjqkc<f=aY%PN9)j`OA0C?cyxZ99vDrUL3<3;5vL|qWgY>_G z|00S@KECi)hQg76XUJe;Rk*ltW)fU4bU3KJ;V>IN-<-S%rxY;m1PF&cbiY1%eHR}n z&~NK%Yjj`J@UhXGJovv07^}ltXpYYXG!qN#gb-!ZB5_sHSRfuMn%wY8<N74_7LOS~ z8{<kOozdM&G>wFVd8JsWYst-yBGgN_F77?JK}x3G>+DO&%*ll%ITww&V22Kt)0q&= z)XX>ddA<9(_qM(?J)wD``97BGsmksQyg(ktY*%mPPPWbBYZ4e6Fz}Wm8Rv1n^@}4Y zQM~#4Z{<oB{d~*rL<Xzb$M4(&U9M)^W&K-vkX;>^-w48cES4w1An1|*g0ye9?F%p0 z!D-YNoG0SCLLX*n-cdzQfHg0{jM6H(ONbi-08-k=CdtaB6wJ`z`jJ!5;bu>|y>lRC z=HT<ONp@u+ApN`d2K`@jMFwB?dVfao_+LncevI|!DMR3#-d&mAj>JBCR`y4urM%ny zzS6|TLs8xa%Z@;~)2fg?Nc#$gl4d>S#UynFF%Jax6|iI|jv%*507FF_a@I!av7V*P z(xUN+iFlM}-X-l8)H-_OqgPHp-dVZ$e7D~in2r88!(Sv1Zvn2er0Zd5x`2Gc4>Z1p zz<cd$g8w=If73%Rkwp<PLKM$MBL0{U;d}>#J_`E5*Q8iYREI4`7Z#2z20sQ?3Bg22 zSlwghhmIWOn=f~}{l3rz4xbx^?qc}d;bRfibL44vm!scD4>O|CZglXV{V99)L;L*h z{Jo$gKFNLrT>Xza{xzTHf?1<3=JR-Ev8^tRaPP_*+-_2Q5NJ^NW`b`f2_0Chp3_>n z-EDBw@m-d&b^Im^z&X}Ehb?I|m%)D9TEp3K7|urxTIPF>-wZ8d`Z4o097aaQYbwYU zOAIa9l9L};D*8Nh5&a@T$PwfBZLW?x#a-<eM~_@e=IrsK`Ihx?Za6>obYv&l_=gz9 zU9Q2wKkWL~zH^H_+3^p{FpoKY5fVbONh+M?QC>f8$p`eyDPC={e#o`KzO_6$mL!O@ zt_9ApR&BTWj=dz90|HaZE8PRxi3@z{J>L?XhM<KMn0z?Lju1Xs`G@*a{5vj<9g)xm z|L;F+h_4BU3(J+_J8--Z_*=-;4?6x^;1fcMC^!o-jmu_KV*-d=49<TkW6LGt-Bfay zi^u<2$CaIdQXtidbEN=R5)6L)Kl7jxk0k6pl-Xnwv3Bseua5X^L7l~b@^m&<CKFy| z+kIPAH=NJv<jg(PyN|Wt>}OC^Z`*Dkdvt5dyKNZdUmzV03NBf(<ge@c>m&V+zGFE3 zmxQcI1|I7`hw8oBO?cA!#>3sO3DwaXs8f1W-F#3g3Z0r^>0a%=CJN8+f@(4&4?hH< zM(ePj@|f;+6v1^!kDYA8;AC_<wA?q%o1Kp3``2qkSs~gm_PX6ugTGJwW#WJCMSq(N z<boFk$wm)%kO%+0s4428>Y)j)Gp1={k;CD7tI=wpbSVGF8kaaZ)`M$ha&%;os3@p8 zW*+7pQjn8Pf{I}wmLDadDH_DH31?G^YmqB%l$&ZonF32vmocZyFC(-6(6JSTfda@N zCb>hoMk7ZFRTR5_?@vE`*GwQXdF4{wyvj$)?85|wzpG}4sdqhm>B?jzI8C>e5b&o& zlNPI%j4B8O1pUPkk4*X1WDmAFc2D4seep3(-B`brH{m>e)!S%zukP$L%o|_4w7#Kg zh<O2LrXc6#b@-qJA-hk*et*O#0?CWG35Rlnb5jgtdY<x-bY|RmQ-7URCMHk=kuM)E zU3&H&eL?R`u=lZvdrJ$aPH550iOi&`F1)fiud0*Sh-&QW6gkRGi6u{eaZ+6`6xP*~ zUu$I(#pS|6CbQCNtz<Iu#pPlG`3KNeOUCnnn_Qp@U93cC5eaFL1pq}EFktu>uD)>g zMJ*1}A&skH0UB0-N^uU@E~<gzER|MX?ZOJG>(MBwALnMLp@NJ?QRDlD-Jj&9-MxT0 zjHRVq-!zQcL?xT0DvH@`WugX8ioX54hW!qtC($9Jnt;_H_+j#_F`z3soUK_#3k6Gv zb{>L3YWwI2>avWXlQ{j+5oXu{V9&mB2=2P}BTTo0<n`Mhdc%I+Rr`4z`;kLHc-4Lc z!^p>xaN|!yVj}qwd6u}O48Vd*As-?XMdo~LYq>?C0yPXW2CnEtVwDE69nnBz0O55G zXX3zr44tkf7Z=-%{my%16WLh&*TSiK95A)M45!|^!h;|G)O+HwY&ph$ytKZ)_2lgC zMB`m8RgJO17iLf~6LOB*^+ff7=jnW0xAuIq_F-jO5;pz}$1z`#4EAMsM4p6q_LGi1 z%n~Y}P2ffVMG%%k8?i>{hPM{Kb#l+9V}d8IQ34h^UBF+vEOfeH&aoTzWhY%yvlPAc zDvdDyaRD9wXLC}ttTz+$8yk}dbzN;^R$!jASF_oP$&C|piKbqTO31?DD;8U=BG7U0 z{2^dmoN~H@>7=G5(?Pd$YVpZpK-B_%)S{@#?tqIm`~gi36kP$gT+=i+`|`rMdf6Gv zFIAn+t&`1W9Ldu&8KhE=H=8H7oX+Y}KISaf&%w<Mc}vOXf3jX5{9ksMzmf2HQ$bk{ zro6ty;CJ)W5n!mr`eerEPiA(3xs>UACh7NOChKr*8q2X^zy)S^oJ&xUoq5N=)PVlA zHe~X9pl#lF=s09mp-t*CI=$6D<gY?L5ksF8)3m2^R20iQivRY9E-k`4MN~5qR23-s zz*0if??}Bxy66Lf>v8*CumaZ5e#(gvrGl;%WXv6YTG0~WDjp+<B?4s}PyzH{#0D0! zKFr{*eK5o#JqY)G0*12w493^E|2%&t*FR7W4P?f?MGg)0Osm(mWzQfVk3MKDG<JQ; znqhRiqxRqVUT%7$L-&HbjyoK_ooPB`M`Wmv(-3!9hrbK?Z*O9zlQIGm*sWGEa>6mG z3^PO<SWNZ6_^-A(;wu6rU>9YUv@O`<ZaFE120wY4y{i&WNYgXMO!dAq_cg;x!Y7B4 z56_4E^WI2)(<yKHqz6wFHj6K87B&md(Sn_DNl8z{_g63c8?{`S@)$GIlDhOgOP77F zP08imYAyIf^AUL?p+u5l<#H`vi=U>&$!feBM+c2{jHR)U=`hAlI1vHv0Dq{GD&jI^ zC$uc&)POhTY`cdOPrMns3Ny7+mf;&4%@<*zOC_tS&kNRp_W#YxKRXYXf%el>cxa-s zvR+-q<}&6>pJ`e#kBefmOlQ&;7r`l9BQw}v4*v44dH4{tXOu#*wt~7OY-SDHO$lwM z%vQrO5w)U4gujRgJ&ln;QoSUc+Te6d30QbN5V&@Xaxb>YZI2gBhS~_}RmrU$PCC%i z(Sq+|2I5Bcbinf9=H3C^j_}cu-&0WrJ!OZpHA6R>#y)MaepmnM$3FH|)CJS^!M?7) z$<KlPu4DTUY>K`I*bcMu0H!h3$?plNVgwpMYVuYED0dmW81@4Tl;wIWj)MXvU=*0% z-N;V{&vd(Ig0<T6#^j~$2WNc23r}`0*V~9?IYhA0xUFJS@9Ml%W39Q|&1>0Wrro{k zM436OA3Rd6Pw=7#7@{61oXBGY^&H0mNPb)a8Ys0&)V*W`Z8aT~$3{1y@WPE8Vu7t* zw~NnkVdr^#uoC7mlN=Png|rlS`6$MNCW!cl=PLXT<0zCPd{}`cmanW{Stg%Zv0@Il zb+}84Ro1o68Fa0E)*hXWE=2#oJs83c#obWt5$-t0J<$>Xm620g0|81Z5F9vUj1F)% z<~Fj&@eE(&J4@(#!%4bb;pL7ysKlcas||fYN=Zq&yHLkc%CWPiJ8L$KaJKeL6%+%p z4N?P~G-_sf!{$ByRYOxKXP~}6igrN+H3b!DsACoih+m|pIcs!`{r#*n5zfB*Y92Ro zyET_qpjcaE{S`?Idt+a6{;mK{M1?<tceN-DLSs>TZHClzkj>lB<r2p~EPe~SJQS&L z!cAH78F^{Qh{<XIjcp1;EpimY0hUa*kmFi-Z=zSkiNXsHZ=xBi{(H=@mwd-1yeVW@ zP)A-P*Jzkox9M`hffru6k$~S>V>$Fus*V(Byw|!```LB8Jar31KDd5O7c`gZa^p_< ztM5kfTxWKF-{>r&h))zZ^Z6n*<PV|#N=bo`_(i{UtsWiDy#w}T_F0}U0`SK*soZo7 z^ajH-FTsZl{QnGD*d9Kws%QT8Y$|p4BQN~zS)bky`OmP2kxuQAyHlyNe|tt%&p$l) zv%fv#5A}85S<YJ>NQQ0B5Z#oUNOq0faT^lII&z^_R5vm)HED(eNde)&eo)f&7c<{; z^Xc>l^p`SEfA&TFh4kQl*TihX06|O4PPjlg`AnkO)CFnn5!LJ&I%tz6o6|g19A)rz z9pve@KNnGvl_Z7-kH(UKmV0dofBcfw7%(OPUFh10>)^s7KUJ_R9$6Kl2#J`4qEd7# z{Nv1V+fQm4<>{N@aPEZwD<iQm@<%gC0!oNP)WQG6-{(&jq<@=+iAF^5kzXeFdsXo# zIdjoe7U@1wtup0=91><cqA%ojtE@*a-p!;s-I-A6`&L=D=tukz6l>BSR7!e|_sH_a zF31U70x6`=a;LRo_x>c3OjLP%Upx*4KacOrWHTgp3tortaSZ<6A3)#1w<8ZX<1!^@ zB}3aLi<50ve5rRR08==EA=(tu8Fh<ro#qTM$Kt58Z0$m?4|k!<IL9x{!R0z`hUr65 zoOBcVnmQ0!5=DNHs>+*9UO`O?L}Y?5iv~k3pN}{@XT*=ch?DmEe6CP1N_&G$duQkI z8}{|<5hlIzio_z<^}&r$JRTBXy4B&EAAT@Bl+Jyp=ZX8Gn?V`y2fwl|JZ>EEC~ypV z`4-D4kS#hM!9orbTqONNJf)m+B<AiZ%AWnpu-`D~)-KKy&^Qv$x<vVY;zXj{$c)DA z2L!Q5y~}-Exk}|In3Hp!0CanhY7?LilLLm`K`A;V^DSh88$xb(@QpY^Pt_FC&q^hI zX|YsdF!>;R5&U?9N<5=Py<WxX5BU8kSO9qS1Md+N4AW50g3%u9{&z{l#3hruUgCEs zl@@cEEZkg~`nn$yc_<u8II##xaQ}p%ARfZ|a(xl!aoxj8L+A$3XxL)ioFx|$1c$E` zURGwD^leC`z?6cWBR4!m3i6DWz&Hp<@js~Rhz(|{TK`kzmP7*OjIKZUr(dvw+(wn- z%^YBo@@2bFP#5X&jG0z*YC4mdo<iuCv2O*saY9BHzqTlQg^JEALrj7mf%rIzd&@)0 zIEDFlkurJ3M}{?SU8_W!QE;U#Xs&>v!G+?T$RG%@l`~DmEe*L+aNPohIf-!s4XY#} z-lAA0CgAUT=e>TvcMi1|<GFZrqu=mMZ$uOMc-s53`9*48(EFHcxv%$8;5?BmR8qx) zS}7plq0#Rj^!uiiS}Z^Sl-TR4q819Nh?-7>YvB+qpT=@d31K~^{x>yxYkxQt=wg@y zA)cXt>R~YQ+#I|~h>WeKq?%t!;r*#r&2_*m<!D?2FMfvWQK*O#iB`}lLe@gTTJEJR zRILQYC_*CmjPXDY_fRQNf@@%X>l|iCQ;(v2SLcb#m!IgMlE|Y|lBL=l5yy^2a~l@9 zJf4o7najCu+I;A#ryerX-Q2RJVzn*>p%$wn24v6LGYT3e6i~)H=lML%W2~EqkO3vZ z+~bm@vn7(4!7!wL-&4Mh@AGab&cIZ6IxyhQXEL5#KM%TS+_zM#h2CWt?+VpwOMmhw zHaza)5*p=&Auln~I&g0>F2bZJED(EAqVxxme00<b`SiHSTkK2e&A<iEBMHC1T&x#T zg|p|dm@Lk~FE<)Rey<tqO%~3b#ol_c?Dr=g`S{0K>Ox>M%}zGdR_^6rnwp%-JP`4p z2&B`26M^spQd*n6bZJ&gOAmyxgZBC(4`guKFD);>oNK8tbCXPP0NhCYHs*G_UXl^{ z6mP?(t;QdVu@_>4FXdRb?K?Sm<)p8D&?P3ji}<0gz<c6as_d@AZjKrWq|k&rpajKk ziCH(o3`!D@CqqP)*{@~dDfld^Tlxh(#a<YEbbSAQ_kxmI(01|1%wLbG>TW8vtzY>` z*t7XV|F@a0qRyYC<CfkUG5~xNYtXxL|Ilis-l7=@7$)$=m%ugwHy#>jaMR%T@edzg zU?5^h1fxMp>oEh8YC17G@WYqc@1;=hyQ3H=;JdrAA^Ah;+1XVCqL;3x|3xU2$vl11 zkVHg|P?kt1PCTASp4A~T(ia)ab%G&9*QJe(-Eu)+C=^@>+;1Sd3Q@&(oqJYXC+_jo z*|U&FU)3S2($|J-tC0WO4g(oO9FY1K1=<lPhty~gCFo`G!PLbk*|chNkh~yxWSm5- zGGw?C#+kiDQI<RoNN8tbvEoaePJ@458hq87LHpJ$8_lT!@P>ip9|nbX+U+F^<a?@g zlny?M-amHXXs#n2k4doSFhNIjz#hU1+e9;4w7`(^RJ2A9Y863aIh;EBLmt-==a`um z20sP<42HM}_oQ>b0+{YY(pv^hBH=EVBgFX9tfX0pxhMWXhERh(LW(euT7Uy~vunP~ zP{nIex6|(r)pKQ!dwQnXtYjtT^Mz7TEp>UqFm~RsE9#Ih`*KQ)rb0d+ld_d&b9Tz@ zDd*}Tzu)POYEbWA_U#zPA?-HD9S73Oc(15~dtJrlQe7R&dc)8dND15t5JU*N5TFao zefd)lVpiNI$tCv*tyHeIrlu3@AID2_BIiNLB=MVl>)$k3uR&fXY~{~;sgUkr=kgH+ z9{P)_IL{NuZ#G`?#QzGTBIb3U_aD`D+u*XQN(v;kF2kh=qOsa$mK!oU3zG<yF3F+} z7^Kbx(j)g2@vWonRC8zi#VIfn@#1sLp_ZYJVPzzm7Qb&hbi|`lT<Rv0JWiJ4VO0&s zOOr^a8e8;w8*8$>O26@d>Xl)Pk=NG5uL=v%z;L<(s6%SIAKjN~OMC_}kaDxIriGD4 zuUx75axU^x6<=Q=VB5mpKs}4h`<ZMV{Q>@Qh$G<#)8@K#?gW=Yc3aFXLLg=I&VkYG zAj#f3WKmYv`hAUlYwOdMq<M31uk(n9wpJ(U$mA-WrR{Vuzpa{amObMn9tg<9O#!de znYcgTQh+RJaYq|&Jd`)5E!Uy<w^osKmpSZ!soPc9J^RMsrdf_%z7YDZqSCoH@>k)D zmt$o!e9vMi>qX95`<aKdI`*6Y%fQ)(>x$_+|4=pf#FDAhA3hs+BB-7{8H0F3bI|~w zWxzH@Rh=BXIv6=oqrDYKGHZ+^n#CHxnkHqDQ9(z+M;L5j;hrz*jjKCG2h5Vs?{?3r z-kdj%P_75yy|iQTgvM9yKXo#<2{hd|&LJ*E3f03(SVslWE`wMvP7`e*o)35eS|DV` zt|m*cnIb}NtVpIXWrPiIp67^^AUOv5!C0egX#0Z$6A|N$n@F^AW1o?*0NJ?lhPF!C zd&Qs5eai@b#C#$w=PU&<hw*QklEZ|K4u2-J*A8a(dj|)-p$-h~>>=hT0;}&FxC-P& zFA=_4Lb5EHVik(<TWPC8U?F7~fgxcytU|&kg<b`!#Q(FtwRI5+#P-}=@%rF@IAyZ@ z&lq50`UhmPAv@?npXsOa810|>;08i7r4PP8R4mTx-E-^U7xiw}vX#=t`Z?-H7v6_r z+I|wcookLyI<AA4BI?>&lbUde;w4q6jg&Y5|6Hvra4p=Z7Mp8Q0!^*8YHLhxpz?-A zct<wJdbwU+tgktj@irh>M3?#9P)k=}Y+Mc?k=tcnuYG9XXmI5M6<&Z^$Wv+aYlq0b znGgr*xeH7QkjYnax&x`{sr8Kuo2XrZy4#sjdP?<s#IXRVpTu1L7=^{0J-f0}tH%5; z5Nuo*cv?e10?I5xK9)2M5oKPtC#qKR@jp@&L{BheEQ(9COi<!JMfvaZ6*cN{dqcS# z;zv;J5&7>C)1bv!H-W4q_;b3!w?nfaQw~0F*zb1IUbia&Bt*t=Ul6t9{j_w^5ghm& zq8Qa;8Kset;wzabXlg3D<%Z&b?f4S$w4O&oR|>Ap7j)zz@*#Rlc5k78s#ZuOQF=*I zwQ{+LByiHQgXm?S&x^Y`t|wg`@k?VVl}1vCYh@W3frNYqCBoQxMB%}Re4s(6p{9P8 zNI5sgV{EnY)P+gJUz505&*uZdq)@~KeQpDi9%K|~<Sg+Zy<kMVh2oS>*^bib$qP>z zD(cw>k^7XE6r=jYQ(>QVMk+O-47G8doUxNEk?`XTg?yHz;H&4`PZ^`<PZbN^$Wu@3 zBHIj<LSiZUfy=er3RH#LDHq>Kg+fmFGPm4dsvc~(rTXNCi{yZEvtz<~1M8FVNAbkQ zWF4s)3yVM8?Cj}8Olhw4IW5)T!Lm#;RvZ=M=!RH84MFpkvMtq+79omhJM2BUNR-@M zcSGY);W<ohbyaH*1#eNMIq30>R`ytz$MaHPuA&1~c1QL(r8hcjv;ukw^_8CyKx?+u z{-AHtEhseDAngljUd*rCPZ^&Lw7}o>0PorZRr5ivMoyMEoXg4LQ6cZtW@|&jJ77xV zjevZ?$5?M$(SPUe)YCWNw*iu5Acqq@l((Na|8etK@4RY4x`mQ|*fJByY-C0p_BT8| zsK%}3i%}t^3Pn#1ySq*e0Eg^>q6|JmZgMpS6Ik*fFENEvP@_r*L+>2j!jt-JhF#3e z>Tf#&?D;@o@Tov1Jv+0qGBcYV{3<htac;V9;Y)ozGdr7EKS1sk%D+-JXGyV<&diQr z;-`S$sZIm+6MBRmTVzYz1-#x)A=?Ac9QD_sVl7{*N!MAqvc5Z+itVo5b=TT%EX5qx zrP}U#rHpbgcG?U^XJKc3z5MA<20mS4tn}$XXCd|J^7=ZG!BRRn=vin<V<+?>#51Qs zZB9TR(s4Wms&m`;k|^i<I8p#sr5+t-22!0XZN3e=3hD7d<;$?D0K)5FVvfgFGRHFd z34gP*%j30k>+2Kc^2GZ3x$zpbugheiyP8{`n4O(i4l0q*m8%rCwwz_F_Fx~@&7|k% zn$5YnbY{E;5usE*v3dIR=7}<Ohi%=VE03loCgv6&NhTkW<;A&)iPWPI+3YcnfNBYI z`DOG`kaII_^wAMdAD*}oRvT`sz!EYqO6h_mlbHzvETEsdf}aVRF+LZ?xwjeomBs^; z)t=SlxwfGgE3-1IAWhBjqf?nl9G}cg;*5R!;CIyh=o>l+xURnu-B-KX0Bi}np&jDn za8mFR_!g7CmxBB17#3&_X_&=SUEneJYhW&uZ8KUKM-(l$D|M(ixh~9kET+bNEc~^; z>7w*7NDw`~2de!*Ry_dc1C=l$M<`}ZlFS2G+z!QrvO|HS9c|a=+4Y?oUGg&<?eB-& z0PTd=YlXdey}%MWaK+$;9XJjRY6B_Xb~N{nH=vv2E0r!q7djnmC`XE%zm6(ZAZpi1 zyrBf0B%XmiA4L)i8rjA;!+ctVum(X$!h&_nC(7lmj@j8N^R?*2%<{}Nr1%>(i)q(1 zsBgE*TPN^u(o#QqQIwxFf=HJueGRvnz(uc&E<&3vdZU1ET*s(!lm@KE)v>^L(7|xK z0U<;(31D^-mqqh)rS0ZtaSk)3_75c}>AjkR>^m$`=yK&>UD_gr2qe2M&rLGa1N22U zlA+^B|JA(xEpx9Tx(Qm4t);HbnS@}D;y8boeG@QOgEtf9zyY0%091zAgwUDo1sAM` z>NZ2kIB@As(j|c`4;NqZxptiH>wBqprJv#7y?_r1;HP5m3%jKqw{QQ8slC)*W3*s> zdC%qU$Sz#+O!{5?yBEYI@%M#Ya>wo3lLtRII-6f7+KK+<^o4X@T&97tD<V-cC&Uy- zTV%7Pf*>$49QuWE<sjrYeW0cKfn}ISe3<DEQ8FFC?k?u%k&m5!u;QRepFyZrra)n$ z6H9<f3B?pR|4iBRMOHZ~G$d45`;bn3k8JmE>~BA!Buc7WF3*-{WgplhpHKeX9cZcO zYgj9+j|)l(<&o|E8~yD^eBy#LxB|M5kWc=XJJ3wg*RWQGd5nhrk^t7Qa<EhGADZ)o z1WSYlxrc!W!%kL7iO#>Ym&!Fk-He4}*j0nR4#^$!1|Q}yNF8JvhR&CVx~|WU;V=Xn zS{Me6l^gT7&-u9^po)AQ&x4{J#ljL9pebiP#B);7LilqEyL7$nRwEKmphBH$6(^Dp zOUA%dA%9%e?my`>?ny9IW4NF%JOn?Q%P`ooX3^<&hOR2gV{YeLy5GyY4Fv+jhmm!| zmr&Jv43Ven5~8-_QDgA-gOOnBe%ON_lNCLvCn6=q<D)^^_IvX($=33aw+v#g-|EdI zPlQ!Tkd<WUnBf=5U+)&}4`uQ{=y6G~hc`k4Bb7>?-u496c94q0PEs1aa3=MH>~=r< zPp04+81Z~PFcT>Myb?Uk``h*QH{Skj&g;6M&EmeLRT%;{@XDC*VLqcQI2W!F#YWx? zE%GEq0dUl}CNEj)XYeGt-nSFGtD(}V$$cpE2XCaJ>b29+h~k|H<udvA-+NXKX}fXX zu74)*|M~v-_ugl3@n&HsR(y2@G<8yuUq(`~x$lp;WUq2>E*uIk{#@KM@6p_`FC~-k z`a%V^Z@m2#c9YZh3M!o(?om{uCnw4x;6=2vUPa^iDkDJ`F1|&SoOTVhUOfMb%3iX+ z#NfY9{@(nhr1N_hW8t+AR#V9&idYS<B~#xW^T~Oym%NkMGnq(p5hc%8Wp^|u%b)hk zIoTIG1~G32o;`a}&9@ry)B~sD7zfSc`NP2UuX&@eU`NwzE|`8etDy3*%UcLJUFYcz zF`tLvM#v-vf6o=iDYAPVQhpL|0#pk>CT=7Jt}QP%#DbCu#Q{ihnDwBufwCWpK$<P^ zHUI&sp>jz?YO;=f3_crbxLsExp5lxi%Rb)F{yk$q#n_K%+RUn!YWV*uJD2pPil-Bv z^z7h2ZukPFsa@@%xGc-XTrJ!JX0&&q$#i%4qH$dZ{Ams5)zpS>uzx+#ygVIJANru* zo7lbF3MCS$C+gvE4#)J*Brjx=AgBsygYCeGF}3DA-WfW7s$MY~-L@O4BMwiN!RM17 zLCx;i3D_wy?SrmVYQ2e^?ZcrolPR|J-QSH&O2}p$$%^G`fxDD=EHr8OLQYj((@iZO zqw#Wkz80AN>2@3QnDmQXw2|wpAs;rmP6L>bgeEi?YO2<ZGif<x*B56P_oxwhEjGdB zz)K}N1>{HaF1B=iVRL!8q)t?4e5zy`0|(3xIH_m!tTX5W)9B{W$o2I)Yp=rS$~ z2sw^w@_pR#8OKe>ThNzrRSdK-U>G3aQ?o3ej4JZdZE_tiM66AqOqv8J^|grJRl#R8 zL8$;8l^Tf&;DN!D&~gzm1|nL3yCdV2HHbDfSRP^bUTT7ALGoF83|(9=uaTHcfd?&H zj6q|udfTUP8T;rX7KcwrG><(2&AH_hfYW%6wuPBbO|=ghdqANuv0}R7^}$%^_IZ_E z=Jo_7w_8$Re)qVY2_@>5kf8`B^boCtJOP^J5kC}6a5#x0gcv?bUWnG<QxMkhZC=f9 zE{DSrH@mUEuz;elp}FsAUlgk>n_E~|H>iGE3pslVEh?qvou2mA7>{~zBY79}S+bl! zjRCjU$q-{ft}{+1xtP1)#<tVr#X-N@=j4hfwE3N1DMQgTzLN0k-+^AC<T~b}r~nHX z07RhAG03oi7Tw%j3R<g@6<VrS7o0%2L?b}Ckcb0QlY7Il>-GuuN0aL%R9N0m*E2hJ ztw!9M=l%&Gd_*3;=62}_O3f7lg}YgKUX92P|AZ@kBK2K|k;?aWa;HMfy%%pLR`vN% z{AyZnNc)Umn-5g{=~g|ax}D*h8_EMq1y$B9-yM<#pLM+Gcnx@kv}PP7eg_#tB-nL8 zUbxu@TpNT3Yn>bqhB--EFu;HdhWSM%o|hwEbjbMJ1;!kP5AQp(serIKgP<Zvn-x;m zH#gVu6XZLbIHYXO;4~jjE=8vgogCEYWE56BcJd%s&W%3Rax@skEe<Uha7e+6Th82t zL^7znD1-jUPS1iIsZ=7=BEEylHm*<H#amFo6}-j#3N<*qV%|en$O}iWC`G*mebfl7 zeCS9M_$J{n8MM3)yx#|;Z8=VJ?~bP&&taS>DS+TVIJZGcP6~w}!3U_eMi7UP7qIUt zwm9-7d<BJ7vy~)f)hWyq(7juh3V9K=S)m{0K5SeVW@aSpU2LeSxVn0td0G;3@Ai>` zS893K`BfD%S!2-~j#$dh4sb7!GZH+|cjO1rkf5HWJ#^5_sgZbcQq$ldFz3_ssIqYP zWT})&A;aB;c_pfAzFD6?0k}`bBPuT%L$|*UxgJ;R;@0qxw4S25T`F7}Y5%US4|#%r z#OG!cawGXL3B)TfHW#yCvZ(-nS7emLg}qrN%L({4*iPXuOW8?K-v)vjdJ|NFdTp%V zyJ?@WKMe9$^{#e|Ry3tAdVL2|>i18~Yg*SY({xP-=P&-`{Ihu19ldctT1V18j#mzo z<N%nr3;vyFD*96pMjH)ri_NBa&*Q%cdrYHesV=Qwhs<T<_v2k_cvAyX!DYvzj(6dW zxl&N%`{34=<vQR1V_V-uPFtSizE!V4zXfYTiQW%=Lpns%Q|5jJ@N5*ofzTrA03bDM z56%&Lx(2GSkn)l_NXHqN@fq{&wIxF~Uiee4Wn~WQjo%h)Cq7`j&>8%_W$t2L%cgbJ z+O=x!fh*LHQt22=dzwiZA-^%d(llCkO?G?%!#Ei1S+}=-uN!9XP3sOLhbisY9>`Oc zZh>;)iE8r>%obvG$vX;I47O<CD`Z7-5-LQexv`Etjy@za`mRJ97-4+bC-@Imtv%7f zOV+NwIJs}UVI8!N48AhFp3)nLRn9*NncM|ynFBufrIs6I3n;NKjS@;DM@u5cVsJ2t zP%~DkELV%4gC|QLx@1_mvRPePu2fj^-J}fV{1{}}9%e-ZP(k-2@AD}B!T&lay~05c ztW?hcLj?~7+z4PKbT3@qEFek)rZRAHpko9i9EFrP&qUyYyCD4-TO{ho#dc6Y@E&c< zI8w`iDuNZMavIob!j$NBI$<}OQ1fYKr1L8BQff}8mvRuZtIRE@7CKPu%CIEa)(1Cr z*!>iR^&6j*kk9hmOfK@ScSUkD=PC(F`efs6hXh+wC?rGf1J}XV++=zm;sSII{A!Ah z2?zY;fC~WgaD0QIU+C^=$m@`lp=E$70_cHgGtK^_3Jg$hA5ef$KK)?lK|ky_Q*)~7 zee&RqyM3wDN6e3w@%PCOZGrv#P_bwBimXA=Kz^K@&M#CZl(|&O_aqzKeB-=VRX<{S z>HLR2)HTd4aX#^=PRRCep^Z^T1zhSna!Z}T*dNz99@k4^Dm&3y3}^`hN|p(jDDXu9 zWTkaj&p0#!2)!3`qnPl)f#%nK=S|js^N$AaHq8Umg!1%oYN(;3p-}EM+zakT!#(ew zIyE?8`lZ=_Ve&t~nTzHVhZireEJk(!qUXds%WbtOJb94R7LByf$B5|cx3bw5eXo70 zFj@H2YG+_{R(sZ@9iayHeK~$sEAt<I^TdhY)VolK>biwEUboJ-wPiH3<K(GN9|W^B z`3Eud+<)j69z_RlG&-vt*2kjp#;8c|j&*;y9g0=fzpn3zR_y852j8$x7&Z9o)*cMz zsDI!s9T&X;*Cx>+mDcJT{F(IL9mHl|x7}Fu?Vm~?z#KjS{WVp`<$5Rvfoc<_O98b| zEm9CJH1%U;G!)w9!<#LfuEJ3;c|4V5=@?{n^={1f&^@}lp|qnjGtsuva97<HmG_(j zH$B>@b&c27?>VH4W{#156|lp4%D%bhlRLRm_WW~(d_G&scDz0%618lako0Zqy{_If z&HhNGY`+)Q0dHJ4%;9YZ*@jH?2%N?_zOj3W6S5+PNc74khemQr=f2|Lk%YIn#TyB? zb4+*&qG@C50~NI8I+U}?y4?D8EecmDMUlOJGK)Fmu$V*j6%59m6s$4*;Dgf?WI_8Q zkeIO-P6>Xm3^V#vVFrAUG+QXlLU6?|pEaz1^t|yC($Sbxoek%5;aSZUjitqX#>cG| zT(jSmo-+6bpA=nm(Gcdkz$=pkb4hS^K*t=1bJaL3iQE7#tb}CsCQ0~>$;bl}iG;Mc zcz5B_Qd3GKs&UJ1n3zKrfI92xvx)G1m4*4{-HVHo)LgnWTdirKJ<D9^$|dHCv&|CP zK=h|C8E8Y9a9SL+z!JSN{rSI$0U8?GJhF4R-|~T|6V1Utn8~46<5%HiKQ(pFMzd5- zros^n1L{;SynAkUej$|%{m|k)Q&Z%LpG?g!>~6QKRV}S3kXVr>YvxIE7J!#S<-C?m zAu$u;=~9}OonKp>Etj)dZSc*_3OP2YS~d&K@;$jsI;BB{=uD<k>ePZA?vi*T>=4wX zgrsSt>VT!2peq_r!1&sP`yY9P6Dvl_4{~a(IB3=Y8u;JffZ(4HGjqJ{0J!fP{EwNm zpUT(svyA~w1%8@1ZrE^~Xa}@G@1!MY98CxAG6>$cS-*30ZrXF%DLwrFy!-81rrR^? z0l*#P2RR&jH)0JVh$l$%ssNK@5vkT&psjHkOAuZeRpCIeqO^c*uF^t?K_$)iInj0K zK#FH*w%E^Bo;dx%r3bdush89brUsvYUyq27!;k2jrB_}`|34+TI6R>|H28(m{iXZa zFT-qx7BS!y7}b~q-cBaC9R4?i(F5QTkt^PTr$$Ap@hEqm!q{S5qk@Bh?GxZnatM_7 zx;f}tYY<F&`k<>Du;F983>`)i>)wF>9_$Dk7$csTfLv0br-z0P&)EcpMDm_ZRwDKs zNh9*mHi4-EYR3^#Csi`|6MfUuK6<L&_W9bZPs_vm!NQp#|J0N}WE%R5EB=gs<wb-R z4Ohm;hI}E{(-nB$Rs=7gUKrF!E5x#aG?G^Vmlz42MVQm#ifTJr;$B+pW29tZE>~rB zb#9L1JYLLRDwpR5FFNPuR#z+ILj#dm?6agb3WqCYgD}Ry?@|)F&00PF+3iXND3uOX zw)r9M*@bSzppjnDfqqP5qeep6P%Z-vB{V|KtjWw#IdNifk+*|^83vwSTs(22!g@z< zDjp^12<}Th7L$~DAkJkS+!3$WCh9@-gsh;JdjQ!;xwVu$C8?iKMgjcIH~(&K>%{zA z)XOF!%aSu1yS$b_(ZWbrql%YA-t^R0=C+VZv9)}5dvVYFCi~I9Lp*M|+)ih==Jd78 z6u!Hh(&<#H_Nav;vdj`UQ3`LfR%1**xd$aM`8J4t5b@nvhwiAN)sW_e)vi*4_ZE;1 z7xLS*M$XhpQpC0Zvcwb*%pTT=*{7umB-6!C0$r>dJ$(5w<}eHg;cxLgFZZb@{|)?? z-01d_gXzLjI>34K?H>pqY`x#dm=TQ@*GADwSaskJ%!dii6T?iN;MFmVw37sr3SlPR zqa;3j{NorG?$Ui1uZo=vv6v<I4*HVAJS2y+`R^5NX$QhW8vM8=6!!avT|_8e<N&sj z9`{%wU-Twbi=sFup`9fLmH(@N0L~@00Rnt=0VGuH;i6QvvIy^=7M5}yeal?#L}Gs7 z{`=<_666hMTB?ehma1apcYZ)l-f$4U&JL(P0&@U?AeNhAzpdYqhdI~^aXoBCVs&r> zsLV7mK=`9E>T?<!qU?56<cJ2ctWs#UN_NRH^^q{vgKdMskpO}oh8chGR%qOO_l3{2 z8YbViXiFD!BFx8a34O!Ii3=GtSjl5aZ)MCFzy*2@hY?%UZuVi;@ITAC&(Q3)b8?2A zsO*EL^w4pj;M5_M(~{`i==}aMs$#vb1MQPRQy|kuD+q>&@<0JVxgfKW<HmmPK)eyW z=}kiad&3tT_L+dq3@jCQv<Hm4uaX2r-cEZyeAewW*ZTO`W8DMQREh(mmElVZ?+ZjQ zy6c2*WB?oFPDrCbLg2|Dug2x7=j*?+A$i!zr}M>UFMRalSw(;3-of8Trlw2J{E51> zboxEz!Og#X`lA<~E$01S_edMR@=9rXD)P+We}6<*viH7udTB`=+$_Im$UDD{crh=Y z4Bn8dH;`ZqiUxJtQ|BTu%w&rsz9EeFo;mfyDt%vC^+<*3^YiDYu6gCvyXTgh%X4=_ zq{yB@iv8cR&iY(i_FkJ}JM-tK3zBE`f;jC=GaEgVb%=L=8P66z2Q5w&@$z_IZsjK{ zDu_3H0N|by=VA?x(g_gH-Szh3wo{cMp36U>&P5-adwl5!!v2p%=hY80)hV5yJD)qV zEE+qf{^5uDqhF!spwZNtWwfE0WpAi+vB&2gZ(eH$J{Ci}2Oo#A01eJX+4oylf8`Z^ z^@nY*T*rGhvkn)ZZv=mS_`98kMCO2!4D=JR79LqByg|{SWD`p$8gYowrUx&1TVFG- zb^!f{I1hSK2QA|z=PE4F*nT*nc$7*7i@XAd@Oa)xuQay#@$#96$8KfgwHFmRf^(xG zoa=l~nU}KLZVdhtlvOUL?v!IPmY#wiUg&{*x>cb9XP37dr~j1MeaUR=H|cz2k;&qG z=Zm02ydT6I+H{DhLr58<SxIq0V<>HK?^_CShp`P325hg`QwOYr@8>cHk#C%fD>24o z4Zwm1Sp8pp$+8xU;!4zM$R)!esZvct<AqGONfg_h_6LJoIdJgN5GobN5Nwz`k<Vn5 zcTeK4ON&+VTxaiz<XAYOqVj0m<8~=ZvL1=}lgVs49aUH;opFXdQ6;ZML(#N``=sGO z>hik+0qqlX50e(VbR&*uZ$OuJ9at7PL*-+RVTT-re;Qvw)-cMni--tJh^_w0%naNm zlPM%8L5dML{iQQAGb?69$)!+AM{mH%c41*<eQSGWR+46Cwzt+-78VM5cB3{oo7E~y zi?fP??zZtN73k#1rqBJM@K`~u#1dW0m2cE28VQo@VXox73KfZf1(Um;!##zX%?UBf zX|-x;I$xB%GudLkkdI7kZJt<<DtbKNcR4GQ%gx$yB$CM#3Ykm<f7V)0M;pqV(0)3d zO!)%U+2&F?;X(n}G+jQixpks6Jzblxph`sT_m5o7??WDLI?;78uRsf^J_%(GpT!$O zr9nm*vLWRqg#Wv3d=4oxZK8p3z)X|)VLd*F<RJ}>!2@aV^}ay73@kK4Om#!o=i)d= z8|=g8zN?9&2K6uIHHZtiAqV+Fk>}{Jhhe;36d~sX#pq3_1KRbLO8ut_9r58GW}E`{ zEGm%*YUM6APHnAk)SlDz@2Rb=ZOHI7B7dXco*L+3r59AJJ*+F`^3_@{&qluxLN7P= z_8J#w^rB?Kv5B0U0*V^!VWk(?v-a?&6TgN2>j|C^%@dM6Atq`xHJx67@DRX&%x|jP z-KbVKczK{H1hgVY-O+7OPIRkuo1@m*T{?@pZ-g63i|MGQn$$_RYr#@GiH5=SLe1HL zF#_HJ98z1<v^q>ZQSJbV>P!S@Q>r>;-;PEAwsRe6Y4O7UPuh0?HgcTj?#!SO1W|~x zU;#NGNCNCjf*^Q>y1hH!9Zx68R5ew-Dkq)l(dw2hXXCiYb`;Zz<)+w1oF+SoeNJ5D zB(jmnPMqT8(q8mpC&sg%Tk54d#klwVv%3JuBPBZz1b1f(W@l&q`RDJy0rkj<`31f< z14+dCGCn^a-03G?6~X%psZ^YPLBEctQic29LcgMZWUY4~xe0Oyqj9^nQ#CnQ44zq| zzT3Gu)VphlUASSWEM{-p{^YmOPc8T=;@Lzq*8zidtdAM+j6~VzSOT(l#s4BeB4|5^ z@L*m~J5cbAI{d1c+>{&6rUnMF*^p)f8j8AXAgh;bIDA7LxT_8hq8l+TGO*Pqz5(${ zDp;t>b4(w@4yZQ`;~z4XDJF`^d{PC7HuLFl+?bi@olLTOCve_0!`Y!4@e0Hw$htIH z?YZ(Nua~ux-5VR>+c%7OW8Wvw$+L+2W00s=y_<p!_Ik8|co%3C^du4oSII$FFGAf` zD2Niz{e4a#X<qa56M=v8{|&O2Hq9K|oC~&TYWVC#yJOI*6%XgpVBrsvUO*ked53aS z%>g>YDEN*}8%h2rskzxJubi7rrTjkDG&ejV`<zF1x6VL#&}bq+3|u-J7m(}i9LsU9 z2E(i2yr$@Nf-MO-`5E*9#uj-q3ppRG^@0k<)Koz{7>qQ7+bI@?%H+~x4)idLWsg{k z$CpcckIas!Xp(Wb<DNyIP`@?+Gc{n%QK~h^)I0}cqHq<09+Ei9a|b|>t$dnUwn;|z zT;n5!<%7-IV9q>n>eK-<H%Jk+NA9~0vi6smhYmyHe%*Z|%_kV8ZG{sKZLt<QaH`=w z3b47l0VAO38W5@=U*SwhzGo0*C}D;Q>V>q+4kiHG4Cy1~P6IwtzK0G@N~H~_7l?#c z)2f)BUqp0HmkE@YEmeYhf<WCC0B#u3A*A7Pc#KE#Jz)f0?CI{IbM()LXi<rq%HhIp zTvT2_2vfdLzI3&#JFb=qd8;gyW<Uct?jRr!DRE4Ij_E&-M9Hcq1MVfLNs_k`!C)K5 zQHINxeski&J-#Hp+uPJl_1V3h&UF*d$2#TW2+Fca7RDOOEBTb?{a3CgFppbOvofM} zj4Q;S!7xGYmoGB2S>KGuH|hU-ho2~w41C#YXK2RInPn!I6_aX8`@QTAQ{7ZL+ZpB& z0a!cQL#y_rir<K^JU~%Oe&%cw2o2V5k>71@K9S$Dh;uXxIK_)i@(i`ARBE20W>UV< zN1YR_ZZ=IDYdO=_oJPfg@+?+!kGwu2_#}Vq9OdoQnGS&(Hbt1Y&8LFQH8QRu1Rb=2 z#aLKB5dK4^&7ari-5vXmt~YCapcX(!T3NWskM_jY{bKA&`j2*&V_Sas9sH)RS<`je zGfUU6%>_!rf8`kc2Rq9Oo(Lz@(AEL;AFTS+w53^r&>XZQ6Jwgm1;1X+v(xR2I|@8+ z|Kv#pvdw=~0S#m*<b@>+h3JBzritBX;870#0T){*s7WGKh(oxltqPNo3A&jk9I+bB z#3JS@q1R$?V_|sc@HDg%x$@!RAydjLQY<_R{0z?~tYKzG2>-2^M6*o59>5wJ#+->E z13D9O80Il6D=Sl71>}R2gw*zz7xK5Jr>7yU8<x~IM_yzDk43;0<5ZFyv!SU5gP*7f zplbr$PA~!hVC^9}Ik%1PH4G-5Swf=N28q-e1X~;AmFiug=V1Q0bY3^)2YJ#7lfORo zF!i<y9?L7tIfGbA@U=?r6ToPY)dHe5CcS`>X55bB%h0WK>esNc!+}NVs*U)$bLYH) zh)a21Q%6K0oMRf$QrwVehQg!lJjR1EmS2u{ULrh=KgBm8ZkiIR&<Mc2i?)OsLA#M3 z7#Kyu>KGxqfEkWMta{3ZP}QNNG5;c~%S(&V*idO~cCLJ6AWp$`!2Bdwgf`AWe=0dT zVUCw3^mMp;+}n>LqHqANp%K~#d!X_9#i3ZVQdzFbiP0p)nyMPAA>!4^;{8X<bF*Wm zXUDt4X?>zJ?(Ih-5h&;pv>2Zd?eY5VSZJWRX`c3C29P`lGE58zh1F6yqRZ|cn765c zK5yD_GMUXTKjC;8&>3c%NXI}!jk^dxYU~rRpcn_pgO)^ZsE#Za=D_tp(N`p6JVe{1 z0f$N&B*8QONk3%IJ(F;iAKQqp&t5!L2t~hleXhqhctdvOy6f-0<LbSG?46-(*T7(| zfBN7;@%Tn~k*5X+n}7VN!1V*h6|-|}Eg6M!!}THHCdPH76_I8g_I0OW$`2Hb$Ev|} zhEws(B<rEp(7;s#h$W=-lL|HI7+pomI4=4qwgc4YL|s=2NFXmEY8(DK#H$q51^N}! z*7uDRX6GuMu{kPpvxSj;>*V!9PArdCj~-oGTwFSOwEFnt&v|O=mH|ym_x-s!&gVu} zIA0lg^C%27xR@%HHd+erILDLVt*T^X&f`E?k2ueuXI)t?J5PG;;}3ai^j781dS_zG zFMs*+$kAJGJv#E{g5a<QnJ%xals62oVdM|tj4{!YWHWJ0<(v^?PWDKmF({WJ{RJ1G z)ljoRhh=Vh>;loHPWh5Zb?kZ&jaPyfoVo2bB=Q_D9z3`f2(U}mSb6c9SKOT<HHPC? zq?C6px#boK=4R_Ogqm!vxp7+{uy*iZahx^3lDhj9*DS)s-0?G_>OS9jx7`wh;;hkm z;J~=zm8Y~rm^1tMB88xGv=mVMcT!j*#8QFv2XvtW5W<e=dKJRFpxpV8w7pQ2>u1-) zT`}GR&9&$PHPs^}HhE;bOh$TmtSh`0y=4uQ{4FpM?u}k1FQYwBA&*D8VSIy|hB&gk z^IVV*p%R$lbVuTxzwa@M2m9E&-uLi%4F){g!|!{SGw)5zQL@pCD~f@9iAh*OG5w$s z;|0X*0S$puc`zt6S;zxPIeR&?S@GeRw`p=Tg>=AUah(Zdn_thFT?YJ-&JhcQb;6X< zY=3p4cB_E>qSZ;lObj1@{nY_1TUf$qVWK_O72C=kUh4@PT?kqw`=iJp2BaNJkfEZ% z$4ey&iBT$z^Rq0iDj1$v8bz?Z(b1*q=qM429v-Sg#!2r7&r!IMVtSKF0?qtI%<6VV zE*d_BhsJe61MTQ|gz)h*tO||^r-LSbI1d^&zXu^*<MDx9aESQ_(7moBF;W=^(?@0? zP6Bf~St#^%M~Kx$?ASdAk?nUT$aKA!n^2~8*DV>wQet-IqEddOFF86q+Z#u)66u-U z6$S=-5MXECI7T(}CWwZfKXK8_Y~mv`!^3{P58<12=q&JL8rSwa`!FxDf>-l^u0W71 z*XgxD%+QEBQ_~>HRIyG*XF%S8;Lzj*%p)vjS{$hdAg>iZA7na~ggj}aP+h*lvaVQ$ zSxYa>y78bk4?@p+1em^1%!7#~i&SUAD?csjzon|Nhtp0cc3L$A{p`po(@JWGh9Fb} zjFr@n=NC`|fNuqGg+DbisDW@cI1((q^y{+n1gJ36HrbXJfU|k~1+FTELRnZ22fGnS zA>9QgA{b6~#}K7~B_l~DAe%(?=04mJ=mzRcclko$q%RosCBw<C$S$wXg_TMLxCjr% zqCJ6#j|Bp#4<`D40Sy5QjAP^XL2l~DJvoGd3`YF8h2aKR<}>aeryDU|?LM4@buq~l z7vSDZ+?gXXbT~BXO^66E(^gcxK?e{qLFockYU(87@-Uv%w<*eQ#cGH`Gu;!RQ1}!S zKhopb`W(LsVy}}D@!?4B(bQOfKT^j}^&>t6Y$NEdz$c+Q8)jmt7l9^+T7eX<hRo}> zw}2IJQvKGm<x(ka80k`}oHf1LNq?%|i-1wl6;TC=q+q0gtk_}QFY2&P<5)927bmXc zcC^K`Ku~IRX`R{FfYa@8e0UxEjdc{@RLks*jb@z$avvKS;yfF=D3rl|D1$<l118(> zpI3aD;))^MppJ6jpFlq7$PTI7f*#-OQ2NY-DlFHx(U*fJ3{hiVzIKbu_Jxle3HN0s z`I*)ZFD*&QQ~)kex2<cpti5~=+)ew(6kYKg?pRtnOe?P>S_?kFiq`ae8Z|_d@`4tU zt-cbX&{7C;skl^R&;+5M^k6Zl#BrYv_aLxGm#$CG^hJFB%+UDwP*(Wj)o`r&@jbJ9 zXR_;O*3WFvhCR~NMR#X#Z~wqhPKQ;El!G$e+kC^`**!D=+Pbr|&&UoJaoZfKNG;kZ zJ0M8bOEAnugV35{V``D{a{1D3Qi15HTrR(_SY+LP*;vma99eeVw5BR2E-fR_HPjlz z15le5i~GWZ{ZVOocXYr$#R)hBY^B5`4p1Y|0-mi9R0S-@u2=kd06ego;uhxE83eZ{ zI@$2{wpZ}>&9hwd`SK%`^IByj4+QrNmQDm6O{MeMEES`z(gi2KxN=~AexO(!n4dqe zLbS6h2N=it@*3?)%wEU(4dbWe`qVPVibJ8XDzSU?r$bKT{1IHza)dvyHj1ZM@Gc%u zh!Q?ZZe3H%2`mReJZw{)-#d#I;R^T-B9I%7U1}p!W<3*o(Sdz1zvB7)%<SGh7o8KO z+{ol;S1=GlbQphkxEFc>F1jM&Y-x0ag9#~2O-*kGLzL_lfhN*Dk*+`z@jjz+cyNHk zGl|}KZNV_ci{Qv%WtZyj&lS?EowN~qdW>atEFcrJ2No7!BbH+C**m1idh<{i^$H%2 zM0<M^j{*M$^lmsXO-(Nk4-Z4H5nqn@gCW)xPmI7QEOR1-v;=H&Y$z7%3iZVLSL2Ay zo*NsR%nuLu^~K_;U+kpSfJ>e604D<d1!)hC0HS~+^WZtENh}uSAWRfJL_la@5iGT5 z3E{vz5}_A$m)NH`6N>7u9($NQ-z=r0Z#-7NLf5Y_$6`q`ZSkz~_yU%8Hv$svld&<g z%M(F1yaKarE4F#?yp~AJ4TL-I4~0g@f=K4jt}#3?XM3VcZ|}Tc12~oBj1=FEJP>uP z2|;=n0-+*s1!Svj$fCsofa1J|y92AG9bNA`o++*DKYo1wN-1-^Z~Z7(^$w<?skQ7R z)>`eaEs3iaE~*0g0jpInTDV#)A+lO0QzK39=CyXK-8lD(R!)Q4-wPj_Bk+^B6x{aJ z#5F)ofW@BFjKMtS0L%v<oB|J;&O1R6kccA&zMs&~K5P$QOU_N?G>TX-dJse%Y{d&f zV0k(&t8PF5jB?O1mZL=t(kb;}kOMF>^aJQ@MhB~dWa3G?t>tKR5@|f}9l!<p(j7<K zGTwx0tkZ&Ln#B9M{06jH2Blh5j`wQ63b_@r#PB{r0SBr8P$gI;#H-dviVy_6OF<?P zs0HqidH6lTq#qnO%tzYCb(@}rCz>Yl+w>+K$EK7}1<)6cgwk?~4vtlQPxeD3-GaOi zp@FJpe_rH;qc($-7?hSG<Czh+A=-=An&%k8e4NStQ6jMh^1Nsiv4v4KJps*N_A&Ru zo3hzAscSF#ED|XwP2FzKYT7@*lkgfX+>3Z-Nq1>i@)ue=VXO+p29b?r0EB}h6~m&Y zNdS%q7Luq4QS8EU+WS;cfZo%4rcDY29M1emE_XN)AB9+cJTg9ZXc<lfiNiUzagjjE zr_w}8=6l~29|m4OF)?`Jl1mO6M&D2l-nx9SkVE>KOgcBzN5r_I?Nr}qw7imp6w;~z zuvsD^oJ{_R7J=RkD4zsf!w7U5%rng#%=PvPU|21i6^OevC>IKaU=u2ug@)0r8C2=o zp7_Avh+&Kj4#fAYfyo<&gOVJE+fHrEvxi|}Lb+R%1rb1uumd4MXa@wXtcn*9)qOsl zG&bJV6xJ=ubKW4DN75orD?P<Bu{MaZX&4qBXB$m(b5^M>iE&E|OG~mEU598A_tWn- zAds`DmZq%LzA|>e<M0YODMwp4n_>lBg`8|BL4WL;zdH$y8=6j%K%fbCsRQgPD^6Nl zVQ7czu5FuR7yzTTJgh?;M4p5Qyo!i+jY1Ce9cZ;&p<Qa2X1XUD$H!S$s1)r<+r3z% zU|>$h<=x%An1A(V%dy}E)3VNMb+EK5FcT7iv`Xi-vwH*agkFlvtb=f}GG5XX@xb0g zfoLpA^-;aaSTu0x?7Am=Vb7o)4X0le?2v?Xg5>AP3e0lmQx5w?kb`7Q<oXQcNu!2$ z4`PkOD3+Diw`+)%wh*b=WvmU-$dUrL)_cn>7eRz?UUUVF!|-K@No%b6d?jym;PGlG zRWE)4g8$U1dYx%>Cv;CiHTP`D4k*rK9#+_UV1r|!h3I@>akLHX$#)+3%fx3Rau-1r z1sjAn92|hqRw8EDt{Jl_(pO83ve_v$U>luBP2-(DKJhmOUz5_5CnmV>okk54<s1oq zcS@DbfXC>AE`|`n5hZNh)?<l%W40~j*uF%}uE`oIW?DNpcDrP$noP`h#B@?)Mt0Uk z^ares6As@&<3(dcRDKdT31FG@7UoC#&PinBb}0xx^p%z1MZr^n!7qI}^LO4l3dGxd zckh@-B#iZb_`Hk_vuFEi7D5tv%dSHsIBn<$eQ+7AuVV_mPy-w)!I97q#XJWxl88-3 zYCHU<8+fan*fm&}6I{$OTe*53wi2CTe<9phxP;j!9%@gkc4=yiVjE<}#-`dOqh-L7 zA6i&g=?nn8vam3;r&QW=pgpJBB_>hPI4oP7D&10zK-Mv40S@%H;4}>x*F3oEHS`AP zrJ{0+#)~UzkOpWBQwZ>i5(?B&WUey|;X@@5B#u>`TSS82`4pxbg)r11;-njOcJA?H zF8RIZvAJn@cDCxi!d&x@`o<2b=`_%vXM_`rkX#+;iy|^4E!>wZpzr+q=t3&_-d_`Z zt}xQ|`fF~EjmOxpV{?20VjX3EySDdlQu7MQ&W<D}_Yf`xB|MK{gOUw5pX({@p|0!G zXBnew{zrd;4d!O<P-|pE*_cZg7O~2^2Jpb32}ojGOLrU4ZArko)hdt*rv{j>f!?#! z-tA8f^S%pf3dMOhQLpFM41Hd39HtB)LY-yA=~3!avLa+y<*4T%84nUov%-}JG#Eq5 zQ`Y|u_Q;+~FWr+woSW42R*;%bA#6=@ykBKCi@igoEn>5ooJw+*eRcD5xZk;F&!wI4 z<JQK071A+0BbRygo3k5~G4s37Q8>Ip`(2LxPu~P|D2ziC0R<b8DF|r(C$D5?v!+3t z|JjSZ+x<1F0NihXx5M;qittG3l=7}aUfae9%I-0vCq3n-j`RyeaAR#%fqu$0Zvd<p z8>T&%{-Zad%|Ev$Qv0jfth-}B-x`Q!-;0eH#`C_`@Xn6jW8jO|>Yx?UumBv=Kr<&{ zrU;&Ajsc;<u@IriK{I1|gTR_Y^e2#0>AZoN$ycy>>&oU8Uu*u}73|GT(_rb#-}#LX z9X`xnc6sx6*_+wNG3A;s!{%;<%~NB|kC~>uxJYK&t!JBn{cdQpM<{a|hzU<;2}@It zaKd^;>e8|w6mK3uU)o_!VM^DrcAv3GH%x{S2C);wOxVpv%?5R$XnX0MZ3T^F7V_x0 z4(w)2+-92K156MhP{o5_@uYA>ym*U6+-tvDn|jfHii@Vf`h|F|G_3?h^(K|%6f9Mg zePTsW7%L710GJY{nIM888mpTSVJ}P5OeXvLlgSeCHmqKbOik@u$Glu!-#0ZCDK|}A z!yRlbYhm=W&tkr{X<>RkEZSe{=?e5PuV9^{tQa8p+_f1cL@F@U=0zG)^6n|o9D(c= zvK#a^XqX&UhnImHy&J8<FaoKgUlcL!>@dy{djZ0rIb2eUL;&}Itswecnag>rreoMy z{{C*;8V_sW`d8_k_3bzJ>|eP1>gJQ3Ib6TkUiaFiXJ7ITW_3n8GFM*#E8fKT+dn=& zUosn=>0aAQbi4FY*U^W;Eqz!(T#ReA*K2P_FQQ)nSwQ!o1A*^VXSRAVh$xLPHz(-B z?1g}g5=DY^g|LDG6hQ*B1R5QSYqb~zkxSK}GE|Am#=g%VA*@8lPyy~cB4MVt^z?t( z#?(m|4RnWNGqHe3r-eT{6AO2%6Hyqac_+5`*D;IkkNPjTzvBcJX9<4H-EMXUt=QNy z7IAC;C2MQmbKD1aROCHsi{pm*()Zh)z8e@XqK6vjiyAPglMhc~tVrshW_b~Xv`Qcd zS4uAgA;b_ied=lpdf9~Vq0TII#<XpGF)b;71Fqm15dCj^2F3ksNAM$>;fQvz_HuB0 znxC*WtnHLULg|XYp5X|}M{L2sq>;(_#jYY`IYPqWpBTb4#fK}9Z6NRzF*hb!2HlWq z9d>kd;n|u=A6spuX<Dk_MgH4*REI?;UB-rdv0mamL2Fjg9w<AoQI3^_N-1_>1q>QW z;9Fs6NNt8wBi@t_$EY+$B@h)rd5(`_3k_;+1L;*%QN52%2W?3Z1T-}w+th|GDS;8~ z>uv|ozJ_B7PSbmL(0Ja@FpNLgIO@oqQBcFB-c!8}#7q>T5!*DC1eJEZsz#1_3o8z+ zpy&tM_dOPphTM5OTC8mpaflrq(K~NFTQlintF1;cK3-xR+wgj=c9V9ib_(MP*euY3 zkVeE>B4#Uvq&lMWbP8*#Tk5z-=f~(g5i3qf)uC$h(>aP)2{=GWozq^d3p&TUu3&Q8 z8L8fo#vb3DyF#7CReY$3PfcyHaUhJ296aA}@dn8%9iK;JU`P^;Q-mmspc->Fflw)c zY=uK;3{?;el|%qT;^GL}Q{^@Fl>k;e%mPX=0hD!=)k|AA!pHi-aSHsv6R=l8GZ2r% zoo))VsfkyibIBLITBWOyenB#UjlwVlL}&_q>T0{~2q)EfY@FmV?mW{}-_u*!xPqe> zM?W<0LM?dg^e>$xPj`Ze1c?pvfIH<`iuZ)0DZmBk8BqcO>;PkhKuANkN(r~pnrfZZ zYP*R}C8o}#i#TvUwi*g-U#tzVf`{ol9)@<nq7+A%_b#}qLzs+_@S5g4T7-_HV1R7L zM&K-1ObAtWZp9CXgOoccJr+v}#tkruY`CqG0tkgycfG2x4ty9Ls8vv){m(HAt9{=f zqj8LRo#SD!#Q{Dd;s>jSWABLNjV4*6Vd8^LgIUd*Mg<(3mO4_jwW4L?nvyfaS`uP5 zlB}U7#h~&P*n^{Y;75<zkmyKC7YBmRcT0c=%t9Ao*n~~!iznc$f(eISrYQ4H_Ne2K zFTwYYY?-L?JftOX6jEGp5cm)jSQR8QQOWocs}Ueu1uvCU6=X6A2S7<XJ4B4e<$R9x z9*v~0|Lp*rnM_XF$uXE3KAWxkkcIHS`8tb5$BV~~702O<#;o(2Cn9SppDgbTm?HF+ z`mZPNHG8@y*NjH9@r`IC)@yPdAMR}7yn<ReM~(DbDtX87S+y`HoLCAr#wZ49>^$VL z4ke?q?*jHHZgU|g3JE{5>B6alC@O&33Y%Z?m0|KttaP!U&_84aSUqTZC@c?#oO%bL z`JLTT6|I)K9t;Im>I`~aS=WQ3Lu==?wV~0Ay1K(dpG|)lCRMG^MoV<uinE1O$(c;b zlr_m3pUPzJs^MlSC9GcMU6UAkTfLN}P(t$s&#JFwZU{WortJstwv;KHGNP?3+TI<_ z^gPyck}?DP0INc_6hy$*LV6x2^K=Nk>lD{1v|F`Yq^Ss^+!<=!8*xb6oFZJWTpfe4 zW){0g(CvCKni*OHTRSuw)bR#yNq^v?^u*bXjYqu(f7g5SmOP%l527(n|9c7T)*#a| z`yb0pItyFvu8awgw(Yat4@+KEo$ub}4f`>lmS7jWsw{&M))jyb=B12C&Y<e>O7j(X z>%d(HDK^Mew{z&}8aNp>s3b|;Hps{I28Q(zPycfIOfWPUlpFM(OoYFZzVmqZWq4)F zZjJj#z4kV|0_zy-%v~nJEMFz@zISEd(vG3N%N=yHw(PxOE1py5tJ1u7^^gg0!TYtt zpv}pj<W@*Z)x4!y3=Rwv73>-cj`Jek27eCk3(&<qkRyAy(KVb*gL%^{YL6X$mkuE4 zY!!F`Oq{!8+P$l*LaeUd>+L_>+rN1H_+o!=n)7sLxr-#FB;WM*R%#ITzEhRzgiVT7 zy{}KVD^n9ydoac3EYC#T+n-9n=M>owhli1$#48z|h{W4pmra=Y$)VRAOm!U$C-Wxf z`1%fZrEp@-Odv&dp5#!b>+d6Azn-J~PhChh6&&_qq9bk{LPDudBix3-bwK1G<stPv zz!~T)uASFLN&!B&*lXHD%h$xh@nFP_XqDmR*#1yFK0Z7urVwbDSef65^FVcYc%w2> z?uur+{SzJtye2&6?~?Jjo;~1SCmD~R80FlAe{2MB3z1o;G(!)9+4cva4XYsO0Ae*3 z5w{AMi6oZ@lf5;|*PmyQ2;_z&)@IW-uCMxg)-ti>Orpy;RM=}KHwv(r?O>>{L$t_u z^jXFkv-rjyzYO&r>$-0A**El^fIK-JGGYW`jx1gS{v5)5dZqR{?foRZBOoHkg4Agk z{vZT79>5{ZqCQ`qhe<<>&8OiD4;k`&VO|NC=PUED>ChdWruQTGkf173075*!bO3tT zmTcMqUjQE}SCTG>_Yo=z0)2vLdLopGuwhmD0BR4_`PFhL9!nEsbVqu}gCWl%Q|%W@ z*OX=?<zkUD9mTR|0ZRK&aJ)CtO?sU)B8->WL1m@sRkQsnD~I5!L63`cU+}ntTWi|- z6tTS(PJ^2N<ULC5x4jKZY<r_Ek8l3N1<i9!TU|p_=-)L7n!{3-wIBf<F*ue!iiQT{ z4=FR^c`_HifE!nYq6}KM@*p7)4Ce~bDN`VrU?Z`b+>;3yeUpKp6%0)F8G-b2l1`ha zve{F;C1YvHDD_gALD*@;<7PV4HxTG5A#%r1uMoXMh~H7_3Jmmx(x$or_e_Pd1A}^K z3db%Sf|sdd7L$(7(2fBPi6+|JQ5y<02YI_Y$f#OjQ&iJEkOg>S#%?5&BO~MEBO@dP z^-9fed(*bHdfC*KQ^P~S1M&EQ;Lz}t8m796<#M)|&r{B?e7@K&)jd?+!r(8cpCG5a zoa{$xUe^X#tzTQ-@wj#iumQbga96z^CZ4ktySt?-CLnC`RfY%(3IOA8H)MbgRI<~R zq9c51w42;6wU(bpy^iR~AS8WPJf8FR_qIyz8B_;!S!?%VyR_=n(pm?f%;b<%0u|~y z9Q!-UgIkU|t`J`0E!vx?T8&j{_Gffj>2%00X=KOAA`Ac!V;8tCute<W^bB%-y_3&O zADJ56dX(5=6*s-(J?<|q*=EWH=p>#1=pQjIdR<*dYmo)*NMWi9i6jDCAZ8UjRw4Kz zic*CWBOO5flVxt#mf!Q9<xP8&X_nQtg_5rg1injVOW%FMG@tnH#s-s?MSY>3>G~*# zHK`&7Dd#Vu?uyBjqsQBdrKyLgb4bRkHyX?a$z{iT#$hZpo*D485wy2D1)wyt%&Nhl z>Fhv8-Q45pJ7~W(UXTy*IUC%D+%k-aI7Ov<2@04n>16?Dib7Q%LkGBKst)=m@)L^$ z36G(##q!}Hb;XsuH~99$<4=qqetU5C=uNQN{V6k7@C+XcIa9^0^3?IPXSGc88uZgg zGR<>ud)tPD*A^@)O!`S8AuX6J(_Jc<R;z&i+%9h|P^=f%yNbAGeD`70Xxtn^8YD8# zfr2LHRUwm2_^ogKxB`Z?wc6J6cpmYA4a|E_zT5dM2RMM98Z~^}N~l<KepgrgXFn{& z&_>Ab6^&o;5F7R0JT0EpU=@O|WL^~a@u0x7R8)Y~_~@vLx=O@WK*HejqrpE8etx`p zE*}J=3X3MkmSmW0%sqn46naL2%qR7gX*TO>E@ERd8#1OMdWuLBa8d$X6f|dr6;aNU zpotVh$g8aqN|4+IUk=iDJXkt7`j`o6f^AD#tI5`0*~5+hMZG3F=Q~B6a$@!=gKLL; z1-5hYv%Alv$iwhz@O0c{3Xp$aVxS+H<p+ARd4lV}-i!N%6az=(kpVHx`!C+B0(0j3 z*f?qO*po<%i1dmu?t~IL5wATJ_s5>D#pAW7WB&M4wRl45v3r|;LPMd^x?1D5)*#Bf zs>B!&tYN7IQUATVY?x*zEtP^Sj$-OUmQJXd&=jqxE=@Iz5WWcAgVZz7v8Z?jn4@i7 z3acO|k}@%NkR8}}CmKoX(7q?dlF8g)DiTQz=8{R4x`!Qq%W4AO=DX7;m^_iTj4ji8 zW4wlrX&bUyod=D3+*(kbQ|~=;v-{*``1ZIwdseP@(v-|BhNQoL-BXg%{=VdV=iw9R zDwi+ETtR<P)?>;PL)7J)Ne`7&>TBpPiD;w*-1~f>QwWp*LX|Drye&Ng$n)?8!93(h zore_jm62E<#v+P3Rir6oAP}-(g~W0Z00mSnQciG8=Zr1^i}<q7+nHIN{+ol+FbxPD zuwk+@Z{)L`i788+ILPWe=&y}8<EyJohkcrniH9<C8DA_MU6ZMvI9v3MboKWDk`V=- zVRAIzZ6kV=t<Po{MK1*V|LxAFoa%f&`&jV_PsdFA`Q&|_hwJ?y@0-7|x|&bNquHr! zZ%C*3sNHgg4e8O;z$qWR_rrrx$Y|iIMX*e``*-={>{BSk;8l#M3y3-)5ZASk1OiVY zhz5G9Tokb36=m43{m$8;vqN7VJYt6?L-vuuM{msM4}IP_SYJOf$r_QSjJ(x^{XnYu zr>1$?W%cHt05WI(;186HssTLa;lHHHIY+uDik^*-`?OJ#c_n>G;>eN1w9hr#AG2L- zfH)<YiSzX&Wa^k;&_{Ten|N*%Z%FzsMB0O}t&oPBFyZu~O7@wCEdm7Oz#x`on(80X zEb1f~Z~fOOwt}TL5;#qLHCjjN3NMlkZ!h9I(-Yv04Q9yo)E%R`$+8JCoJbI%aWnEA zU-L5-1Gni2!CrlA;@E_F?8z%5Pcr+S$aj!ytpNrN@ZesETnPsTPxfJ>H|be-YWHam z0xf}dJiz8@D&U2bs1$Ko=z-)XHx9N7;UnOkK&S&rc@4!#5vmEO9A;`kA&!k)!<2gq z=7w?=Rq0BVYL`5i%4uM%D(r+2e~Oz3gmKLGok+t%DB}7JkuEr7!A{qggd3;mf-gcU z*&PUoKz}e)ibG@vZ!UoxB++m(97Jl7u9Qe7yW#L0%!WcG_7vX!nE51L@)*%R!{3SA z<Gwz!^!khN&4O2!pDKV~f<HoOP;y~hftweik~kh+4BlLRBw|5Q!9aldB7vT0Y!ElW z&&zbGN9P{XIA|vf0M@Y>`BPKhIT1AoKTp8`n|g`52Ethz@=05{;}c1N!H^!tl+;Yy zGu<@3>2K2-=GCuj1wcZY;1_Y=w<JU@`xReHk1V7&VX1o-u1FwQ)MJ|V28(w-$t0I5 z(|efB?0U!Z+H?iQt0P-tOeCd<&_^hI<W}nkWo=!6ofln!zy~cLzZMwVsew=974gQh z31{&V_%`rsFe7P|HrlbR+9jHPR#u;woSmJ7Rb0DtW~YEwfMJRGVqs07SUauUdMf86 zmSvhMV+iB}11HiO?-T898L{|j(WZaUrpwA)EZbPiX7Q~%M=-F)tZHs<Zk|KTTe5(G zc?-q_b5zmJecBktoKn!y5UUB{5;8>22pE1s>!;X8W@24vXQwr#spft|$_8+Z$K&Is z2AzUDlW>NH$`wAKH7||>@M6l4LJc=o9IkDyUA27Y;Y}$YKY4Qheg+Bu=HWY+uUgw= z`}dzb`8a^bqxo#q;d&onOriEykt-eHZJv=<SAgO|41fe)$C9SOj0UJR3?8#=+eL^l zO+Bx{F1#Ue!Bhx`s5%oxQ}s*3rAeXNP}DEx_?8wI@hbRXwlq1oII;?6c%hsdLM)UT zPS&l}k;TEu(yC($sRFTqGE(@k4$Mnj8%d`Rfselgy+P^?gc5;o2qk>n7a-Zz1+mrr zWtcaB=5|B1s&zqa@aB~Qx9Pb*lS=JL^!Azom4p4!tk3$<P9Cj!rdF>twNuXcGwkpV zHD=v4ICweoK(7Y7LP)g`3Oo_+WCGDq=rjzjVc?hQ$6LmNqC!#RevB!s+KOXU@Ok9} z<ctjpMz6qwsi+r&Bx>Q1m{ePqZOwn5z9SGm6o`i>5H2MUzT<=8hw?W)x-?W)l*eSE zZQk|=@6VR9W+_`-dkrr=aQua-J7ERx(Udmef%5H<KMH_4sgON%iu;uQh!{<TulEj- zavA2NP%*)b6bc6q9=O&jQtT@WUz$uVur%wfqO@!D^<WV|pw=8jPzA<xs#cohqWeHj z>zFO;cB7%xUk!{>vsRZl_D;BU0p99(hZ*f<cn4y#NG7Ga3}PrqW3l{Sa1Md(E;v`0 z@bC`N8mV^n)<g0sy7jRxS#x)wwGMYhLekkbIuE4z>Tplo-J*vFKreu+L{C#J?meK1 zROXvR1(Q%EJ4s&97^E2hQ3;k8zWHEDs<rHTdM<-0mzhhiXKQltcsG<C?(UMV^}x~C zC9$J{_0R+&C&h>Rtn3tWeIN)-^J}B}RMzTapF<R}D4J__#X_=?tW&@NsL2XgQnZdX zX1q2+o|ogUN$3hzXpqp5ZbK?dn)QT3VwZ<GC^`~#!!HX#j?kp;<BQVWZEf@4PJ~*m z?4m}pnheFdfL@Ta9@xWaa`S6gFNT~Ze|2jkxt2sf&ZvGwqag{|+89d705K#Pp(GTc z&OU9ylz76NfR(YO>*qCH?>NEUY~lQ5^Dpth!X$3AGMVQ68Qh7ptbm^TOLbQBgQh*p zO+44jU4xJ#j;Smj<?<Zc_drS88e>ZJu_OUlO??}{^GLCb<pyJ$HM1DoHCA({j%l0b zQh)zC=<a?7=b7f$2lOc&DmiLT<AU}8o(V|+ukE-OjyDz|!i3}bWlHyBZEMksw1=G> zpa$s!&99@^a!!LB_@+FG32h9~s7_o6-&NH;z++HULpd_V5fjD<@kkT{(F^3V4RVrn z6rM?PAh;EP>QH`wi2@@Pmxf&HM6~PRFNgaAC#HLmFlKD5uaE68126$VSI94R;&pg* z>%obx)f_^dQi}CHEap4Bk8+&wJdh}=C#m{e6__JK0NH~)Y}=*>W{`ptQBedyg`L^j zXt%As(<cIb!{BP3-7?ARcuVhv<C2xOwA*WLA-CE!5!AEt6&KE*^U|VMrui+j0$>JH z4r4^t)E8hNQfelFkIJ=9V1!57Mq>lyxZDPZ+4X*e$ip&TufKHNV^lXWW8Zh(sG4c0 zx}$F4w3~cD^V|Aa8QLM-bYtVZwzc&Z>Z#T1PUAaZw!e9hYVWMyhZTg@B3kseKfsTN za<r$p!wc+O|9Q7x&T@%9C;Lm{3`owWjN*2{4vj{w_QW<!&}hI!y!I}I1oVLx63DK* z{j$AoVnQoB)LpAJ8r$opbB*8f@Cz1$=0Cgm#etR1x`|98%u(0@i|pQRgh;s%S+x3m zd;K7qE3hD-3}9Gc+E{AWwtr!#+KG3mbBDH|Y(yF<rieVO`dbC(1oZf}lvsW6ugEkT zc-Lm$DM@U<bKp=jblE*&I(+l<d<Aqz1XTGLXpbfBFsP6AqOFs17$ze77|E2N=Tzdl z0!U#17!06+5{N4-5dVwzVQD?U?hf7LKN7tzdc=QY*CbCS$A3l2HRYC<?IO{u3GZwv zk(os*XF}s!ShYTU+*#c~1Em@fDI<+kZDyuMQU&_SXeN=S8rGD2Xah2$7`p?%_{hc1 zidUyO;K?)AVF_U2E!6yi2w2I%u)q-mL!4!04|iOCILXiS6tXLjA~!vs^HH!iq73<p zZ=T|N0X-@%@BmAuVHQ*^q*pT6!tDESPdE?=20tcE`LSRy5D51i$_BIR89yB`a8My8 z>$q5#EQBKjS_y>w;?YN$dFm9ai5}ma2+tRgMFtTE2zh5%VLmM8d_5v9^=umXM>Bo> z1umq441kD(D&=a{kb)Qb`(SUM&SvxJ=Gp!G7Z(>b;;R~pR~f=P@AHud1e7c;n+U@~ zk{ohP*36oOUR=_mZP+Hr7QlgYj2BTbrRMO14ajV2(A|K(OM+@9VKyQuJIiqb7D7<G zPYFL=0omYPK#>gS@~Fo`Wj6jTkWt_oOlg`x|2P{rO>hzyKDUmWajR+5-Wf+gflF6| zuYl+Qyl>0*n*=SCXpa$RuG&XqTBx$^KHwjRHpfihJCe|s65SDl*2N_qj2{}JnB`Y> z+!5(cl)%-~f}|^0+N}-X)s(R3CEL)n|36xw`av@>78d5_6lGh%>?3Caz$zdLd^5ea z$E@d_+3B4qxOX|f*y4fusNT|LkWPbHUbI2lGkxRRoervYr<-YErt?-$Awv6^Lap;g zmoHOe=;^Ch0Zm|Xe;|D|+`pjEA*za|DgI!MLoci;#{2tKSSwLQ7=hUl6bONV;J_Rh z8lFZK8rPcNr^dSZEXg(c(wudLBRySVK8ZBLm@jJX@gKr`c@*#GC@`pnsbG430mFm8 z@*c5>e9iDyRp^AqX~}sT2o+Q1l(PJAtU1)RYGodXj{XXJM2e!QP=Gn_&#AMxh!D3U z3KPE&%MPT|@mLTk44L1b$@q~25y^|YlD#7%i_>zr7a3~1SZ{w%JlfZvPA70DZg`1X z8B!J^I{rW=3^60_4p8_fd^itA`bS_t0{oQD4~-&X8Dp2s>*1YmXQF+3M&kAYRYLcx zzVl@4kOw7oh=0K=79FL>nSK_yJ-L{)`}>>!=@i(f3eBH>vVXk)46;<-=oBzdBamNx zkbM?1GqUhRekkbwhp`Z~F;mg84?qBstFyO!;;X;^c!f+h&cZySl>|`#tKWG;?E257 zU-`6Q?EhQOUIA_V{{2G0&?vKbk}N3udf00dxq*MA0rN`EIXYDK@;a5&&y<Pf7~QN& z>KwTkDS4#^df&vSP8*9hb=r`vD+>5-v!SnnsR1%|?WBnUaIpNgJ<j9PP+M$luOJ;- z`v-b=xC|=WNwk<s>P=Khy=TWcdc`E&Ql%1Un#zJokTAL>b&h&Q$rT`;z(>6x?Qz69 z_cji8c?a3qR~Fq?r_D?E8pd7G5^7B){6#V)!d?Ddedmf7@PQ7FvUha%?&O{vabctF zTHY?nPEN^_b)jA*ZyMI-5tGJ=bxTeRNrXkAh!L)pD<Kd<C&3Y%QH&`TOBJb7<Uw8I z2W6RMo0LB_8!B<F)Ldhmd~xxz%N7^8w|};?p)asAxO)xJJ?e%*W)RKVGkeD=_`vvH zZ!d$va5#t$Z5agQ=t{B;cWK!yY&D$-M`VG$j<^}OARqNT+N-pO5r@jw-l)A5`p<W2 z?*(F2rb>kNlqm=BsKR#8QY!5}Ud@rq>kIRKZ+_#2oua#g!IO6;3H24_G;+0RAmdz> zT9Ia;f;i;|KtPCOqg$`G4%Jl#U;JS`)8peea_t5XYSBza4v*dZn@DKJQ##4{^^_2- zdET@2X+<i1&jn|emDv6)5k4ku=wqv`qL`eLcLMO3K+1ubPaq>j4NqpVR0;vjEy|_V zOYw1GOV%=+ZCP8jOpRJ+n&;~EntFhxwx9_e3T+LPp?9WLpfTh$hH5>(O2s~c4jBXp zfXoekiueO9^$?NPG!9CO0>hO#j3upv1dbG_s?!q3bGj#R6;+ZS$60*jP$Zus>w{ER zD3=R$d8*ue<j@GB5G()VsCS!_8GH8|;iya&Cu~!X?nAT+=f|R47M@NX0pIsVb?13{ zbT9L6>R~(G<vgz0pgPengeU5XPur{Fz-Z1YhO88{0J$LqTFOKcHi7|Bj=|I~VC9th zkescnV%MM+MUoKms?JV#t(xZO<rzQEW_h5GfqG>lQ^wQ?m3V((>*?a~<saKg(KKct zjw1cD8%9lYwd?ZXqFV*)+g62Bvv)dudGix(?N+<=8Uq0q>EFRo4G!Kyb7TdSl~_}% zD`+iT1WM-DO7=u?vJgs~LV37KHbv;T$~WcqLfTa4ziD@3Lwm>IC=hM18Zsu3X1dmi zyV^ld+9k+T+InN+e>?oClUR4b=%B^mey|pUxoQ39)4(cAfLA~`pn7+IYMLIvUjTgo zetOr@m02Fo%J13I*Z`{}%?-*F(GlDQ>0Z6GIqlM!P9lA$L1y*r6QtOA0y1{>+1Pl= z->kjlV>{qoLgPaj-dgfQ>MA&&k?59$qvV5+B!a|{&`N}_Q>=LgbEai%)REhSgaMA{ zi{UxIw2l7YJwoA{%sMv4nr(V_ob!I;&Ory}$c_Otppz|A0UX-oPatI|sYytztOV6{ zqy(@fhp|-?;RYJ`vKo;V46G|)2PSGJ@u80Wf~jO9<5;(rwU?o8j5@|15P-4QTbAFX zBPK8=JVuLFWy@{U0t#0^6JO-F_%}Bio_2dIhYV5(6zCmydO<g!vL%l+S|ykUeQk$} zcHL8d_x27A!G_5VnpEF%4<tjjDH}CYBe}5V%H1hO)40k;tKc2EMM-BzN)kZ5^NP-U zD32eq)Kugs+F;9le%aKde_x}soff+B9O4OE@i>65CO@?v3R_rE!lCs~$wp_3sKXo7 z%bhrbd<RK0YNDSJjbe@|4Pqg|C^}RTS*cS&70bCy`ui3Np@3R`l{nW6yhjK|<K~Ui zzV7C^Zr}8c?ERz7&yN1*vAg~Ly90siI#ENj-icR;8hbb#ewb8rFyDwJC@gFu)_Kd8 zq=eLdwKf9h)nVa6&__W6NQfi=eEVoUIKamk*1e!@|8nVK5T%*W+?6Y@x&rE2-y4=^ ze~i@|$L_@Xt26@X*XAcLTRzi#X8DQUTNHlM79ayKHL}7a=^T0W0K)xPUMS^Gj?Xbf ziiD!`fMbtdftC<jd=hrS$kmy1?yh4NHjv81f*vA%{d8a7bQ4kK*23X6A!?Wmifmr< zNR^h|cgu7c5*?XK4AqAcIVOFGIN+0*SL*YG$2zr0jTZ6IDO<{EN5L&QG2N79D@_|` z@+fW?^r^D)<FK^HWWrVDz5_eIttVF4<|ah}CfAyo(b0@PM3#+{1N|_C*ktjH9S(&& z;(_*v#M^l&H;vKJc!->HkV<MaPMB%5dn7+=vyvV%eBJU2-WvInqbJ%2wrq_%(c?jv zLs0o7{bZl`(k%zrAk!qXUaFCRL<?rnHR~l?L~z&uEmDKL_%JwOMM1-wWdtUDTSFTa zzrQA;E)`sJZt7hVRo)qBv-VQ0-YuQw#!J41i+2^R>BM``HT1UPzmg#0^NN}P-Q<F{ z!s|qVA*d&Y-3DI*MBZ$<%5A#2Hqecj+?t7b3I)gu9-x*S928J}XQS^(j*x{UTxHep z(?r_G1Q`#2udjetm|&m^1QvA%FspDD-Iatv;M{E~0vHKjYnWnCS~MtY4c443XmKaH z#%uv05SOGkAf~-xlD$WB3;u0WH|<ir6Wal7HAS<k{&nyzt(RD<5#67N9l{=1<N!BB zvzP7cW)`U0G|f%Rinpw*Kwhj;;~|s=GuX=DuC>=p%IPzzU8Fp1RsCvROzG+=>H%u; z#EL2Ck@~I<9=c<xfnh)+mE{JOQPr%}!HEeLZ2pI7ejpf6WXJ;T0e>KBS+(L0ZYWT; z!j(pCsP(r*=8VIAI=w=3Hr0b9!My{p(EE^KoN2pjv`cH=Z>8dCsSlmG76#6zD2E^w z9kx1gVPc5gX+#NOv;^eJEvry{C#eCT*T&e}jn46G3k%w%_88m1O#yfxki~f0BLcon zSk)DkO(e^L?idPpoS?-d-DohoCT&~ArSs4xLYsSh6YWExu$=)AYK)vB8q#jHjh`4j z**>^JcKeKw-bquD4Y<TSLp%l$7PMZ$j!V%O5Sd|w5uAgjTg$UuS#UC~hQ5;0S#M0M zW;WIxQzkNGk|zA}O=g+WMymEY#1Dp1b7T-0FW2wO2kTHYWDJi>Ai6%_95{v6pM;8J z!U5@Wb$W_Y6WNII3@FD!sSI5&LM(Mr7YLos_P@?F3Dz|WYqQh{Pf-q<QS>vZE>(b- z9o(-xq@`K-of1FSUu2n;Kvea5OL(x;l1gnj-@sh1p$+}We0fN_!o`)k!(J+>35J^% zQTP{P5~{TpXluMkdLbwI3mp+YC67jBa-tjv)O=G3X^R@+*Qe%ldj^qq3F<gf#nHYy zTo^~_Smy*EUwa_j?Ome1m>=Aeo2Q(U*URg{abA5j5m>DLC3Sw=y|bA)@3(WABc;-j z*=>(fk6%YMH(VQ!UwZ>;y$T)#st@YQhS3{`lGg`7ECp~V+o&Kob*B|a2aI0OXwk6h z^(VZMSofBO20<EN4dBf+vsP=i9NAi=P}aG{laJW!IpBhWc=|AWKU1xI64d3$9j4Tf ziurd5RrGm*))B1HFo8~1DOZ(?Mec<zhWkR42B$(vM09=RbT)fmG#vK%gV6*pEW*GJ zGWjXrs_#;w$jDoSJr{;h2(tgg;NbA^K+gb@?v3a=GmxPr1dSxBj3QAHXWcz49%~*3 ztef6?@E^bxdqFplHDWqQEUPhJRBfa7sXvOPpTUKWKR^d~_F@&M$#8^3?@Cmme6C1j zVci|=iHK||8iEaScdD;Hsl(H4txpc=ab&KDBqL$JKN-s*VQ=o~e%PR}MA3S`C!sLC z0<+6^%S?vprC8GMhhu95G1ucd@}6Iz0}$gnYEE?{IYp=^m*t^Q^yy#{qO$0)`6W*{ zVR{9Ci~}<qPz~H@YOmMc2B{;~L6FliC#xvliU!SHv|0iz%Ji-%*2)~QxPYy;8yP%S zltvQRHBILY_(KJPDu0Qi<5A<URy{`*L?*{0kk?j_CV-v=JWNa~7Gt$LWq^2A@#>M4 zBiI!Xz9{pLDfcaw4Y5E32^EWJgj?=(i}<$8N~k(nY$Oz9lEK-@#}FL4o266o9*L~S z-3T3xbDZHa=ix8{1e<V3b-!2{mjnK(X|lvg_mZlsD-sN5WpAv=k#Bgq(BIV)3HPSS z+-Q2rA6U*dpXqeOcz$dHdQ@L3{Ij9nBp*lW<Ulyqk91$j%y63G@TX)ZiS%FnF{sab zlS{0pCl(7__cSrK65|3I78|0&C{`y~3B#Ofsag#B$=6!_xzJZ3z{4LQu5lz&Ib|NW z^Uee2spbpWWN)#!vj3{9R`wT*$zIISLkCZuJa`E6W5f7HALo7FFgB%^Di@(&$Hx%= zT5=s9H?T%WJJR61z|$=ucY*HL@o+~D4c;_J@^<8<CZB9%Y_9b}$GCriWkvy<&@>MZ zXC};ZH7=XqnJ9;6$H&uwD6?*6h3B)rSS&T3%cW9Xe~u;V`5Y|6dj^IM;nfvwrr^>5 zE`K?mOp*lk?gSM?{-}R&ee~i4R|=}=fPiWT+5?wR18&6S+Og?r$dHF&mS9OKkr%VF zbXg8q!u68IBy^)lJ0#~8+LT>=OJ?uhOJ_<Yc`JU58sgnutCyA+_}$U|ff41?i+V-| z`lIcoAN6z!2xxeHShMOJs{klOQ#(e{Z9&>$A;!uH90D5+Cw-0z`KqUbFwD#eIQ2pv z0CYpRTrFG<9H3Vi`4Axdn1kh^=Bx7|D-c*T;>u|Nlv`Y`$#^3=Fn)3@oF16!h5;D@ zX{PhNBk?tJsv>P>dGaJCFXOXApZ{6LW5?qgB#V&{$V2HytmD7~uNq7b97rU))60nM zGLp^ub6ximE4}Fnrrh^yxN9=mOO0U^N%*PbKd<OqS7`3&Wpo(xS9Qe51~vknO{9j| zqMXoujZMQ`9=h0aR!-RXFimzc1R#3~x7yOf<8|~aMRyoSuPX9}dKJA!-9-}!1*fB6 zq)aXah<3EbGMR!|0DAS{ptTr2LG3}K){42o?vp3G2XjSloa60vvR1?6F|N|p5rkk% z<VN&Sz6yw$trMbzWCVQxYhXv<OHSI<gqlr#EPvZ41JP(A@v?6CdDK!YlglCQ@(Frj za6IO_eWQUyA{xczZ!&4?95I=3#}V7cvx&YlfH&3@H4e*7fCb4SiOfaD1y?)*V)sQ7 zn^SHd7;Y+aTqUU|&mYcjlJX{Ku7^J0_tka1?(=_uj)rz()E-KwL6oFYAW_;SEY5XE zTG(<B-Wb7U<lVB{%vrlMwe4rB0>VS?T%kOV?uaU$-kJA`nxLVjiQ^5kGte0wo`S%g zbe3=k4L&!4Hjs@jl?<|xLire+sIq7p8=9*i%dK<GO)}Sb<pByKa^RKTp2g=&B@h!l zl`a=Xn28t3!mx&AN5`h-OT{eKVLe+c&2M-><n1vu?wrRsf=VrbP9@7@T5A&?3a58i z(24PI{aY@uNakARVy{ZtqwB26rfevYuCuiWDM?nJK@gt4=D&E<B<(|AHuaE<g5a^$ z*MS*VcN2k*Qldpmm3a~-jsV$IgT-I~<jw&WEDF7<NZ~5`YCb<QGc)4<pl{#<{xRR} z3q}9Necv=|<|1QsA)ohuz(4pwe{tb<-<a>fea*i$-*{5Wr>Ce76mECvRK<f(@V%V! zeu6G-iK0-ELwH#`bA|+3CdsAhAZ*W^VOqT|Z7+z7E$elvPr-(&kJ_)n`+$a6Rh3XE z5<v-xxNTKd!$gK$)2oMBwp1U~rEs#_whW|M7#~OCa)DlZcSVK@Wv0mKEh2|Dh__3& zGpQXGs1up(tk;3%BHG9lezDoFD|<*+gylgtbs((ek+a$^+1X6LhoxwLD$9OiA}j-a z=9fbruR?nk?#DTIj@f`smG`q1n;Ah0RuCR52kEWrnoRwxMyln(@^`1QcpQ?BtQ|`C zbw0E0x$^A2^c3g$SN}=#!9|r|-h)jHoU`WB^LrH!=lRhfu*-@7;gc@<N$?o}M7q%e zTJ0#d8nO~cY8QQzb$=n27|GuKnpmPUh=JK|&RnwZyQ@<X#3?!bhx=adXYnih?(=u{ z%9|i9P;F{(jn#lp9iJK{<N`XOXCt$1p-9v#dLN$W6{L7T0!Fev7<Uj2216Sj+Pi0M zZO`7JVM~tWSN4zO8D=LUvVs9Dbp`=uTVk3)Rofi~VcN~s)*yp#G^}SjWBQ_P4o=k2 zUp-3h3O7Y34m806n0TydYP#;WMFp*>U92Xd3Q`{vTc$PZ4YQR4q-I$pGur--HW2Tx zag*7YIT6ScMwA?bR(U0-Sb?8Eq=nd_B@k|GDbguNr)jRm%?%60x2-m7W?V@y?OM&0 zKq}H~ed&N68C2^5!HVO<VIc0+4e)i<Ae~gEkN^^8m*^)eNm|grZ$QM6fCmnxSce1v z`xgnP;=e#-3ADV;#epF*_6MPHUZ#I$c%`a6QLO?BO}tQTqB=GlL8;N6^zBl!wq?$D zQakJ!<+Qj4D0b=}@d}SnOk%QdhTZd=$uzms3T$=OwS`P-^L)?2-<f1Jq)mZcHSrcX zABJv>mPmjQpcwF*C-Re5g3eBNcI=yacec6Q%eCfbS?S?UC2X@1x8n45<jtxGf$3ZP zbAb(?h}W{uGW+;vIyJ0P0_5<eaV0rU9rJD1wh7=J%shZN@!77kj<Pb~<k;-m^lWY4 z&vi<c&)KSFZX*Hecrs)L+Zx#XbSJeA6A;{W)-*fTZ_0UhDPk44`RiTHz2cJ{nc{d+ z<;rzTL$<ln?!I_bNI$;CGeu+hk^L)&4=c>ErMzP{lXeL3cBvB>>PPqP9UU1N-MjZ_ zyJYPILydN@@^;DUgjjF9Ow7Y5a>-Cke~Q8bD-HmU(ph1hP=afsZ=Hyq#G{Z!xw<I; zOBd_919EK6s8o!(F?ry+tkHayn_v8{iK%WrG(0^mhh|n*W`<#wwLF@qjF$P)W&TB& zEkY=W5ICm!1!TVLA1B{v5c?jDMYv&Jqm0pHk?QGykXqAmXIAJNf+;iuZtt)ncG%g1 zfqaf=`+QOb!sO|45G*a-3{e%b&{e>MDVgAwEm`uwwhRb{_=^l>sdb8X@eI<V^3ZY! zu`eNHfO%-2;5|Ln5V%heoIKUr6Fq43kQrtImQ*vdN5=B`?0L&rI}pNz4@En+8^JEv z!w-1u#<C}<1B;bPBUgMT8A(KXdXlKWC&GvPzJb1EW}vS>k;tSXJ<X3^VHlNUQXH9` z;fUJA4okVyGkBT@1AD!?P48*wS6ZJNN+wZ(KI0gA)#;ms128j%36EpQ<8HAI79du3 zY@8_a6jA8FB$VxrXz(QjJaHMYf4@W^v1@Rn<5iv4KCot3=d=0z7&Y0K^<}f?vf0EB zc})s=jb!oH2ZGe@9jd_OelCXuis)Iy6F6xYo8GTl0%d|3TE}|0$?k`ifM{T4XP#6o zMJpZKEd{WMate?hCwYvMVa6>IUs+Uy0AS^d3rNd|*$+-&ePKW6`xoYrjFg3TJbeaC z5jn!CE%TRV4;+{+<w~X8(c+0a?zp71Z*6Vg*^aZNOYXSiM3K&3$p!{te(h|%xkzxI z!Yr&JN8j}rBjtuyQA!OGjNp|(9JClBLiK41{6NwZC?AUM3JDX>?JBzq*FTNq3VJ3M z7ZJv@$Yag8rmQxQxf;1bSVY8Q2%pld?;o{C_n+4~QAe#4CoyYjbc|WiXr{m4?~kYY zvI9078(kX6_NC%NaNggaiAF8Ec@BE+_?Dk;TiZJ6_aS!_i5l5GI$RMwfG%+sI}&NO zMp08lh|xASYL_-TSBEVTbd-?1xnp1hvvV2R=!}-rNzWu8v#4s6&*CP^XaVj+K@|-Y z01w7Im`N*eiroi3Ctp!{RUNB<t!bckeJwJz!=O1UC{osTlB!ID@dX$K#a@z&iY4)Z zl~AMo>h02*-8!MM>x+WzYUZ8l=`s0RKtO16lNqw9{eXS8<>`&iF`)U(TJnNv9FXQT zD1x94fV-i2)q{?Qg43rIJ@NoN;V?rXKQ;Y-HhzMA<iz-GbF0k{eQag2E9|9uqrJ$_ zJqW~n&rv@}W?AWKe!w(;ZuU_&dU8^DY367j?s9K@s0%zK(G8%JZP3XS=inNenFyo| z2U)1!XhteS8B#+jCndF2glt76Uc+tkik}^+P(Th6n<3;rY^^}a5`CR6rZJ9W-HgCm zSY5f6%l7qR=;n+)Sp&IM$Z8CbgXwBnmC;csN7&FXf)8aQ2wf@%Yo*c|<j$jLM5WS) zkQ)Y>G3SaUE|D<K`;Q|5X55Xl23-t;=sic-@LmTAdg>P2e%)&+TOOU^;8JNGHh@oS zC=J1~>Y#$;7qc9P?J))kqX1$Z)}gRhyMW%-R7{y2P04MUiDjdEV%b=hHyc}Ui&C`h zXji@&kN?a}&=}0+jG!TW&unxeC^crFMG2o$Oa*02!bo%p^JzFV!U7C-`FS`pC|j_? z_i3mDTL<u6WPic&58#)uAtT<4nJ;Ba0(8`15<hA{ej!O533;TlBQX}*COJn&r`iV= zDe0pwO<jjY2T^EbKeYfHLm76ROdgaOL0Qlv+ART)qSe5)A$tepFvKY#5->_+B#!)l zu2~i7sv)bv2F4P~st}=SZ~$peS{ceYB|2wH7Vilgh+hRAzllj!mlCh-m{v<gU7Koa z#N&1P;+%KZLKoG$jBw8eF~K!yn>H@halQSq)y?f=De>Mk=Oo6@LdnUOq7lwa=x|1H z*i#jsf~3u`g{jq+l?I(zWY0m!Ps0fdYI8?kRR<h|0LhE!DIjCg#T2n>D7*|BGVLUm z18%J%!9C;y^jD;*J&y2E!F;i{P`dcy(t>GTVgv_+y~#l+r(6@oNcUi}7blIm8*iLr z`&EKasPQ*QmcAk7Thh@O939h8WHHYu5{j@8or^`&6lnS1G38V{Kd0ce4_w{lXy>lB zB%liN)x6S}K>V0O^e42`Gkm~8zts`~CrBW<W7bUsHfny!WX3=`C)k!CXQ9xhXC^~? z5WsZ|WSf&{mzqW{dG>N&44J={^G1#1<6tAQw&3f=yE={@GZKEYo9ML`e(6&2PDs}c zxJ8ITj4=S0h%|D{MRLG2$aCZ*!aIV519~iLo;fx9(?v=@zeq$>^Y_(Gov6ce7(x%5 zK%r5H<nxij$n5M$!P(OB<Fy*VOAD%)&9;IK!Vx6Xy%t;tWT<#PJrDu>f>?B_WJs#c z3`4x^QowEj3RB=c;+Gs@_6V+%{lPE<!{iX>Xj&Ig!D6w>=202N>H?aa=PereSFtEH zzlja&f2&8~KI&1*hF9o=lkj_Tqs1X5>FP_3u+U;AEmOS{nf_`qO5(3rPm=Y%w|VE9 z(aWbLn68Xdov;0XY42Q1|8IDYoQEs&dwWwoF_P;=i`D+jL~jbY9v4GwB-KYJ{X@mk z+<TgzHVvIuCG{c9<y&~R3y?bj>XodFy{JG0$>1i6Dme*4u_4p0Gp}GZ;1ytf1}u~T zoWdg%9fjze=`v<s1?P}g18imix@hot@U24Zx{B7QnH1IrwhS5sazyY@DBnY^IKKH2 zYc@PO8lIK-M~P|J%+8L6UyFZ~?rWGeR*#=;#Lu2RXS!q)BKdlOd<_V$=-2qwWw@Pw zMgN!Kn9fnHY$M({i}$CsvaV##85O^C9`8$wA;LKUps_9jpF00(SKhIGkJw)lIEy%D zqlVCwTfZbqT5U)ury7JISD#SG(o{GS{)g_fJsjDY?+Mf=T96=XL!mGyO)zB{M`k01 zGNE>a5pqlFoXIpoosdrv^{kG7R)I<1V;B@>3OgJ)u2a~bA=`W`WGa@DVXP|@j75uS zA;83=m{%(}C{x;SY}D(Mbp=$Q*c7{wvY>THvA~?$)V)cFVv`68@JmJCVA?<2H4@4~ z#UJP%4vhKxivFUnRPtfh=NtFS?m!$DLnB?ofz+UX+&@0)EBPkJ{mdTx>?;TK%Z*sy zQv-t^`D<kS>}!52H~7~d860@3FJ@e>54`fTgM;5<P+~X#;#)9!4z^&~i!Cz^DFn&a zFo-G)0xhJfK%Ro$86~pB3ALwQEx-T<nTF6cb!WkMcQq9()g;=JtmU8&M4^rX_E@t} zz`v~HYdWKB;sY3Scz65`lniA6QnGb_o*tNozj|>@5Z$Q$U!Ke5*qzNcO35{uXv&xg z5v<AH5!(}cR@zv%Q=xxt{-Im1f?aN6oP3Z%m%z7ZN|ot%1#w8g(^B#}>!C6Mp~bNR zCIkd96-k5+R0*<{)*ukUu3Wf@04K1Zx8m_LrbC;tn9RUN(apGMdIgBDWDNElQBZzp zOrt^Vbos<&SG6bIj%8f4J%zwPCf!pF_d3L)ZL2=2LzqG_?x&Scp(iyWJ^_Dj?gYZ) z^p{jzG%YKj-z!D+Hnh~xy3=ripz(ZudODxy-rk9VrUE&rWX{GWp+ps37jwe7dZ<zv zA5Y;kK3=IDa_VWGrTgM)11&XjI;#zhtHe5JVO&X9rTidWlP-)U(Q@RkLota-_6~qk zLU<q(oW&LNbVX&pQqH=zNjgD7BI;9jcG5cl%+WP~m4&5I?NOjTj12M7IAFiQHMAuP zJVv+!4|Px%3dDV>hzxmPwiPa6rWmgwex4*KMjgNvwHiIERwwwSPhA44Xl*btCK8$j z;)@A4(!5z=Wz<w&2~mfusIV|MB&=B}=hJ?i#He7*09{)|Gk8FqX(l23v$DqOm@_q; zz(U`V5n*dk+?q4jRFg0POo(cTNtTw?kXGH?a`V~FYB2AZ>JuA%l2I+s`O$FYQ$;}{ zDrgOp4O4!vL0mxHqRQ!0mo??{;I4~K&d)ili3d^Ti{|}w;#2UvOOZR;5AG-F94A@p z&Y3`)HbqEW%ffL^6;{(36J`Zw`g?z7!uEjvUnDgrG((2*_*AzHPlaW-yPN99>uW@( z)d3SEA5H@*ROV8O9Rx2^XsEC>7xIV^1#D2zv7CcW&If{3P^ZZJDzFKXT+Ei_NCSiy z%HA4EpL#SOIg#aBw)tm~d^{auhqKLRYjkYDB^N!4PYsDH4%cA*Vh!;dLuu=9^XmXm zd;+cZ5Fcc?REFn0OiE~qMWDPng9KP4GNX`l;A+wZFg0!(^gIb$%6f&CLsre}c})U{ zfr-%^4u4G|Tm_yhOUqWNpR?FniM`M~8|VL70;FY2O|8VvV5{1DIFtr8-?l79)A0&6 z-XatlNF%E~XlFvf<nvAMK=aJ&(;}d1Yi~MO2{?$l5HlS-j+zLFuhP+z8;Z0ZLccc8 z$c?z|ID2~ChlatZIUji*?J%DwC)6GQa+?ndgGxitLCB_Hmkbi6;MjUQ)+`VxDvLD5 zPK;M}xB14~Z?3`3Y;#9t_m0{J@M_j_skF>$XWLq|cB!rLXqR023VadGL9)gnEATua zbVWun0Gty472#i{EUpzYRIDs1n*ap30e5RmSqxxyO7P+C3S=R}3i=gHX}xZC3ZdYa z4BLfTE6*>eAxv*@u%J25Y(o+nNM*tl>eCPI!6_qKJ<d2~j+yjMw+x)G9d*lO?d;v- z2UmZ_Js*HB_G@lAjMc2)EqCMmd);yza$?&pCsh4HV?Jcc(iYhlFxpgR;CKJSEpsi* z^KMxHg}%`(`#SFNYq#-h-SYu$mOtl~!`eEVam(E}KjoI=m<V3|39A3->H8j(2Ol~4 z!0CHW$|ZT_shjWLkXN3*=g!-%I(1S$a`Kkq1M=R}4?HM0PH#MP&&~JCJ8wOGpM2ot zgYxG4Zj%q5K7G&KcRo0~do43dvx~C}hfi<3`u;obIQ5_`-8vyV@9r#n&sUE>_27dW z5A2<ryB!U@*=gVGt*7t3=H&ek+=&)cs|&Nn{GLjAexV{uTWWdOxn-|ZkDj1w?h7ud z*PBuGV@OY{V9gRp{t@k@_5hCW#a@DZlyDz8rQNLEuWhLEX#@+nQ@ahW)~D1RbpI_{ z5x<f6&1vi(L}>%14ecS^OTU!(#jWZY64y_vJ8s4kZ^M-bah~eD8}~d2_UnJr7E&Y6 z0u*KehKJRYUyY~UsojA#Qfo?h`ULj7)xF#K?eBl3YAL-v)%zgc@Bt7$bNIU*S18=| z&0G3!R=xGT5W1d3dmccG=q?FjqKcNzViA}}h^GqB!aR;Es-?TP<>4*0?8V*fx1MOd z+tv|W>KMHll)cfzOam^b&-pJyd%D9X@)RaFXJowWhxDn7A*2?g$lg)JMUHC;*2TiC zn?+a;L&iH6X9?EJC`$VfOR+S|Xd_yI!8DEav3@qd24P=11j9awbXOy+z(&~^8)rqB zp-iwz=oO~f44Z`*++g!;0SUVoArN0;RkqCbu)W~E_CqXt5qK<<9b|_Xa<8)^>?k{i zSii^F#q0#Tgk8!mV=spx<>l-Ob|t%tUCpjxuVCx!T6P_~p54H1WH+%_GK<~JZeh2w z+t^8VJG+COVt2B;*xl?Nb}ze+on{;CRqTHD0DF)<#2#jkut(Xe*<<WA?6vH1_B!@M z;FW)vy`KFDdjoqTdlQnsKf&I@-pby_ew01QevG}HZL)W;A7?+o-pQU~?_%#}?_uv{ z?_*E1pJeZ6A3&6x8v7~sA@<YkXV}lOpJPAIo?#zmA7Q`1ev$nW`zZSuJHtNCewqCW z`vm(W`xN^$dzO8M{VMx4_Ur69_F48hQ0l+Iev>`VKF_|uevAD!`y%@t_Pgx&*zdD1 zu|Hsc$j-7qVt>s3g#9V|GxopOpR*U(|7L%|zRbSD{*wI_`zmX&|HHn<zRvzH`v&_a z`xg5)`wshS_BZTr+266hXaB&?v43R$#QvH63;S30Z|vXMciDfi|78Eg{+oS|HQ9Nt z!GVEu!F}A%13bt>yo-l<H;?ch9)+n^oF{lMPx2I$q8YC9Ebrs}e1H$ah-(Nj!z9o1 z5nkY<e2kCtA}{d?KFO!}G@s$Kh`4O<dA`8Qe34i960h=QzK8Ec1m698g<k|opve#N zL;Ns*89&00@?(6JALkeI6Z{f>DZh-roUifA`4#+1eigr(U&CL)*ZH;lI(|LB0ii-} z;;-ZuznR~{Z{@e~ll*pm2S3H{<ahDA`91tzejh*0H~6dg{rmy`Ab*HI%pc*8@>lc6 z_-puU`Q!X`{D-*Bf0)0X{|J8re<Obre=~oAzlFb*zm5MWf0F+ge>>mg@8Cbqe}cc0 zKgHk0-_75{-^<^}pXNWw-_Jk5KgetRr}&5XPxGJQKg)lP|2%(&f0%!S{{sI-{!9F$ z{A2tK|2Y3;{ww?w{FD4s{L}nd{u%zO{MY!e^XK?y`R90@{|5g}{yhIY{{sIl{@eVE z{CD{8^55gX&%ea~fd3&s%m0Y~G5-_(r~J?O|KfknU*P|n{{{at{|f(0{#X2~yutqu z{~G@~|G)ej{G0q+{M-CH{IB`n@W17M$N!%H13$<Ak^d9_XZ|nzU-`fBf9K!j|H1#0 z{}=yn{ypC0=Y=Mi;6ex=g|iny5fWV@EV@NR^oXd4iMU9JUXc_jkro-Di>&Aq{bE22 zikuh{!$OL@7!d_AD#paPD2kGp5R+m`Op6&YE9QhD=EZ_2i$zfpOQI^4#U8O&>=XON zinvG|5T-aN4vE9!W#Wi9DvpU&aa>$1PKZmyrQ$O2a<L{Z7gvZY#Z}^JagBI|SQpod z>%{fq263afNxV{6;%0G+xK-RHPKw*b9paR@Q`{x)7WasI#eL$m*buK0_lpO_gW@6a zuy{l~Dqbxf6R#1k6_1P8i60WS_+jyS@gw35;*H`>;?3d-@fPt`@iy_J;z{vi;_YHn zyhHrB_zCe&@sxO%c(-_uc&~V$cv}3Vc)$37_@JnXpAsJuKP`Sn{H*vn@$=#t@nP{1 z@eAS?#V?7EijRpi;^X3%#jl7@h);@7iBF4X#b?B?ieD4IE}j#g6`zCi+i!^96wiy# zi!X@Z62C3JD1Jx$uJ}Fi`{GOgud}lZY#qn?{_fNah1(0mGs~FWVOVBn=H0Y$+f36W z6DRHMU1nxxW@ct)W@cvQ_jk^b0-b%nydT;~vMt-Pbl`tLbDx>}?A+((K0o(`xi8Lr zY3|E&Uzz*r+}Gy5KKG5eZ_a&d?%Q+UnfvbC_vXGo_k+0~&i!ca$8$fK`{~@z=6*i+ zi@9IU{c7&lbHADU?cDF?en0nzxj)YRY3|Q+f0_I1+~4N@KKGBgf6o1D?%#9&nfq^W zq2R*7QNdgg1Yr;bagYRQkOg^A1Z6NEECh?eQm`*r4)zBJf`h>!TqlkRjt!0rjt@=< zP7F>8P7W>-Tr{{?aB-Y-FBt%Z1(yjf8(c29e9#E45L_`hB{(%WEjT?mBRDfSD>yqi zCpb5_QgG$qD#2BQs|8mNt`S@_xK?oO;5xx|gX;y?C-mxu!Ht3&2R8|B8r&?nd2oy1 zmcgxpTL-rZZX4V#xP5Sk;Eutaf;$Iy3GN!)Ex3DdkDwW>1gk+SsDia%J=h4^!Fj=E z&<VDJZqN(*!TG@;sDoiJ3buot;Bc@T90~3j+$*?uaG&75!To~!2M-7y7(6I=aPW}e zp~1s~hX;=c9vM6;cy#cX;IYBug2x9>2%Z=`DR^@5l;Eks(}Jf5&j_9wJS%v1@SNbe z!SjOW2QLU-7`!NWaqyDhrNPUBmj|y1UKzY9cy;ia;I+Z)g4YLc2;LaHDR^`6mf)?y z+k&?T?+D%*yeoKj@Sfnk!TW;u2OkJN7<?%BaPX1fqru05j|ZO!J{f!}_;m1@;IqN! zg3kwE2)-D6Dfn{mmEfzv*MhGH-w3`Ld@J~N@SWhh!S{mi2R{gY82l*saqyGir@_yH zp9jAPei{5K_;v7`;J3l=g5L*!2>uxSDfn~nm*B6#--5pf{|NpW{44l(@Sotn;f2Br zhew5TVGxF46vkl^rePN5VG)+$e7F!UhD+hTa5>x`9taPHhr*-7W5Q#@<HF;^6T%b2 zlfsk3i-Z>qFBV=ryhM1(@KWKW!^?!14KEj7K5T?n2(K8P5}q2K7M>oS5uO>I6`mcQ z6P_DhDZFxcmGG+J)xxWX*9fl}UMswIc%AUN;q}7nhc^gs7~Uwnad?yPrs2)Pn}@du zZyDYyymfe+@V4RY!rO;;2=5r)DZF!dm+-FP-NL(v_XwNeO1K)f!YW(~*Tapl9iA6% zhMjOL?1sItAD$l$!a5v=qi{Ri2@i+6;gRs3;l09phxZBZ8{RLxfB1m#f#HL~2Zs*{ z9~wR^e0cbX@R8x8!bgXX2_G9iE_{6Wgz$;slfoy5PYItIJ}rED_>AzG;j_YL<Cp&2 z@Ok0$!xw}v3||z!IDAR?((q;B%fnZMuMA%mzB+tO_}cJw;p@XUgl`Pr6uvopOZe9C zZQ<L)cZBZ@-xa<)d{6k^@O|O?!w-ZX3_lcpIQ&TX(ePv8$HPyApA0`0emeY2_}TDt z;pf9IgkKE56n;7UO8C|AYvI?!Z-n0rzZHHv{7(4Y@O$C+!ykk{41W~<IQ&WY)9`2E z&%<AYzYKpB{yO|k_}lPz;qSvggntbG6#hB<OZeCDZ{gp=e}w-G{}ui_{7?Ab=t9wj zqode5C5XZ(LOV^OG|HkpDxxx)j~1fEXertkEl2yK1JS|gP;_*3Omu8?Ty%VNLUdwu zQgm{3k?5k)#iENxmxwMIT`IbCbeZU~(dDAcM~&zT(G{apqEn;OqSK=@qBEnjqO+rO zqI07wMOTil5?wXAT6Fd38qqbQYem<Nt`l81x?Xhs=myaZqZ>sxj&2g&G`d-I^XL}Q zEu&jSw~lTT-8Q;ibo=NI(H)~ZMR$(w65TbrTXgs69#Jz|iB_XlR7GpidbAO>qw}K8 zs1t2P-KZD!qw}LdR7b;T6m3U4(cx$}IuhM8x>t1X=swYXqx(hoj~);`FnUn*;OHUI zL!*a9504%ZJu-S!^yug@(PN{>MURi35Ir$^QuO5LDbZ7-r$tYXo)JAWdRFx8=sD4I zqvu7>k6sYHFnUq+;^-yOOQV-XFOOaky)t@L^y=s}(QBjEMX!(E5WO*aQ}pKOEzw(} zw?%J{-VwbsdRO%B=snSUqxVJck3JB6F#1sR;pijLN28BLACEo}eKPt~^y%m`(PyL2 zMW2tp5PdQFQuO8ME74b@uSH*vz7c&h`d0Mq=sVGOqwhuEkA4vSF#1vS<LD>RPotkj zKaYM9{WAJh^y}z1(Ql*QMZb^!5dAUwQ}pNPFVSD4zeRtK{t^8%`d9St=s(ea;|pO? zJPL=F0GHh;j^iXw<1EhOA}-_kcp+Ylm*Rc#vSi<k4-#y2bbL&FY<wIh<`d!*<CEf( z<BP->jV~5oJibJH$@o(7rQ^%QmyItMUp{WcSBS3|pAw%MpBA4UpAnxKpB0}SpF@D$ zmEtSMSBbA0UoF0Re2w^;n98mlUnjn9e7*Sk@eSe|#y5&@9N#3qX?(Nz=J74!TgJDF zZynzzzHNNF`1bJ~;ycE7itilXCBAEXxA^XC4%&=Y;?=knSMgfB9&g0$_`G;C?!;Sh zH}1v#`22Vf*YPkO#oO^td^p~XkHq(k?-k!WzE6DL_<r&I;|IhKj2{#~IDSa{(D-5T z!{bN9kBlD`KRSL){Mh($@#Ets#7~T$6hAqBO8nILY4OwJXT;BppA|nleop+{_<8a3 z;}^s)j9(PLIDSd|()eZZ%i~wXuZ&+6zdC+R{Mz_+@$2I^#BYq>6u&usOZ?XOZSmXV zcf{|E-xa?*eoy?~_<iyF;}66ij6W2AIQ~fd(fDKW$Ky}LpNu~he>(n5{Mq<(@#on< z?~C!5;xETviN6|uE&h7^jrg1Kx8iTd--*8)e=q)i{Db(1@sHvk$3KaG8viW*dHjp` zm+`OSU&p_Re;fZU{(bz1_>b|Q;y=fKiT@h^E&hA_kNBVQzv6$#|B3&bTqwD4a#S*x z1WA}g1T-f}nq*0y6iJE4=t8oXEG7Gr<z#<yAUT*EN{&vBNsdj9OO8)YNKQ;nN={BL zl3X;oSaR{?63Hc#OC^_1F2i<RmrE|6G?FVMS4>VxPEAfrPEXEA&P>iq&c=Q9+~i8h zm6NL^S52;#Ts^r)a?Rvg$+eT~B-c%@ms~%&L2|?7M#+tnn<O_)ZkF6UxkYlz<W|Y8 zliMV>O>URmKDk43$K+1Qos+vHcTMh=+&#HR(o9y8)ufeF$y&0WY$WaEyks-!BwI;0 z=_UQ-{A7^S$uJou+sRIHIN42(B==12mE1eIPjcVne#!ll2P6+n9+W&dc}Vim<YCFf zlSd?vOdgdyI(ba;*yM4^<C7;OPfVVaJUMwv^3>#M$<vc(B+pEql{`CnPV(I3dCBvW z7bGuCUX;8zc}eop<YmdrlUF3KOkS0|I(bd<+T?Y~>ytMmZ%p2lyg7MG^48>S$=j26 zB=1b#mApH7Px9X6eaZWi4<sK<K9qbo`AG87<YURllTRd{Og@!-I{8fU+2nJ{=aVla zUrfG~d^!0_^3~*P$=8!_B;QQFm3%w-PV(L4d&&2cA0$6aew6$;`APEA<Y&pxlV2pi zOn#O8I{8iV+vIo2?~^|ye@y<A{5knc^4H{V$={QIB>znQmHa#TPx9XsARs*|olAo> zOe6M8O;SRe(>yKGGM!Hs(#3Qs-Ip$>`_lvI!Sqmibb3sBY<gUJe0oB9VtP_~a(a>U zqUpubi>H@JFPUB{y>xn+^s?#Y*ay0iULn0=dP;g~dRlsVdPaI?dRBUNdQN(7dZqNr z=~dFJrdLa^o?aupW_qpk+Ua%D>!#OBub<u^y<vKz^v3B;(wn9?OK+auBE4mLtMu0C zZPMGOw@YuI-XXnXdZ+Zx>0Q#hrguy4p57yErYq@c+DfZ*EnQDH(sp`Yx|w#;t+bo= z(tdh=I!Nnun2yrzbSFKW?xsi5d#3kF@15Q!y>EKI^#17s(g&swN*|m)Bz<W5u=L^S zBhp8vk4hh%J|=x^`ndG*=@Zf?rcX+roIWLeYWlSF>FG1lXQt0epPfD@eQx@^^!e!v z(if&LN?)A5Bz<Z6vh?NYE7Dh{uS#E?z9xNb`nvS>=^N5Frf*8$oW3P}Yx=hI?ddzx zcc$-3-<`fEeQ)}{^!@1v(hsH|N<W-_B>iamvGn8VC(=)*pGrTSekT2F`nmM;=@-&3 zre8|GoPH(!YWlVG>*+VrZ>HZ$zny+3{cifb^!w=#(jTTjN`IXGB>idnv-IcbFVbJ8 zze<0d{wDox`n&Y^=^xTRrhiKRoc<;KYx=kJ@996%f2RLR|DFCP{cm=m?84bm*<2Q6 zVHRa^mSice<#|?QWj3F&BYC!z?PDLc{n>%+V0I`wIy)viHajjmK06^hF*_+cIlD-9 z(d=T`#j{Ifm&`7eT{^o=c3F%!m(Lp66|yU4r(~yQr)8&SXJlt)XJuz+=Va$*SIVxO zT_w9}cD3y4*)_6jX4lHDon0rpZg#!w`q>S#8)i4kZk*jDyJ>c_?B>}mvRh`i%5I(A zCcABRyX^Ma9kM%ScgpUZ-6gwgcDL;A**&smwvw%8t*pw{vh{2uYiH+Wn^`B@%DP!E z>u2X@gRIVm*(lr2cCy3SZgwQQXLhgb-r0S!`)2pc?w>s%dtmmU?7`VXvWI35%O0LR zB70=^sO-_%W3tC)kINpPJt2Ey_N45|*;BHoW>3qWo;@RbX7;S?+1Ycl=Vs5#o}axS zdtvsX?8VtjvX^Er%U+(nB70@_s_fO-YqHm7ughMay&-#J_NMI3*;}%=W^c>hp1mV` zXZEh_-PwDx_h#?Q-k*IS`(XB=?8DhdvX5pT%RZicBKu_asqE9)XR^;`pUXa<eIff| z_NDC0*;lf!W?##`o_!<xX7;V@+u3)r?`Gf2zMuUd`(gH@?8n(pvY%!@%YL5yBKu|b ztL)d=Z?fNJzsr7~{UQ5f_NVO6*<Z51W`E26p8X^HXZEk`-`Rh%|K=CUFPtBh&*ecL z=20H!NuK5e-RDJK=JWYNzL+oN`|{;{e|{i8m=mg#ACn)OAD17WpOBxJpOl}RUnIY1 zezE-G`6cp8=9kJZonI!uY<{`?@_8e_LVm^kl>F5EwEXn^jQq^}to-c!oc!GUO8J%Z ztK?VBua;k(RA<-Bua#drzfOML{CfHI^Bd$h%x{$6IKN4L)BI-n>F2x6E&q-#Wid ze%t(Z`R(&N<af;Pl;1hOOMch<Zu#Bwd*sc0C11^3d6lo_>-k3B&d<v?^G?2%ck^D} z&(F^Xd7TgQQNEq;<cIU!{78P!{9gIJ^ZVrY&F`1rKYu{}!2Ch^gY$>v56vHzKRka# z{>c1M`J?m4<d4lCmp?v#LjJ`3N%@oWr{qt~pO!y8e@6by{8{<4^XKHx&7YS)KYu~~ z!u&<~i}RP{FU?<;zdV0M{>uDS`K$BS<gd+Nm%l!LL;lA6P5GPix8!fl-<H2Ue@Fh# z{9XCG^Y`TM&EJ>5KmS1f!Tdw{hx3o*AI(3Oe?0$0{>l7P`KR;G<e$wymw!J0LjJ}4 zOZk`cujF6Nzm|VJ|3?1J{9F0A^Y7%}&A*p_KmS4g!~942kMp18Kh1xZ|2+Ri{>%JV z`LFZe<iE{-m;XNhL;lD7Px+tozvO?-|Cawf|407M{9pOM^Z(@kEiP1CxHzhqD}o{{ zq9QJmA}z8aC-H4r%ohvAB7q?LNGY<vI8Yoc4i!fi#}vmF#}&sHCln_ZClx0b7bz}U zT&%cwaf#xR#ifc%7ndn6TU@TVe9<VbP+YM%r8u=XtvJ0nqd2oTt2nzjr#QE`QgP+t zD#cZcs})x-u2EdGxK?rP;yT53i|ZBFFK$rWu((li<Kia8O^cfqH!p5c+_Jb;aqHqX z#chk*6}K<$P~5S&Q*r0wF2!AoyA^jY?ol+0m14DM6;-iTtQQ+ayEw1dEIP$j(JgvK zzc{}b6m>ByM#XlqQyeaKizCH7i+dIKF78v@x42(%|Kb6~1B(Y04=x^3JhXUN@$lji z#UqPH6^||+Q#`hKT=Dqg3B?nOClyaFo>Dxucv|uF;u*y=i)R(jE}m07w|HLh{Ne@0 z3yT*OFD_nEytH^(@$%vo#Vd<f6|XK{Q@pl#UGe(j4aFOaHx+L#-cr1^cw6!I;vL01 zi+2_8F5XkTw|HOi{^A402a69CA1*#pe6;vj@$upl#V3nT6`w9XQ+&4gT=Dth3&j_U zFBM-dzEXU(_*(Jx;v2;`i*FU*F1}NIxA<Q1{o)734~riaKQ4Y!{IvL4@$=#r#V?Cr z6~8WiQ~b90UGe+k55*sgKNWv2{!;w4_*?P!;vdC7i+>gWF8)*ex4ck!;qs_*t_;es zjLNu7%CyYNyex?PnJ*X0#d4|KS1y<P%LC=X@=$qnc}#h1d0csXc|v(&c~W_Dd6Dv> z<;BX2mzO9nSzfBVba|QbvgPH<%a@Jv3gs2cQ_54z)5_D!Gs-i|v&yr}bINneE0tF+ zuToyMyjpqn@*3qe%WIX_F0WHwx4d3?{qhFo4a*yqH!g2d-n6_~dGqoX<t@uwmA5W$ zQ{J|`U3vTR4&@!oJC%1X?^52iyjywq@*ZWgTq#$}R#}y6<$AeMw#)O%&9YN&mEE#e z_RI6jL0Ol>a#U`YJLTbWw>(nbv%FV%@A5w7earim_b(q%KCpaH`QY*)<wMJdl@Bi; zkynRTJI$@;5OZAEY7d9Kc%xZw44dnDtJlF)*r?m<-K^QidN}CyH>z@F&|KZDhK)gQ z)NL)#)Ea6XEb9(EG}d~9o#vqRzsw?Or>g75aHH9cs`E$9PF<`Is^+j7XxsmfnPc8R zM@@f&Dzise;Ys(;9<fI(nyaf-ci31TG`A;jv^pAec7uMqUyWZ&o9vo!*zUBd`PC-Z zG`kGTR=-oFtIc7f?l)JfY_+$xR#lCDZx~|XtcK|tXAPSx9kli4Xtf&V_S0w$+Wly~ z*=Zi$<!8`buQK~-(0A^Ny?)gVHW-xs8@*9oHC8v;Tit56vD5ChdON8#wwk;9tklO^ z+Uqtt74MT<Q&%jt%QJ@u)o?WE7S<-;wb@De`29w!s*xk4wAShM24zRCZLC)9PP@Ba zSgqb^4_7x9rz;I!d11Dpn{KsN2fZDhBkGNYooX2LwySR5?=-tinyp^1Te|XqzN=Q& z$4tFiHCB3u7u{P7dyL{>*zD|c4QqqmmTL+J%~o>|4Vt^_qi!*%)|hhDpgH8B2R)sa zo#v>!x)Ie?x9$y&v!BLr&~A3uJ5^(9y65iLT6<8XuH5SuuC&_ejap&Nv2LRO8*;3t zD`K}ER$KXMd$3B6+-0~pRc`Qoy7SWwqy9dfB8_^e>r6-Cqzg7RFv_#aMys+I)4I<9 zZFVY_^iY=JMz1$y#B!;v$@i&vyGgk*WNI|Huu*l_+ubUWWA#Rxd%HqoZBW^DdA-vc zv>GhaYOpX>ZZtc?LhH31OotUqb(P6@kT>RQG?_qEqdDLU>wE6MVDqRS4+qUQ51#Ye zt>shl5>w^IsWY|HW@@J|O`pk4hr4s5wO+zsW2I_tWvqq)58AG}Rvh$JdWgKzy4~hu zMBB~P(P*o%AIKDk3tKjfKy#~Fnyxftp%t=r89gR$T`#TmSm)eg{E`bZEu(&}Hyd?3 zOt=IZ!|SzC&8#rm%9zTHVY{wJ)qY4^tFb|ce7VL})oQOcJEb=A`3HR6T5EM<WwZjN zs1M4qdZW3?yix+wP)fEi)hxty0m{(gj248UH(K8~u%~WU%}-jln)T+?MceJcsCJ~o zQx<tCM;bcK{;=22JEQJ;&7g8_*{^z#I~$bRR<qrt=#L;9?$uJQ)V*fEVCq$!mR%jx z%;dnD>3F9JA!(d;O2(Y-TQAJ&9urGncHgka>=`!tO(vW>EDu*(In)Qr^}n^mTCVC~ zyQ+tU{Nq|~QPpv?J%HNm&M~n=B>;($fpbrRrO6Aea@*r3pPCs0scH3w!;1C6GFq5A z)~VKpm)}!w$OpEzQQsIv1NtT0r5Y?wovf_!z*GZgIo5Q{Z0pqB_s<?N=H_}GLYZ1d zZ0sy+81<K}%HvF~b~mO?UvT!uzV(7P_DAf-<+x)R3HQ{TA~oyRsNVeeJbmda%vPsH zOep2_)jDX0#-}qvQ;$?=du@x<PO2~Pxom7)`{eu8jjeXKz12Qa*+3wC%=B$ftgUj< zq2{R7<^)I|yjrNSO|+spf<8ApDig)c?cQp$)hn7J=6HEvr3vE{)|#(Cej97;4)Xxo zAhQ=jcyNV<$lR8h-xr!-t9*H-$&4H9&afxn*6HoctyERQ-=MKIS}#^$#68HB-A1TT z<NQ%?Sfwky&alxO4SVxiQqJ7vE>I*6=;B&j>Gd|<#4u@Xs$tYGwI=_zAWw(1=2)41 z7QJTw1=~k`?oQ9}id`#-%h!Uo35n$Z9$kgj>q<Es4{5g<KiQ6m8;zA_r_*3?c+|rU zcXJl=>ZTX+YLh)h5*4Bi8y>ZXQiE#pE#!?CRtD{AZ50OBSV8jG%&5aMyU3mN;)@N2 zHd%p}33W+VMhJLZTNf*%0YU|nt6hyN>(JeL8S>4lgB{yw$OK;6(>CfOBf7H?B6#d^ z6?!}vPO9xKWWPyOW?nt1!aLVRzO=6DauwD!X!7a^5mn)8`b~KPJ+$4fc3@*LuM9~N zVXNJR%4=~v-`1M-(2gFKFB~yM2x;jmtV!onv5N2D5O&mo1TR@-6&eR`8n#zA-Qm?< zXSCJL?eKcDI~<l)mUn0{jjV>dU~{Y8a_6b!wrEFc<Yp#(<Mh`4*#_f-^VSGOs~TI) z{(@EE8`WTq*^w|E2J&$dH$6`Ag;RauG+#K~7tZj7GkxJKUpU(r&hdqFeWB?^JA`8< z2_tcEW<88a*r5wH+gh1vchvI0-bOvu-xH9>L`zw={{G{Yv@kwstH)op>JRuSQ@Rsv zcKFj;zPW`QQB7*?ZKMf*v+-LkxjwXE<{>M8yQ<S^_v?0jv^&+;8?1MxOtUjSvAbP$ zpatU-Cz>bf4eQ%K;+ik4`+?YKcE*iufAl<G7+=W5uz}n1&#lTxf1?LY_lHD1(H7<J z<0;hj*Y<p&U${&3Y~Q0@y2d*%Pakd|p{<Yl{@U}s0wC%rv(~qd3$^dO-eN-g_Y_gx zpE~rDWVj*Az;!gf4n9<G_;W}8c5Z(8A*VX?(YF0v<ztUubjROGv^LcCt=W+|?C-Mc z3r7ktgFfqFr3dR<nyxfN+@hu3*JEBV%#;$Uo_UC3jdZn&kO^lMimy~`p7tR!n~o&P z1Jx01Rm5GnnzAS@5k+Ant38!{w~(TtUQ*$~H<z@8i*u(j09k-$<=SFgma?kos1YXe zGptgs(cL@3<6+w|y89NZe4qRZL@*)ri?dCm{=vNsHrV6y+#B-ATwn4mrLQ>Z?+!sG zp|Rt;S`{g!KkiLmhXEURpge!v_pmw)y|&(JW{c44UiZ)iT5PE;qiSwfyS)JefM}p< zR=$dQhlVUFSGhVE9jV%bo-u_MY9NPnF6|SrfCrlzndMfy36#RTVKn)$-R)*Q@7rK% z2-D*#By_XdE&Nfifo?#hlghuw2CO;JlCWkiY&8$NLe-MXIx?q}b6cg|wZnYdxYe#@ z{_S(WQ;*1%dI&kBRW106Q(I!7uKq^5o3?r?lC4Y0iKf{U>8sY)1-lp~49B)$4w32F zMde7F$g8QZ)G6{KFc0S~R=X9r4>F&K6->{W2BB`nnsBtbv9nQCogA@|soCx}2fLY; zRdQI+V!ty|aduRPQm^HNEn6qjuvIVfUwEq{Ps-<|M``P{(U4qOmsV_*nnv`mjolVv z$M8f@pniY1!7w4w8A+WI|Bn72hxINC(+5Pao~qY56%Y-bP^HtTS<H|EuU~t4Fn34S z5tqj0LAzDBb{z~~(PebV9YLV#w%2xrrl`C&@7qoD_SbBU>h`MdSyammV4%CIk2bg7 z#<(KFo~?w;%JPju=J>EG^}l{iLATa<ut@$jPRs2F5;&@@=?wchvsi}>G`l8Z&4FB{ z{5jgDrSnJa0Z^YPlLA@-cD12BGW9OdDB7071k+~@+AAx)?t#4>*n-{LI_g`e$cl)$ zPNS+?`}8~yR@9qJ(^Q*;;x1{)9?NcK$Ao3f%Q3nUo<NtG>u1odryvLYXqo<p!gtn| zCPi?uL2r|8s>987=x|GAkp-aza15TZEu?Hw>Z;P{JnmMR;h6IM=B?-@_+_hlWW(KB zaa0j09m)Ze1t7Yh69~AASAbww%T@=KYz}&SRp~yrHseKBo;25bO4ja*x*}^k)?!sJ zA&P@KHU^_Uj7FGC+3xm7!$x<6xZYmn5~&H^?21Cem!XcvIwyL{q5sh)6tEn(%S@Tn zWQru4ZLk$lL>1R%h${qoLw2U=qHEE20}LM69G#a10P%;t3P^Rdjyp=h%Cv?GA`1H3 z-2~tow2w%HPv^j%y3O%iTa5`XO_l9vDMU%vle|TyHFSk`&khXRTNT$-sUDEmpnX`4 zHQ=bzYl_MP*A^^ZcsNC-ag_?{)mQ_Z54NhU-je+D<je$4ZRs~#`?gRFQO2eQW^uL& zZojv|aeLo9=Jw+T;r70wvu57c9JimXD!2Ddo`H`$P;Q_5!}V5O__A_-SDA4B5EF!q ziu?y$?+oclio%7UTke2R{X&Ig77HxB4SbLAB%@et^;U!pb$dW*rK`w+W@l-p)&S?H zMXVECAQx|Ohl3YrK{v-ZF=?*%O_kkM^WYneVbyHZVlo+IT>v~P+;y(IwwmzAyvL{` zg}uZ+mPWWvCcpNesTM_q)RM}~5ibN)3HYfB`6u#(=qZU*ga?IEsONjDSi#2RXxUe% zEC>ZarHDHWYP-MG2aOo60G4jZQ>?Z-Ss&3Jum{4B^qbut5>j))P)!jdD*51HziO^- z1pFT){R+{FMU*LCqHK3wi%8S9R2HO)U1@dK>Z#TRXysy{G+8E6u+^-ko%WzpP~v&4 zIWj1hHbrz>1E&7+bj5uNe*#ZF9G{>ScY?=+?R(ROnxM2lcLq<dZEytvb#hm&#jG_| zMpj2*=%S4JMx8;NPK2U;ecnpQ5%b`HDPR+^Tmi)W)2&|XDXbB8gl6U{Tj26lE4L#m zv@B8v4MYyw0$oEeh~496_L2H57*`x()<~=sl*borSml&maAz39a({H>2rH-Gt}txb z@I<<P>ylR;8U#(h`zAG(CU8x&bL^za>(2<qf{yP7kiJensQR5<crB}7flmkL1hBSy z#Dk6A)(Vi1VMNoUI)@3hn;SZU8K`E(gaG+T1mG0ILsE-EHfYrWAE&b@|E4c5wZYRQ zOk_}6R;GNk5)`2W=5Er`J_q|xEs}ZH1g{dJ><t47PUY^HNKF2K&Rt(I;T801M@Sd! zAr_+taBAUxF<7FB+iDj%0t=Cw{fvpdQdAQMi;Q4D;IKNoLezma1EBWe#wosVsxO@8 z3#a?S8NP6)FP!BIXZylAzHqKDG#A}1CIFIe7#o;$3Lm;)vx;x~XWE^D?|Wa#-BF?N zzH!wzimu}uTctbG;Xb}*xR0+f!ul{v(+vh8xRz?c7d-B>r#{Ag{GHc)Vci$nzHpu| zZ2CgS7q)x>^Q(QMo-gpdtz~+B`-A8E!oU}pS$4WXExsa9iz|;uZZz*&+%Wrr6lu?& zyzL7+zHrzVc75SU1RZY=>ScZeF2+tXmSZykc`yJFqP;LFs!V)vPu&T|7nf#d^4)9Z zZ8TeWBLLrKH5!G9jD>m~Akyx_nRBc3+uK-4tt^1ID~dQ3!*U=gr@G(M-0$h`_l#uN zJlqBmt{10`y&{dx3nUDKbEIIws<p2tUUcI;li^Ih!jl34_~;okpQ7{)JW8s;to=`$ zX3y0oTjk|YDFbK*gs`&=gBJ~Rw6X&&9*(-*s<TL2w-!{(%R$;;R_VqWGq&e5XKH87 z)XrW|=|S1O3Xjuuh50APZEOUf)6<2zO`WX-ZmMoH&Rs1ysMyWrQt36bvh?VR(wjR& zdvay%<$!n(h!F-^9NIiEqRe|p>l#qR3cSzN2Aq^ynL*5k!(A+MHFP!~j!<Mbl~*jG zByF~Nn2wjj7Dihu12A6U%OdB+o+5d!yH6GiGS8?>j~o0)jMJum8-Q<qQp84HEoxN_ z-nGa;RWZWNrp=WoVAb+;1@b?FQ-#~j5yI>?d=&J`z=?TR<C<M0wgZZ8PRa5nB22gX zhh5$gl^aR2jmYSfo!soxY9DrGD92!!g3Sou+vzSSN`q0NjX@6OcyXt_)}G;)I~ZrN zaoZ3rs1HH|ev5IrTHVM`KkF0-0zOYzFvQ3$P8Iu2qM?X5>B(>`ViPVicp2z#9j&0{ zbejkG0hd5r+-T!tv}r<8wxTzcHJz_?M%9WLNif3gAf{q*R1;2(Rd1$_gx?eU4rV*r zQB11?&=F@nn}U6!)i%>b0BHGP{c$F6DU)q9EIp!T+*@=m#-ra6uuUry+Z5hV=oq_& z{UACcfBK4wm*E<(fs3<DJ3x&}uoOnAUQl>tqHAWG?VUD8I*flI8sB;kl?NCX9ZA7l zc|50K%-Fn5>98+j_G4!a4{=1=t_uARC55VPL_Ni*5#$F<NuW}Z>7~e1bP=R+i)$g1 zn~*!G(2ZDAh>sj#Y0OV#IpM^M<Er3yhrvW4S-8otT$vhR+K%_Ar0BV<mkZ$<gXWHW z(OpO0`|Z_kdv$&Y)*;SXW;hFk1V_Uj4t>4(*|}t1E9PyrV5`tPuVfjjX>DrYWQN;Z zH#(bJUB52Y>=x47u-A<YqFlD08Pz&>Z9>B^SPPQrdP2h*HU#CYS_vX2pSUwzkb(mm zrJhTDtBrs(s7ooUtBW0x9vkY&v`;CdmGK+|LEFVJp@+d|tM2l2#hu^`5o>&DtQ2yt z6x~7J(i@2<qV(rZ$4cQ(m!dnES_e$g#c|0U66*zh*YX(dF||B<W!*mPuB0@3XjpaK zAxg8Isy)bcYPO-7cOUMEJnr7zDto%#>G`gAdQ)9vVNu5BEH5gcJIjmm9A1f2l+R#s z5d(1DIK5aM;0=eiAQUQHg|6yET^yGh_>=YOjT0acIN_~~(6`0&O(5FIQa<i~9QEo? z0Crw4DiL9kGmT{J)$_h#1epN4bk)OcP(E(S<Tbj(%EHDZr&t|owI+_MD4TkT)L9JU zqdO}-?$8`A=}{hwl`L4SKcAL$ZdoncaR{~OQFce`5rBnt)m^tUAc8{Rz%QY&?lt6v zY#fE~K`GbZd?1H*Ply#lIMkI@ZHE<suIl}Iu7ay#0)z96h8s2x+PDj6vMyM=f+Hh& zt`jOCch~@xz<i?R_G%ly#rl9&VD5t4szpwoE7R7FK<GHIa;0Esb{&MX$Axyst|+>o z;cno%bikJv|2(})sia*7_E59L><bF5WKD?cr;Qe55~vR+Q@e~;8V?<^oY)C@Dsj=U z(~&&dT;H;XsKp6RzO}ui=(YX<YI$S3rtVag;L`3SsqNZis9{8mO|#RpadUOP#?XB# z*CI2{rkFMG7)=QHbT7R7V7eEk-TJ6HsIO%gjj)nqrxfNs>5J#$0l=Q!vqJPXX>&c} zfG0q#|19#Z0~<&zrGqVTGsd-2?*R?y%9Zw(=6-0;V^6|#0il~|(V?@eN8Kja2U>*o zwcXol53MM7#0DiZfpvUD*tQnM{i0<v<Vdr-Yj-`;76Vrblu{{7XSOSoQiYw%%MN-i zEJ13bVJ)rh!x0)Dh_t?eU<usUsgv~{^aO9=`So6BO~h6q6&*3WfXAD0U{Eh@KwyC! zRi<h55pc^H)PIi+K=ljf8I7HDe73{>oJqhuLj`Vc;HCw32mGhrZK?tTimQjH%yii7 z@@!QpV4;w64c5oyW3(0z)Nl*WhgK=ZP#FdBt*`g@R?b6=MPFjEqrBmD*xNd3w$U63 zr%2@q|MR#fmiuOp%Cj%eHtCxz&9;F<&ifXl?E4g^6f^!<osU>U&0(_;dqtz(>gi<b zL+cvn=&NUg(fSHP65n%)PmL21Vwl+WD;6v$k+cj@$#{K%gs7n#ZwdxFukeis!8&Ue zCRLp}Nxg~siPTW|0w1Sc)Myh>Cva;_K@g&r2x!d#T9PO`A}j14VGI;^29e&ya4hRO zRnZ4Vw`Qt{3h^tWZteUI^>gc!0}2Yjb@Y@7Y_H@FIG@Uil%+!(u0V7<2<)tWT$~D> zc<9K2v?G;^RDg87y16)2)`Rob;6XNg_K?Q$y~YuDQmkDw<KEqe9wr3P+~-H)PbJQ5 zt9-%symMh=3J(F&Bls?dar_d;Vz~g(3nUrAKNRn-UHr`W&&L~30<Ku?j0iPS;G*4x za<s%}3{PeTSl!3CEoPI7i@^*<Li3Ii;uRsa8LP37y!{t!9`*5Do1Ck{$D!$#DHL&W zx?RMPnM<8eBK{gOdBi`g9-@|H6RpR)#0V6`P~fhFNDkeYxQaM7h|9#@0~p2E=u3Pq z&6`k*FzPOTZ_?_QUxYg`YIgvIS;^`iZn5aX+YI(-73x+EV#Ff(2K)-9(+UKP6YmKb z;%Nmk#1mmOJfMo8YA;icu*=#y>%eMc*=5*^@sVq;Rh?8dewido;}WE6gcA&eo;!{- zTt$LVm=Y=El}M1@u--Q=jbH4jjWdthIIGxbZV8OS>(v`nG)_p@Z0T*c`Vp6XZR!IO zvLY5D!efFBgaxWd3}~vI1<3ZmjO;2j&x0AD6t>I;Ugro1Yr91109h|xU~w*}m;}sG z;jxKXWZ#~8qt}f)y%kZfuoJTOnuY$jXHPoN;WkMT6S&`oK<TA7^XQ9&$d0{k&}T_w zxWPWiEMzUq2PmiNqrTX8bUC3PQWyw-lQ#L-bxNTEPX~3glF$Ot9{I$v{nS*2cY2G7 ze%&5b8MTJUp94I3GIT!7u}Wf<47*jP&zf6{25mVaZGN^~1;yTOq7{hE0s$N$9GR@c z<FJs-O*HNIw)z$L3YH{*0+A3YK(-(e5e4+g7)f?`r0N9X<R6)hW1rHz8M2tvFmWu{ z!@S1pUVzR`Ccg9ejTmKMqXh9x2vVJCct~wb!w0<hz$1@XHyv9r6xT0ckIjlK8KOGl zhB3sz)`1xaUr~)#urZb=|ItESSy91-Jyd%c#bxh0TcT}tl^I&qVu}Dg3FA1R%w(!T zN5WW)9G_w_!cy#dgN-0OI3MWs-4Q~u_P2jeUArr_5iMO$F?h|_^aL0D(gixS4!5N^ z)#0SB=g<4^4=Z2|=jf=+X|+#8JI%GVPIc5Nr=(4h;l%|mSZNPhp>ijKk|u;r;^dBi z*D>cIGiEo2C!p^i=e<xpCzv7y2lgIQRTBo`y{66MNG9h68f7eSX?AA{f3C&a>im)o z)j8x`iWQ%n5}g34%uQ_-Ag3O?pmoLT!XILex3Jpb{4iLYYTFjQ61OqC9)Nj>TC_B& z6HX|Xl)@i38ogE4cDs3u%E}V7#J7OHPqa1@msO$0T}vct>8gkQ&$K!_ZZzKn^y)Bb z3NzgVc<m0a5|P0U>Gj@iN4<wc7jdd3n2rdXPP=G!RKGG6qV9v~LYC0_0>q@Dla7_c z`K7nn#B$s9OHEMdu!d5$u{Q7@VIE<x*;yH3YMXqt*%tX?$GdYl-DuME>Hp_Jxe~8@ z=N~HI4EV#;JQ9ylTD-)xsCtKcjy7ukOoPm((Bi+=n<F9R_P`=2qJ&Jf=xkh?X_AX^ z2${H#NcT=;)+ZVP@0kQ`#9GMRf@_f30s$Hpu8vfS7pEBKyX_TQf=gp)&>MSCxIl}4 zV0o7R`>2kYc>A-`u^w1hl@yoc2p<eB!(k6Dgo?n7c5BJPskCg5v@H1N7-2VL=$P5I zsZX)zY%^)Nv-R#%_IhY)bFexc^aP<b%}NFCeN*RhL@syWxG@{0)AZoZvqtOGg+7g& zfU0+wtUFKOx$xN8mUWF}HiqGZeSfkt5ro98sh}$BT;wFXTdm@Na0;PDrW8!t%(22= zmY_<Blo~&soS*Bn09m13+0CVl1%xOH>@hgHa>=4QiF??rEhh~;$W)ERZ0}1flUNe; zUj8|?g+Aoj{aM__Jvs2dcz~j46PPn3D8#!85wxRK9Sk!Ph*VJG)*{3g)(U}%P-<H1 z5;!eCey*xua?EVo^sJdZVzb7z>8x>Oh>fC1MBus>eHOGDF+T>7i26A1`{!?M-&o)O zz}{o}SQofr>cK8>g+5w2?nf|*NlhM=m?4WEYG8<17*`;YIOpW!`lvg(Oco@1n!8K^ z_7JtL9ukx@KyVe6%Na2R568n&Ni)GPT!PVHivTfkM%Fs^ChyzdMSmge2f5b#2t9oi zNEmWy&J=hWBMB00fY^sPFeq0?D|}6~5{9(3;8hG~8ad#7n*HeN2&QV`5o{Ba4TgzB z(*$^GG?%8^jn_}N_~$dPXE$Q%j?8GFO@Sw23BnB&a1wcClbF(G$GPb0ODvoApk+U4 zmt|EuA9aZrlb|W{VfCC+c&PfYuA>xq@)O1}GoPR`w_A_^QV&u?a4e*OsC4VV&kA zsv*ye($O<bQ^T@v=74dXnI@t1vnS~^<gTb|Sf-%o_3jo7ETsh~5cBz14^w}`{az3A z`e~!PHaz}+H44oakb9oF1x|vpAjBJ&T&YT6J)l9W@)5(vIdu*k?Laqcnt3}UrZFMV z2X_v;@@ajMbp((nC*mF6Bg8`{<;5@1;s<nUQM(>w?Hz09J1EbetB-f`|2#DHnE(4) zeO&jpzFS@M*4+?a3yhd^=K+`SCr<m#;rw}u@@QbbgutDL;L;L&7R7X!lV6_)0@tsG zh4>na)>W~{OQ~$(Wve(RzPb{5&147eG~rf4Dn#z%MJ;&%j6!*$=(C^*$M1E6gt-Ej z8|6QEfrBa<@8^b~jywgTKN_G?odtz1MHgsm%mVcxrew?m818X4#=6R@c&|`Y!9i~s z*ur~#BI4j?Q4MC>Bt&`CUz|Em$0}hn0yMT^kM67>crO?!tFM&*;=aI##Gp5>G3Msk zsZ%}?*Gnv2;@hZxjJn=&8Ptjl9jdgJ1>#`<eH94^AZFK}iO#=vjI-d{z<JUqeas&5 zQh^-t{)>Xa)k6}0s1d_;q~qzm9YNNrC3k?)?`$en_U@97cIagFcXMr1vvkkdN-KPF z40pB=i-Z0)wi-QQ-E*}~Zg;A=YuW@DHvw<hh^b*)A}*==H+EH<H2%fJqu)&Vi>?>^ zo3LDP-O;WATT2_vOCTWd3=SOFdtlH;_4I=<J{|GIPV@sx?vI+UuFs~Ic+dnBmjt<- z=#K3$*4)Oe2gr*>svrA5538VX$vub6RZiu)nN_vtw9aUK9dKx$IfPDs(W7UYratKG zxkerBTp?(ZUjdj#m&zg^cHPr7QC60w8+6_rnr@l8$;_ELXJ$H+88dT=K1RVh)?pKX zvKZi7FQ_oqo<VLE74Vj{JpHPNrdy^TV!B=LkZOy*r<M?X0m<etA7nMshiNCvHQEQZ zh3Q)yGut+GlRanaZE|<E&~0Cqn_`L}5`rKd)-6F8CT{@j4SliITlem#%8nP^DGqoN zS35(Zx@+x&uIOfjSd$?RE$_-<sVW%BwY5gw1qhoLFFpCtLo)evh5=*T$Dd;W@M?bf z0nps=ko<EqZkik&m};M>68ooGRm4}7VbW;INGJ`sp}E`|==+kIXwmA>c-N3QhdL<h zk`+Nu!LXJ0;4W4POCRng*z%zYqpb)w02#)`On%I?QIo<&Y%o)d$hn}om-H@ZA{)=! zxoes&WYl$sbS*4+g6pKvWs#WSRux_iuu>tzwPIf=R+L>)$b-UQh<#|`>TIpRo1`-F z0rKd(Kp)eSE7KPJV8`pi6Gtz9#?({`h(g^ebcWe&>s%|iTf!a*br<1Wsp`CyVGtAu zi<0$bXDz82QE)&cZbhkPL}XpmGc9_D`E|nlvAO^e;U(E68jVko>3=mK34o8ZhBrH+ z17e7V>#VMIEM=3gA#)Iep%Rx2xhKLnl87IX%P*z=?lwgW!B+*If`_+arZN`$0n=t( zvMK31YZj>4hVHBnr@qi^lfIF7G#Wg+g%a1>MTx@uf*etDPr>Kpo?vI4wXuyv8I3s7 zZC1z0c!;kfS(yYI?Y5x*C`LlSa)r#{^?ZH=83CjT&Js&9SUp%jYR*PQ2uKZUR)~FS zuHyf{x`}!JXz|<_CjfCuu*gFDu<!2B8MZVxq3dHD9dI1OO)UB1vQk!e#c#qFaM{I! z(V*kK@)_nNEG#U3r96b}SXh$Q;I$gXAufc-gn*#s*hr0M4gPyPn+g{`oV*$hdfx6O zCJ<rcnR~Wf0%fok5<IYjWMAU2*aW#Gc^1A6J|5grJhVa?@8jK-v+?NeV9X{{5bVv^ zc~R~&3|7{qAQ?i%PP8U<eUmo7`Xmew)6Mb!`><u9lWE>U5kWpASDY_4PFtF;Kv;24 zoN75^x^ku^d1(-LfiVeR9K&Ihj_N#~q~1_E1N`eEhBYI`sDJX_hP`ia;{SDmy+i4Q zd-H}%CAyW_+o}pz5^vhWOVbrSoT#phjll}|SU5FU&MdGqqf=BZ`LyD5hXyNPO)Wlo zzASW5W}qH-WkSWL1HhYutxOaayLx^?KjbFFSF=)>8D5ZdX8eXE6LIsaR&<*;6c0R5 z275`c2^b$1SwkO9CpU_BvVCr1WE=^+z-azoC)jABy5saHwABm3Cd#fsRd>C3sFk4J zY4%BZ*7R_|yz&I%Hf>&(>sScI5~?&K6}Yx7L%1+586rBBPD@6GKt+hGDuglcE{6K9 zgCCV;dz8|(=`{0g4wBS1#9JUqmu8A5vikBCh6Dm%EsWXRxI^exdv$Ry$q1D=1R|~l zGI0au%hr;4`m3SCsI-d%&=%+XuW-K7=1|G;fxTVpg1Vp%siGtXLy5^D>ON9`jZPqg z66$z_%z@R-K%~1w216n=Lyd~{n62V5rlXchdOb!n<ufaf7idR9xFvMBrL?-vw#EAp z?Rjm@7tv31*D7Jc(fOE5TNUop`a4G;AEMTJ9Y}azBL5iQ%}@-Eg0`XAHZg&SsSA83 zLQMf+$tA85IxJrq{}Rd&%Hc+4&N}k#3M-n6PHq(?Dy5argU=9+9>|Ntc(%15?2+W> z=?+O^MgopdQ5vyGk5&79jw(*^x!5roH5o8HjMaEZ*-hdpXt@*{kmaNrR%CSYHCe5a zu1=2yNLag}hO04kdi@v+kX%EEy#DIi9#>!<{jd^eB@AuVHjWQ^ztUIqtv%OKD(qfE zr-}zAb&~mt&O6VXyr$~A5c5hl5t8O$<C$@28F$0XZT2MAJnFmSGTlN6uBjr>Nn`>= zIECJarZu|<o0jN^_-CTwX28-JRC8eHDSx);_rtZ7Tud9DLKRPOdvRt+@^IEMCT%gD zY621Y(6X3_v-Lwn1fnm>GsXZYNU`{ju+RmQ)zJCK@)h{h1h|ZKeQGlIojq=^v_pqI zH99FVaV`&(Vl#6%v4yfE$#7#bMV$(bP;qL;r%9=j6R}fu!xIpAVk9v>sb|^LJ2)jQ z3B7XHiYn0G*o{WG{j=UXn9I7Mu2`=QX(h76iDVlAGr>`aNjEpBYqADNnA8AQ(L}OO ziI;Cq2rw%MQD;~!ihyTC+P=KzM05=@8s*dpqyF?!8E>DyXEKZYN}GBaKOOy?n!QM; zmhy_o!aFQfT_<t`(M7;YF;7_F#J&rz%TUD%s6lsA2qf7>p=&jfZ>#v=;^-b|?zFMv zo#e~#NjM@K_<)aG$3jjTqmKRd5CWN^m_bZ{Pmz#R(5pga0of$LB~(o-<EuE#P7Dmr zn?*eF1wih*HeF`cW)#iw6Lb3}l_TLW@=pc3SW5`j-bn+rpgzQT24zdJ%+heU7^ zN7n2oK9C411brdA-{~wf(`)j*#AhAB!W!gTIP<UnSQg)4z8IvFWI%eFxiqN(8YL54 zpz#|LU~a+X2`BW0);s0Y0lka<d><E{PXW90J_(<(WFPOh;VtAs`*J5<$a@#AY%6sv zclcA}H8LYFI^tH;lM^coVbjF5a%yA}WT_uRLOyU9?ShwToW9jEjUG|zoLf<QLo9C- z4L2Z$XMiMV4!!D@Y(-Z0PB&3cf~{&JcA91a4N-++UO2GXfGd`5!c>QvHakq&R+U;v zGAQBvn3L&8!3_@QMRlixL|{)~!Qh#rPA7qo_`D`H#=vwek-MxE!Htn)NGv*uqRu9X zycQ=#>k6MD(PWvzMvl>(F=WE95s5WAfONr#Bh}C+?DBM2hJ3%{2fj^5%ddOiNKVZ? zr|H))`}Vxivj$@&##1F;HT)w1Lea!%OTIAnrt<(2WY2RvVaJihPkL&p{K}*wGv-3o zY_gA?m;9+pgM6<rjRQ^{^=rc@CT_W`a`SVt6NFi@`f4BUJ0S=@{>amXeXhqTnvjZm zsnR_p$dpU1;Rx&#o+N0Qz74cVi^&esgNTeGs7jcZ;0OZcIQ>k9w$W@HDaH>^#rfLm zG0|6rV-AK+wuaPB+NOIswQ=sG7b?cxMDWj*&lxf{lj0RGEjQ%!Dn488sLU0un=Rf3 zR2#gmq3Q>2e1c2Q0rLft>l)YH!;mZhpzUf7JN4{9OQ&8R$0(nHJ5?Rnd3yjgba^j; zD_Q0;c9Lb>e-=+^7svKv7m+hhtXykk;v^YK5}-zM53N^oYoyWgCx?nm&Gnl*ftY<m zwf!QIsFpa#Cq`I4+ztfoOIjG2Nm^Q&_StW(nR~zFVzY0DB!v^FenwRZRFASlD&Cq| z*FpoVS+lEJQN>{EQAtUsy(VeKK!4nVBNYb$lT%4ET#VKfZ;3@S;1b*{Nv2My;6|+0 z%0W$f0h#b-5O))JstI<qwGyq3hOnhM;$JhAR%~j30X5?BXg%%XvZ=QYB)}8a*pZ_+ z{}E{k(x!wAu8I#G0a0#m>|8`gk=U6DxO<{tXi5-dGvFfevPQE+C={uWXKOm?4K>&` z%2EJ?Rd@{rC-uc{yka;K(+KD1y*c!F)ryb<U0CA6EdVzjYg)2}Bx{ERX^N=@kW81x z8c!uSKT-j&WhepigaG6MmgcHkikEav;H}sSgDnw3P?*S!zdJ9Li5*eAExR@5P9zZ0 zFpFi;Vs>*q&&rt{kQQq;aLKx|GV60muW(hR$x*iwKZVS?XAo;ryyIIvFmFqFTl0fd zErW!)E%`F-u5<f@yATr&Tq16#yPBtoT)bA91+>QJhzhpg&v8%~+LT>mS@LXT9deMg z8w?7vkazS_xWjvi5y~ST3AtvR(fE;Fkpi((N|HFTy{X9^*9$ag=MF96`cP6^xw<@1 zIjJ(vvJZeA)Er!N0_={v1U}ZxG?R$Ec&Q!^P}(EN*_NUU-&-74CSo(AYZXwH3alRo ze?G%zMqn#l3gbU&xINK&WXLC&nR2U1RlmZdsthVY_eCWh?2@3VFByI_VFO}&sE2bj zF|8Et^lM+WQ_mnpNj0>~=}LT>nN-TDggmpA{cvLu4?89X?#H;5iDRZWL3)cII~izX zKE6_W6Fs{$F@`0?h%I2MRfZbH$T0?8OVCa%cc-Cnk@!SIdlEULg$fzU2-fpL1i&O% zMB*NU9xe8q9dg)g;rT9Sh*xy!skkMfZ?>E<7I>oY6&5i0bIqPB`a=TtN&M}46;qId zGf5dF{n)Y7SsG@i_RP65o0g}~byIw4x=p7!0+wJsXdlCkn22YIcwBHv^vTYsd9}xN zmuGw49Y^zqu#ok|OlCSQ$T5Xv2oLI~V<bJq^J8_Ra2Sq>h(HmW;U+OW70Fs)ro=4Z zC!r0AcVRBw*f@yQ-NtGdEXD1|gke)oL94+ty-qK4ToNrbCw?>ffa4$ltsy;1H>u1( zeac1Eqo)uA9*?!+eBo75b}F&Mm?t{2H!RwEK;9+oKg7~Ks1iEFX=k;XN)O~6c&6Yn z5qZ2g;PI0=hN<xWJ+eLvAI>0^NcpjZ8i*ZXjvvh$C7xojJ8$eiWWuMvT5B#RCNfbv zmWDEYWR-(75d;S<z`{wx^XCag!ZlL7i%{s@_YvVAY9PW9SvRc!Kn5q*41h;%oO;y8 zX-93GZbE`dw<=-i2eDRrCX+jOIdk@%`Y29dsk$b?5$E8hYT^s*eIp2w3XfjCo$A1& zTP7t=YVz{f_7nyKwiLA$v!AO<?rUUf0i3koKq9FK6nD;eK68ybU)ATmZPLF_`s2^j zyNrcL2f<1Flu-r<fm7sXTcj(GbJ#iBk;gf#NsuXzWHBcuF85PoK~x(whn)86+$l*) zGMxk3oqTzbF8uRN<c--DeHu3d>>PWVnI<+%nOyIEQ(cqZlEox4l9T<l2Y;HA&3PPm zlDm!uU6pd3(<JP=aqE7&r`}+1qbeQa#$vj&g+1NO&vr1s=Tfb@M=PdZrkr_=Z1Mu2 z%9v&>6^vgz(u*%kC!V%yAE_J6Q9qFLfHeVM^vF>NA7f%k53Z~|xU%)&Dx>~>p2HqY z-`;xmB*!1~_#_ih@Jvq-xNQV3fKjp3p%r7i)Drt?oa$Glucs!MgCdLtFhPsP0++G` z7_uhoH&8)vP2!XlU{L2Y?CN7o(VS&xT6l}@FvdAn(ibm`wQ`d(kKR)sE9;`akW);} z^mFUg)}ohUSl?a7xK79Fc&sJ1LJ+HkGIep=gJl^sU~GPjk)ZKSV;QOg@AsJ%c@tD; z!*n8R^gs_>gJU?xc^t2Cs>^4mV^k_Q-LTBW^}N!2M67{G!%PK9ABRq<?iPpu5=-x< zj8mG}I}6T&TtDjjlw`iebD`3qNt!&Owco)}_FVp%t<ghOcC0jj!wn_|alA>0wrRIU zI3y&)ZRQAU+QfL~{dyJI5a&*qkX&yhz4ICLlo_0?i%J)h&~iU5g#wsi=Az>!IX*dC z=d_)&Bnqy?pdnfTt5LvCVlA0TnbPJ2PCXA(H_|8(y2yTd!MK80%bpRv!*T$ycpL4S zU{tc^$bZbD0`+4YpHwVOpl}d5-cxx`%V-CL30u3CabUpsYYpO}<&LShmgX9CH$g&z zC%Kzg#ctxRMeirMh~7hrGY^0yL7b%>)bh-g_zU<alA;}3#79ElwejHLORla42wTk2 zqy^9``ZDg};-4`Sx36POG{H~@*cY(6i9d6x@&7vB!>UTPChU|zCGLkKp#}YGSv9J< z?2J&YTZFAx+6qA}VQG?<$2mJlZ(^?H-3U-LXoVa`o1UPG1bwv5UDA*etS$i#l9^pU zGA2Q7l1{|(*a04u{&ploBl%`kdy?o143C<8V=Au4nIa)>YLaBCH(TQhDqwexNkeo6 zTb>AeEh$a>@t4MS1rJIa$O$Zq9n@$O_-DT!iQRfEZCF>}<USNYbQt85Da-$!MDTi7 z?-L|%GGUx^t!|UBWKzZH&VcMyBZ=ZANSr89P!Tk4+iS#Cn9IDuY?EE0GMhu&ORe~g z2gFU<zhNTMK6ud3EI;1!o?bQ0^~4w7VH$pO0=C68%?PfEU@K0cq^B%3r>pNfvdpZ- zBtdIchvM2pqEke-Jx)Kz{f{=^Q_5=_K7x;7Qy}&R3B4D6nQ3b7zP@4DV}=?vbeRgo zEbF}9bd|?0w?bU+3J_L#5{iE$+vSmz4<L0&2DnKAkU(75uqd;UVu}s70u-pL`Eg0X zj$%g**(4M|)C&(c@REyNY64OUu#^?)(fNmq*Mun$F}E(x=nT8EFYQcE(+jYrTf3K^ zNkbx`CA$z}`aKN2l}#i|@5rQcdz`sgCfGPh2J3X$pEf0VjxSaIIIgMmKki7hoADvz zg1##?a*U6edglzHwmil=DCpDpL-I7fJpDAj&7Q{B>}h;WpT<}0X~s3lI3pT@I(g~S zB<@K8^$<@$tR$=hof*)UjU<^Z-W$t?QW%@0zCgUw#B=ypx!`#Ta(21bK_i9+?6_q! zo7-JKoh6I+%gXx@Eh`Q4t#(Vx7C&w?M^y!v#*0ud8`o?yO>J7ICagUnG}gB+Zbd^J z8S~(eKBE_Hwc_GawH!!Nb5xM#n%#>)eipe%n*su_Lf4_#x}&7V06?Sw{j5R##>Wj~ z^j-+t*po;qM&B}X50p<z9R2#b<jCl5;v~(ccVgydg+`VSKLp+zl5W*GW09bioGy$e zn=$%yKALU_S!NS_y<d?6QoLlxU!6>qQrE8a!#melZQ$8KGUYf42kFrf4>^YCD!wF& z_Y%@6MV)gQH*#~s;?7l~vSSvP4&gx}X1_3#xO8p0qKF;_tf~W;AWy<b?Wh8o7M1R- z4V9fMSJ^4LAgo9z!Ff$H&YIY1&H9Xqc8q6^D}aJaOWlyW3K50zjwE+9rnaheU~hv8 zM36B>oFPh(F>#r|$yr>J&=s1BRfX#3DEPVyzL5Q-T(Kedi<mIjXjpC{ys<hlwP4yN zJ&~9&cS89myOe;6%0Cd+ZC?U^#XXKTm2{*)Dz{8q6nnFS!<}AaiHqQ!5>%`3J%9>j zdE%H1U_#IXgwpk7y@}L8%xUbBKar1v!@SXu>D162bMc1qF<{^*x<$fns`(HlSbss_ z@u{<;EqpNsy9cK%r%JzUGAvAK62ge5bGe@iEgvUs*9qcMDr(tL_Y~f0j}^mECF_k> zDOijmosI+N@x2r$A~7{pY^=wU!Qn6*AhitU^*^g&3oA_3TC^%wKDV=gJMLAG$h`Yu zx`S#*y++vje4~dOpZIjup>AIRUV*96QWb@YLt^+K-;lUb2oeZGMPbBQ0AUtrkCZ7f z05U$bhjAeyLy-?Gakw$b5fJ%YVk{OmK(?6n;C9ABn?w9LLfsB9cRS{&cD+&^A$&rN z1KT(u0Ff~v37^j}<V<8YgjAFRk>FY5W-5^|ttlr!%e#pO0(uHWW0gM9knlU)Y~y#X zKj;@j%1~(6@jh{M#@`jA81s2uydBKo-)bK@vMYNFiTM|M6$x(mP(f=j+A8HA!-Fjn zcx=H<P4l#oG<agL6`}>5CCQ%DCV-6@`@q%EH?54`Oj-7vkvt~bJ(h@UP&2N$Ib`nc z(}LE#o~6EpsMTzFJ-HL$1~u~A@K0QZ`rJykGSP3(A(GRmE5jO8dz|@?rG>5|tF4?F z*Fu=(Mx)7Yf2+-TR{>6-RtxYi$Le;|dc?Vylv9-@KBLmLM08S8xNoW|c^@ogpB~jT z5Snq#vM*?(@-mldP8(3gnZA}aZmL1HL>SbT6waD~v8U^Le5zy1`DUph^a5)T-$DAf z)PK|M!jz_-U3nD8`;v2Qk^)TPU7Zi6n_p^sC8jZ-+MET86}i1eD=uscmr!;Q4$l+! zS{paXIcPW2?1Phm(yH9sn7YkWT+-J!?A5g>PQP202E*$1PSa;d7bF>(C?=$YHXk7J zvuQ>FHIU;<JE<@a#b=MaZ37}5Tg{F=A>J?!Nzxf52``vxnlytTM%l@Q98eHfz6b9s zS|EvncvIU4LV|%%GN|Lb4((u%2bP;G2;HVZcXA*DkY<9=7NvR)!C_Uk3B+A6Jf}tI zhb9UxrWc9LO38yr9!{U+qova&*Imj@!%fG_$R!q3Nkj&6x-LRaZd+Vyo}xL-8aNIi zY_4v|cGO7qs5lT(gbuTThz$u!A<+R7w<$M9?rBD{Dr<IRSJR2`=mi%n#fIYGcNh#b z=ob?~3)l(bBN7`fk<ii&n*l@od9db+X>Z;;jhX9r=@LI1f;I1S94B;<mDvkGCd;u4 zw|fV1rqGRTa!u4rq#d3+0hax(T>g2gEap_nZ;+e0UnA0%rpoq^LeeWZ05_9pQ1%)X zK}3}++ig{7j_UhNEjd<0|Ctj;|Fu(bzmqfA^^StGF>52KRr+Gjw{S~M31B<KYtj4= z^+d@nsRhD!$qB#}I}D(1w<!{+ushjB>EHwmn4U+a=L9<JxC!vpx0>vuW+6C=Ybq36 zw0g254DccXNe<uGaen)SmR$yJJ78aBj@OzuG?GWs-C12?mWgvGp-m?8*ofkh&oTl2 z(0~s@{l!0@7a$Fth$E(Nv&|CIkJM6|?G{KViNY*)THs*HyKr2yxLesIQY*_u#}Bh# zFOR`kcxH_nLPVBVx5kH*yB#yGPR_K44RxFBedFWM5j!yPhEt|K<>rl%WqkUSayhv` zAGREyBhNbt0Qbhe$t}Sg_uf*~-bsgMH&gjfogyV7oA7IyB(~*a?6$I5kl!f_@Vv7I zI7v<=Dp&S4Dpz$+Aai{}0Rs$@{Zcg}-P;dYY0+xXL<D^?tUAfg8)ajW^7~bXm`?pw zYY*wEgp*^5mQ3JegtX+G1szBX0_UtDbRx0{WMZ4>5v#@&Myl6LKAGk75jK@t5i6i8 zVW{_Q_>0(47nV0&(HB^pX`zqV2D+MU;7byDi8Cr81pN2%N4+WXxk~k<>}Cr~`KK`2 z0WHbetR*3)TQRw|8U%!Q5R}loiV(usxqemTF@PdhQBPXg_dpM6t+C$QH`@S)u(P)b zvxxVFC900^<5W%wh{H-~u$5{|b*bbWO-T1tj&Knp89_0@=9_-kUk&#P(3v+tJH>kF z5Fx9;3Iu|8B(sewM@AH2IPss*b%%qSt2!^65~&%wF8U3-NZ?^2>Vl-#6uvBbF*_G6 zN5kFL!J_VPXT`lmE|`QJ1rp9W-k8fCZXRl=0F6}_JVN81eZd_T!?2)Rq920rw{Yr` z3D?{lG*d-7CELUP87B{S#lG1_-N8%cTdwBm%$LsuU~A!djcCHckil3B6~dHA#G=3A zU($hhS|&dqJRn5FAJFAbh=-h2Cu^gwZos{t4n(bVOWa;2m1qd{EQ!~9{Sg2IE-hPi z6ALip5oL48#s$qzVe1!V4yF>EhuLje+1`05#FEAgNSyB$ZZ?@2F(|0OuhFJ}OU(%E zW~J2>*F?>HF%_R`kH98!&J}z*=%Sdk>b`US6y;bj7~5P}l38>%)2(V9m4`)vPmyfA zwQ;nvT&Jn1CPp}++y>(se5yLCw-w@?v)()!(O`W8CAJOHqKklKDd`+_r!J&94Hv~T z4@Ksvew&DTN#6zu!Xr|=>PVK@A})GN9GM|wQ{p&UTpFiTTPF~Sbi$1svgT?ENV7!D zrPG#Ru8NKkTw6Nl^P#$jE)c(E<9W;l+C66>4<n)#lOjYw+-l}3CQ4q7CI%7kD?X%z z(E0MZq<wPjiX9PHZ)b@{y*O3YE@m2}pP2^fY-#!u{g4Wqaa*l~HGmQ#sre3}q>ud~ zq)bXnVsjuFOUeb9O$fn&_ac#dzR+rdh^6&zm+X2Z<RvBoWG{sBlE|2`l<y!=E7TdF zfoMC}QK<RZoHwSdF2k!h8R{W*6DznE4f6=-WKnIdAU1>kMcZu_a5FMDChyIpt1s0( zLS$sEB;x@@$G#!@stI4du?wgWHYJB_Oaz(yx;=SSN}VGnIpa^|LpIV<3Q9Z=vwW8b zDNN-Cgf(=E+PqL01n?e#)Qh~}WIMJFkP^50nvF*aA}n=VB@(`vy9Dj!)uo2i&y(O5 zEMn!TgMi+}rpe<2R`6fK@K_7%6o4!!3KZ_G8mS@v&$2~=<eVCjlNUQI&a6EU3ohsq zIv}0)b|SLWqq`eW);jeRUpUPbPCEs0lqJ?W!~LG+e$SaBQv-O~Iu2eY9Uy{|L@^co zLhXU`<B|d+K@0peZsCbpv84(UL?3!IOoZ1|+wAOS6u90tJD#{v;%Q`Td8^uoS*r$} zl|d3L1TXJBO+pF7b%IKUk>$w+jE9Ygj5V0W-&v3C)r6amHrbSo+evI8N){JLNjx-3 z=_I+G5$aXx))Guy+=A=U%%g4|l#Y6Av;}GlAwm6~w~&ezltf7+R^mG}H&MmOG`g(z zA&ejGE%6}GZ0N<tV0W98mE32&TZnPhi&z0BxvEsByM{|*WVk!ZGtmwT!P7N<!6cPt z8x}|oA6IS+WtFX-QIjp7PwESG+-(ka5Z+0L4l;^QADa}S;Sssal*1&=Q*6;W4&7)M zOsg6l84Y1n&%p=zTaN`E<#i+SECYGX+mBB#J_pkZL=g1&or_maktmT+Sht{uvi4;s zJRt!R^jWX&LKeXN*dAc)r6+t{ydU8$i@KC#)z`J|N)tK~C22h(93ogQD46mix*s4O z4tngX<eCVNmtY~bGyw~NI<2jRY>dHv=K8-bd|nR3+dUg#sUnFR_!e1=S?Yk>u4F1^ zj94f6XvLd?A!53sZIGr@oGa=G#f?uOKOhq^lucG$p;Qc5p0iuUHUa<>PR*2oM2jKX zF~vQ(2<1an{6|>D4ZhnFXACi}NKgXX5s?~d2q}^uv!@BQ5%*edsY)(JKsyX+aq*Hu zo%c@^Q4MHQ9jP>O0i-9PKaP$-WI8VRONvN2vUiT7F+7#@j?G)>jF21*DCpK!m!j)a zicmgR<C|h4sQ0AA;~lqm#~aU!H<NWEUaIbflD|c|l6~k$Ey8#7M{jH=1L;ES@SN_k zu!c||gEMTqr&u<+?AH~D5f93=!qi7vE2T1mQzPVw%K}&l<GI85L6oFnR1+wmZ@31@ zv-PW}$%60S3DPNs3_&i@2E2HM$hlQv0T@=qE$Dr<Co9UA7$;NG59hNi2_eW$mJ!u^ zK$(?dIkkxW#>m8^+rpJXhc%U7d6pV)@jm->$uk7J5~-Qxy$TsZCTx$%LzCQ<fG_f^ z$V(BS$DUVshHGJ?d8CSI5!5K+7a4lSZ&`YpX%L-mVM=9{A)TpnSN9>sqs&beDe7l) zA6DyJi3I=ww$+Q_;k-kyRPODquBGAg&IT(^%OpcF{AvP%V|o{{+8WTCWYu^@E|H3e zH6grSA|jhByQTb-MTj`FUa`HB3^cNRC{UB6_2@AsEYX1RTL*1o!Ht&^p~sVTg#+HE zXW2{v$s>tpF~@Oo_D=k~fv6ac^2Uw}B<QK?#~rlLp$qv3HHDTFOoLZCRIMX^JnSGQ z5S=TabfLKd@33zwDHId*TYP*~F%dU27=nIwn1bNBtxz-zcJX2cR0G?)fJ367VT2%7 z+U(f)9?jG%R84#ege55|v@}y|AQ?CSU!u|2N!x)%OcKc%0=_HCBH18)aV(5S1P3w? zmHXDn0Zqq!71-i=MGq5`I?GM0!MgPpyi`+l^ERo-B=sg=I(8fCgl+EKv)mbK3UBjq z@O2kZc-UhJw&8DVPE7zRkocnfA}-Y%<Sb`~)``qJ(K=a6;BLC*x%bQT4R}wgv1;q6 z!FF16Z_sG5w)v9SEH^@7b8E5N(N(NsurJb2_1Lh|?TP9cqdY&K!`r=Oe~t6_xHOGH zTAIWO$4eQU!cm_K&T0UH14Oj(B_xqoyEt2aurx7EnKI3u)jolUJd83N`pTpNl_LjO zEJfzT^l9q*$Z3fj1C`tX=3&OIl1IKCB4#AeA<aMwz{12*0fr6GSU$sjqAfY&V8ftN zpj4z}S!?EfIPS)(I3uDBkOvd<I=+c&F?W`BxwXW7W2c?=y)so2<roA8w?E`;=h$TC zXyLRfe&c?Qj?A)MaG?S42~}(6$91~uU`Z7HUR(>-ax3C|$v%5z=o<joxz)=T7Fh|q zHB7z|qai=A4Gb&bBbWtcfTZoftgPprVag*+9&o|?%J@h0U(CM>LJvK&Mj`?hkW&-; z;e&~Rm9R!6a-1(}awn{>r~KhH#`ZvJvKzlRHady5V2Hr+h;4`eF4zy?-r5>kbEk0i z;Rr72aSZtq#hUG>DBaef(gBkH%6pn%ZTqQ1kA$>%@wmpIJKS9m(qrPYLI6|Zw0phM z$AK%BA{$d^RCpb+O3^NKp)--Nm9!E0Am!LQK*X>RImFrZ6T3W9Y&PE<64cJ4u#>mM z0m^#Ez3j-5CYv<yAC*tODH|<_ICjvq`MpXyKH=SUe5q_P1(F(%9Tn6#te_L&O{7=h ztF(67tAsqVAs4q~xyvwb;?BB4Viwsh0v|1Ql95M%dZT_qK`K5X-Ub+ldqk)*X~EW; zn;S494C6jQ5=%lDhi78~7Rm?Yi~A<a2Zzmn%XTGjdWj9ZNtrVGaBxlCh9sgpC%Eb6 z+(TsZgHop9c&3P*9Wxx94DG4O2&}OCi!YkG%)Xr10c-`4ZeD!kr+{>Fv`C90U{-{9 z^p22h8w|-o<-9AS3vtxM8;feynd$<+KH<V(XrA(|sD9;BY+4Ng!gL$7?SV-CkaCv0 z7DYntZ9x;XrqTC|wN}I{z?Zwo^!_AqAR?ucouud#8!qS-AhR0A1jshkxgl8o-h$rZ zCkp=Ua=1W1v?gxvq@Y%^Q1@C*@!4e6TH@*0DrBGF+oP1XyN5gykF=-GQaBC>)Amfm zRYL&+Dl9$x7cWtg+O!5(T{8VI9DhjAF;U)piUX=z@15bPhQGDu@Sd}A?c;6SD z8d&Ih2c^XSsXl7s3>0ToHP#4~^xh!|E67V|H(i*BCWx&;9o5(bZpZ_=@aSACmej}j zy|5BkRG2LeqOXcR>^v}JkxBC$j9QsCizgA0UAizZb}B#UJXR13KGyH#+{VOV8$n!i z`kE8JkBBiCQ60J|B2O|xTb5=>^~$uC)VX4SEXO5q1oTCn$<tBpM;gt-ugC_K=`2*f zeL8-gIge~3;bW8d`AOS!&*wHyo%Bq_<%Cfm`tc;OML2!PS|F2_IcJhn-?zAhJ2|lD ziv9N3dY_dx`jCi7(~a5yrn5c?@EM;sX&RrEcx5)PF)YbmxDvpGu<z`QB;7pBUdWQ; zscs)3{8}j;Ko5JUj)|UBQ}tgFI=>*+Rasqv_%k7JycL2(3H4bv6m>6e!aw@Am?`{f zwy1-~#-93isM};L?%gaSLm<YhSfo{`me^20Dad@ghS<?PkIg*ASc*J=j4C_e9F8IB zTR1Tx|E~^5H8Rf@d<OEw!dEgXE`$}a;aWkjYr@|J`E%Wfb0UUlJ-WI&+)lt?pd@&C zm=3xndC1DK(4e)k$RIWKD-v3Uen+R%4SWD3JvPEZ0OV8PW2?X31|b9&@40$a+<LZM zb_lzlED+&7h<y+lLE|>mB0v@$ZbgQY5w7!WS_7Tv4G#Rz+>mGl*t2!%E!cQAKmk|z zR;#hqB@Ge8MWj<ChjCHmhy4>tLQ2|A&BlSE5#WIVYB~<Ku@Ozq>#;W~Ja~@OdYD3v z^m?I;N6!)m>1$0#03q0R0XFc-(y`MloyX2r@!uB2N)tt7Tm94FP-5xMv@bEtSLhWC zxE39&v<9Ur&Uzu?rUSBnu|9kA`d>nnl>Da7MXxsqMGfiY`d_voVEO=_F^>pp?(TLX zHRBG@Jr3K5nl?DDmJZq%X`{K7I`pi!gF}hV0M?}b*2{jWG;qFz#ES|9sD&DWCMk{w z>hUhoLHZ)uaJOIWAPZ~c|BB5Mb1${eW@3e&%Y1iJdV8Y=n-^%3<q1a2Cx((EqN-~j z%T;nk>o&;j+Kp)EjEIRhkE7C?o!s=v5&>L&{WZF3K~Qj559zFcfH9^ZX5cHU{~PCk zPil~WvdBcj1=wwHQ=8OC7^|cqn<?{jAWHUQhGJI+T#+qm-I63@!-)6a70ykj{_chT EACPQd&;S4c literal 0 HcmV?d00001 diff --git a/groups.io/webfonts/fa-sharp-solid-900.woff2 b/groups.io/webfonts/fa-sharp-solid-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..86f55d51eddb4a9a5c9fd6f4c9a491c9e89a9ce5 GIT binary patch literal 257496 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‚BGG=9dE~mOPQCeDfU{@#L1Qav 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 I7yn@Z1Jgo$SO5S3 literal 0 HcmV?d00001